XP VC++6.0
ドキュメント・ビュー構造でビュー側から(GetDocument()を利用して)ドキュメントの
変数・メソッドを触る場合、protected や private のアクセス制限では、アクセスで
きないのが、なんとも納得がいかなくて、このためにpublicにしてしまえば、なんのた
めのカプセル化なの?という感じがしてしまいます。みなさん、どうされていますでし
ょうか?
触れないという変数などは、熱血さんの自作部分でしょうか?
MFCで用意されていたものでしょうか?
Viewが必要とするメソッドをpublicにするんだから、
いいんじゃないすか?
ryoさん、επιστημη さん、レスありがとうございます。
わたしの自作の変数、メソッドです。
επιστημη さん、そうなんですか。なんか、それでいいような気がしてきました。
変数をpublicに晒すのはお勧めしかねます。
なんのためのカプセル化なの?
επιστημη さん、レスありがとうございます。
変数を直接パブリックにするのは、だめですね。
ドキュメントからみてテンプレートで結び付けられているビューを、他人のような扱い
をするのは、違和感があったのですが、ビューは、ドキュメントから独立してるような
感じになるのですね。
いつも、レスありがとうございます。
> ビューは、ドキュメントから独立してるような感じになるのですね。
逆ですね。ドキュメント(実体)をビュー(見てくれ)から独立させます。
ViewはDocumentなしには仕事できませんが、
DocumentはViewの存在を意識しません。
Document-Viewの本質的な意味がつかめてないのかな?
そうだと仮定してお話しします。
Documentオブジェクト1つに対して、複数Viewオブジェクト、この構成をとる意味
って何だか分かりますか?
例として、一般家屋の建築CADを挙げましょう。
建築CADのデータには、当たり前ですが、家一件分のデータがぎっしり書き込まれ
ています。これがDocumentで扱うデータです。
ただし、Documentだけでは、単なるデータの固まりであり、目には見えません。
目に見える形に表示するのがViewになります。
まずざっと眺めたいときには、縮小画面にして家全体を表示します。
そして、玄関の形を確認したくなったら、玄関部分を拡大して見るはずです。
この[家全体表示]と[玄関拡大表示]をその場その場で拡大/縮小を繰り返して見る
だけならば、Document-Viewの仕組みは不要です。
(1つのクラスでCADデータの扱いと表示全てを行ってしまえばよい)
しかし、このような場合、[家全体表示]を画面の隅に常に表示しておき、それとは
別に編集対象である[玄関]やら[キッチン]やらの拡大画面を表示できたら便利です
よねぇ。
それを比較的容易に実現するのがDocument-Viewの仕組みなのです。
この考え方を延長すれば、建築CADデータをデータベースサーバに保存。
クライアント側のドキュメントクラスで、データベースサーバのCADデータを読み
書きするようにすれば、複数人で同時編集可能(かつ各人の編集内容の即時反映)な
建築CADど、高度なソフトウェアが比較的簡単に作れるようになります。
逆に、Document-Viewの問題点は、考え方の前提となっている、複数Viewという環
境が必要なケースが意外と少ないということにあります。
そのような場合、無用に処理数を増やすだけとなります。
まぁ昨今のソフトウェアは、そんな些細な処理時間より実データの処理時間の方が
圧倒的に長いので、私は気にせず、何でもDocument-Viewで作っちゃってますが(笑)
Document-Viewのもうひとつの意味(目的)は
「Viewの変更がDocumentに及ぼす影響を小さくする」です。
たとえば時計を作ります。
Documentの機能は
- 時を刻む
- 現在時刻を返す
- 現在時刻を設定する
ですね。
これだけをきっちり作っておけば、
View側では
アナログだろがデジタルだろがハトだろが砂だろが
好きにいぢくりまわせます。
Documentに一切の変更を加えることなく。
bun さん、επιστημη さんありがとうございます。
Documentを独立させる。ことが大事なのですね。
このお話は、ソフトを設計するにあたってすごく参考になりました。
ありがとうございました。
>このお話は、ソフトを設計するにあたってすごく参考になりました。
MSDNでMFCチュートリアルを見ると「ドキュメント」と「ビュー」のことが
詳しく書いてあります。
参考にどうぞ
最初の話に戻ってしまいますが、
privateやprotectedを使ってアクセスに制限をかける話は
Doc-Viewアーキテクチャとは別の話なので分けて考えた方が良いです。
カプセル化の概念はC++言語の範疇ですし。
扱わせないと言うのは外部で直接扱われると内部の整合性が狂ったり、
設定してはいけない値を設定されてしまったりが出来るからですよね。
変数を直接見せないようにしてメンバー関数を通してアクセスさせる事で
無効な値をセットできないようにチェックしてはじく事ができますし、
内部の整合性を保った状態で値の更新を行う事もできるようになります。
変数を公開してしまうと言う事はノーチェックでアクセスできると言う事です。
クラスとしての安全性を考えるのであれば、カプセル化は必要な概念です。
操作するクラスが何であろうとも安全装置は必要ですよね。