~スマートフォン用の表示で見るぐるぐる~この広告は、90日以上更新していないブログに表示しています。2009-02-01カプセル化、情報隠蔽、データ隠蔽OOPあちこちのサイトを見てると、間違った解釈をしてるのが多い。カプセル化なんて、情報隠蔽まで含んでるのが常識になりつつあるような。ここまで一般化してると情報隠蔽してるのがカプセル化というのが常識なのかも。−カプセル化と情報隠蔽、データ隠蔽の違いがよくわからくなったので、手持ちの本で調べてみた。基準としては、カプセル化、情報隠蔽、データ隠蔽の関係カプセル化は隠蔽を含んでいるかどうか対象はクラスのみか、そうでないかなどなど。「みんな自由に言葉を使ってるんだな」カプセル化、情報隠蔽、データ隠蔽の関係は、みんな同じとするものもあれば全部違うものとするもののあるし、中間もある。カプセル化は隠蔽を含んでいるかどうかは、ほとんどが含んでいるとしているけど、含んでいないとするものもある。対象はクラスだけとするものもあるけど、そうでないものもある。ことで、結論らしい結論は出せないな。みんな好きに使えばいいと思うよ。番目に関しては、多数派に乗っかってカプセル化は隠蔽も含む、としておいたほうが無難かも。以下、カプセル化、情報隠蔽、データ隠蔽の何れかが載っていた本の引用。冊分くらいあるので注意。オブジェクト指向における再利用のためのデザインパターン要求はオブジェクトに対してオペレーションを実行させる唯一の方法であり、また、オペレーションはオブジェクトの内部データを変更する唯一の方法である。これらの制約により、オブジェクトの内部状態はカプセル化されているという。オブジェクトの内部状態には外から直接アクセスすることはできず、さらにその表現形態も外からは見えない仕組みになっている。フィールドのことだろうけど、表現形態ってのはよくわからない。外からは見えないってことは、中からは見えるんだろうけど・・・カプセル化オブジェクトの表現や実装を隠ぺいすること。オブジェクトの表現をそのオブジェクトの外部から直接的に見たりアクセスしたりすることはできない。オペレーションがオブジェクトの表現にアクセスしたり修正したりする唯一の方法である。(P.384)オブジェクトの表現や実装を隠蔽するってことは、フィールドの隠蔽だけではない、と解釈していいのかな。年代のアプローチには従っていません。このアプローチでは、カプセル化というものが「データ隠蔽」として、そしてオブジェクトというものが「データ、および、それに対するアクセスや操作のために用いられる振る舞いを備えた物体」として定義されてしまうのです。これは、オブジェクトの実装方法のみに焦点を当てた、窮屈で狭いものの見方です。(P.1)カプセル化は、しばしば単純なデータ隠蔽として解説されています。カプセル化はデータ隠蔽と同じものではありません。実は、カプセル化とはあらゆる種類の隠蔽を含んでいるのです。先の例では、講師はどの学生が学部生であるか、また大学院生であるかを意識する必要がありませんでした。隠蔽を指していると捉えるべきです。あらゆる種類の隠蔽を指します。オブジェクトはそのデータをカプセル化します。抽象クラスはそこから派生された具象クラスをカプセル化します。(P.25)カプセル化とは、「あらゆるものを隠蔽すること」であると考えるべきです。言い換えれば、データを隠蔽することも可能です。以下のものを隠蔽することもできるのです。よって生み出されます。カプセル化について言及している場合、そのほとんどは型のカプセル化を意味します。(P.106-108)あえて説明はいりませんね。引用部分だけで理解できるでしょう。いう概念をカプセル化することで、システムの論理的な内部構造とシステムに接続するデバイスの詳細を切り離すことができたのだ。エクスポートを示す表記を使って取り扱うことができる。(P.361)第2版ではP.355概念をカプセル化、と言っていることから、オブジェクト指向のこころと同じような使い方をしているのかな。(encapsulation)ある構造の中に情報を隠すテクニック、たとえばクラスの中にインスタンスデータを隠す手法を指す。利用者が、その部品をどう初期化してアクセスしたらよいかだけを知っていて、細かい実装については知る必要がないという原則。ソフトウェアシステムの構成要素間の相互接続を減らすでの、情報隠蔽は高信頼ソフトウェアの開発に役立つ。hiding)特定のサービスを提供するためにオブジェクトにどんなデータ値が収められているか、という実装上の細部を抽象化するためのカプセル化手法。誤字は置いとくとして、データ隠蔽をカプセルの一手法と位置付けているのはオブジェクト指向のこころと同じ。情報隠蔽にも言及していて、カプセル化をテクニック、情報隠蔽を原則としている。情報隠蔽という原則があって、それを実現するためにカプセル化があって、さらに実装上の細部を抽象化するためにデータ隠蔽がある、という階層をなしている。してカプセル化するというものだ。(P.51)仕様パターンは、同じようにクエリーのために使えるが、クエリーオブジェクトが汎用的なオブジェクトを使ってひとつずつ検索基準を設定していくのに対し、オブジェクトはドメインの知識をカプセル化し、意図を伝えるというコンセプトで使われる。・・・この場合、検索基準は外からはわからない。内容がよくわかるような名前のつけられたクラスが基準をカプセル化するのである。(P.63)ステートをクラスとしてカプセル化する、ドメインの知識をカプセル化する、と言っていることから、オブジェクト指向のこころに近い感じ。内容がよくわかるような名前のつけられたクラスが検索基準をカプセル化する、というのはなかなかいいな。処理を名前でカプセル化する、ってところか。プログラミングにおけるカプセル化も全く同じ意味を持つ。クラスの内部実装を保護するために、インターフェースで包んで隠蔽するわけだ。外部からはインターフェースしか見えない。・・・カプセル化は、オブジェクト指向プログラミングの最重要概念である。カプセル化の特殊な場合を提供するという意味から重要である。カプセル化はほとんど常にデータ隠蔽を意味する。派生クラスによって提供される実装から完全に分離する。テンプレートによるコンパイル時ポリモルフィズムは、インターフェースを実装から完全に分離する。必要な操作を持つクラスは、継承やその他の関係がなくても自由に交換して利用できる。カプセル化が常にデータ隠蔽を意味するわけではないが、データ隠蔽は常にカプセル化の一種である。カプセル化が常にポリモルフィズムを意味するわけではないが、ポリモルフィズムは常にカプセル化の一種である。(P.120-122)これもオブジェクト指向のこころとほとんど同じですね。有効なものとなります。型の安全性を持ったファースト・クラス・オブジェクトとしてカプセル化したものです。その他の汎用のファンクタといったものを受け付けます。任意の処理の起動がカプセル化できます。(P.105)これも何でもカプセル化ですね。クラスをカプセル化するとはどういうことかを示すよい例である。カプセル化されていることが多い。オブジェクトの構築は、何度も出現したり、複雑であったり、エラーを起こしやすかったりすることが多いからである。コードとを切り離すことである。(P.101)これも何でもカプセル化と呼んでいるようですね。デザインパターンは、あるクラスのインスタンスの管理を、別個のマネージャオブジェクトの中にカプセル化する。オブジェクト指向インタフェースの中にカプセル化する。(p.194)変化するコードを安定なコードから分離する。理想的には、変化するコードは可能であれば必ずオブジェクトにカプセル化するべきだ。オブジェクトは個別のメソッドよりも再利用しやすいからだ。コードがカプセル化されれば、サブクラスを作ってメソッドを書かなくても、所望のオブジェクトの合成でバリエーションを作れる。デザインパターンの多くは様々な種類の変更をカプセル化する。表19-1は、フレームワークの異なる場所がアプリケーションによって変化するときに利用可能なデザインパターンを示す[Gamma+95]。(P.454-455)コンポーネントライブラリ中で、独立に変化するであろう複数の振る舞いをカプセル化しているクラスがあったら、それらを片っ端から、それぞれの振る舞いをカプセル化するクラスに分割する。(P.457)これまたいろいろなものをカプセル化しており、オブジェクト指向のこころと同じような扱いのようだ。―アジャイルとオブジェクト指向によるソフトウェアイノベーションカプセル化とは「データ、実装、クラス、設計、実体化の隠蔽」であると理解することと、カプセル化を適切に実現するコードを設計することは、まったく別のことなのです。(P.67-68)これまたおぶ(ryJavaセキュリティオブジェクト指向設計の大きな特徴の1つは、データの隠蔽とデータのカプセル化を行えることです。カプセル化によってオブジェクトは、そのデータ要素が直接的に操作されるのではなく、オブジェクトが提供するインタフェースを介してのみ操作されることが保証されます。(P..99)データの隠蔽とデータのカプセル化がどう違うのかよくわからん。パーミッションをカプセル化、と言っていることから、データ以外もカプセル化の対象としているようだ。オブジェクトをアセンブリとしてカプセル化することができる。オブジェクトをアセンブリにカプセル化することができる。版・・・って、ここは全然変わってないな。これだけで判断するのは難しいけど、フィールドの隠蔽がカプセル化とはしていないことはわかる。クラシックモダン・コンピューティング)特定の特性を顧客から呼び出せないようにするメカニズムを情報隠蔽と呼ぶ。(P.32)情報隠蔽はフィールドの隠蔽?情報隠蔽が意味するのはそういうことではなく、スプレッドシートプログラムを書く人がその実装で二分木が使われていることを知っていたとしても、その実装でなければ正しく機能しないような顧客モジュールを書くことができてはならないということだ。テーブルの実装がハッシュ法などの何かほかのものに変更された場合に動かなくなってしまうような顧客モジュールを書くことができてはならない。つには「情報隠蔽」という言葉そのものが物理的な保護を示唆することにある。(encapsulation)」は情報隠蔽の同義語として使われることがあるが、おそらく、この言葉の方が言葉として適切である。(P.66-67)情報隠蔽は実装の隠蔽?どっちだよwただ、情報隠蔽とカプセル化は同義語としている。使う側が実装の詳細を知っているかどうかは関係ないというのは面白い見方だな。[Encapsulation]情報隠蔽を見よ。hiding]あるクラスの性質の一部を顧客からアクセスできないようにする能力。エクスポートのポリシーと、ショート形式を主要なクラス文書として信頼することによって実現される。709情報隠蔽は能力・・・?よくわからん。この種の操作が全くもって困難であること自体、オブジェクト指向で推進されているように、再利用可能なモジュールとしてカプセル化し、二度と同じ問題で困らないようにすべきであると強く主張する根拠である。(P.152)カプセル化をサポートしている。オブジェクト内部のプロパティを隠し、公式のインタフェースを通じてアクセス可能にする。(P.498)次にカプセル化レベルこのレベルの言語は、モジュールかパッケージと呼ばれる構文的な単位で、一組のルーチンとデータ宣言をグループ化する方法を提供する。(P.558)上の本の下巻。下巻だけを読むと、上巻はいったいなんだったの?ってくらいカプセル化イコールフィールドの隠蔽に読める。・・・カプセル化は、クラスがもつ重要な機能のひとつです。データと機能をひとまとめにし、メンバを保護する機能をカプセル化という。(377)カプセル化はフィールドの隠蔽のことってことですね。カプセル化を「機能」としてるところは、「能力」としたオブジェクト指向入門と似たところがあるかもしれない。MAGAZINE)重要な情報は非公開部に隠されます。公開部には厳選された適正な処理のみが用意されます。公開された処理をインタフェイスとして操作します。利用者からは見えない。(P.84)カプセルの殻が公開部、中身が非公開部とする考え方。(アクセスできる手段はなくてもいい)、カプセル化を情報隠蔽を施した上で公開された処理を用意することをカプセル化としている。これは他に類を見ない考え方かもしれない。Javaアプリケーション作成講座―Swingプログラミング徹底攻略カプセル化はプログラムの可視性を制御する機能で、プログラムへのアクセスを規制します。外部に公開する必要性のないコードは外部からアクセスできないように設定することで、複雑な内部事情を隠蔽します。これによって、予期しない不正なアクセスを防ぎ、プログラムの安全性を向上させることができます。プログラムの利用者にとっても、関係のない機能が隠蔽されることによって複雑なシステムが単純化されるため、利用が容易になります。(P.15)カプセル化を可視性の制御する機能としている。「複雑な内部事情を隠蔽します」とあることから、フィールドだけの隠蔽ではなく、メソッドも含んでいるっぽい。それほど間違ってないプログラマ用語辞典クラス内のフィールドや内部処理をしているメソッドなどを、外部からアクセスできないようにすること。でない関数があれば勝手にアクセスしてしまうという風習を持っているプログラマたちの悪の手からモジュールを守ることを目標にしているような感じがするのは気のせいなのもの。(P.51)まぁ、プログラマ用語辞典はいいでしょう。Javaアプリケーション作成講座とほとんど同じだな。Rubyではじめる気軽なプログラミングデータの操作はメッセージを通して行われます。つのメッセージに対して必要となる操作は複雑になりますが、オブジェクトの利用者は実際にどのような手順で実際の操作が行われているかを知る必要はありません。このような隠蔽化をカプセル化といいます。(P.141)データの操作と制御の隠蔽をカプセル化としている感じ。同じものとして扱っている。