1:適切なカプセル化。して持ち、適切なインターフェースを提供すべきである。(P.72)これはカプセル化がフィールド隠蔽を指す、でいいな。従来のオブジェクト指向言語に共通する特徴として、クラスのプロパティをプライベートとして宣言できる点があります。プライベートとして宣言することで、そのプロパティはクラスのメソッドからのみアクセス可能となり、そのほかのコードからは操作できなくなります。メソッドからしかアクセスできないようにします。(P.165)フィールドの隠蔽がカプセル化派ですね。Java魂―プログラミングを極める匠の技カプセル化は、クラスのインタフェースのみをクラスのユーザに公開するものであり、クラスの実装の詳細を明らかにするものではありません。オブジェクトは格納の前に必ずコピーされるので、このデータオブジェクトクラスは安全にカプセル化されています。メソッドから返された場合にも必ずコピーされます。開発者は内部オブジェクトへの参照を得ることができないので、絶対にカプセル化を壊すことはありません。前半と後半で意見が変わっているとも読める、なんとも中途半端な感じ。パッケージのインタフェースは、他に選択肢がない場合を除いては、クラスのユーザに公開すべき唯一のコンポーネントです。これはカプセル化の考え方に従っています。カプセル化とは、プログラマがクラスのユーザに実装の詳細を公開しないで、クラスのインタフェースだけを公開することです。以下のコードは適切なインタフェースベース手法の例です。!!!カプセル化とは、実装の詳細を公開しないことで、インタフェースだけ公開すること?またさっきと言ってることが変わってるよ・・・オブジェクト指向エンジニアリングはカプセル化の概念に基づいています。オブジェクトの内部については、クラスのユーザからは見えないようにすべきです。ビットフィールドは、オプションの内部実装をユーザに公開するため、不適切なカプセル化の一例です。(P.167)また意見を変えたなこのやろう。この本は駄目な本なので気にしないことにする。通してのみ他のモジュールと通信し、各モジュールはお互いの内部の動きについては知りません。[Parnas72]。原則を具体化しています。(P.321)情報隠蔽とカプセル化を同じものとしている。フィールドの隠蔽だけを指しているとも、インターフェイスの裏に実装クラスを隠蔽することを指しているともとれるな。変換ロジックを分離し、カプセル化します。内にカプセル化すべきです。(P.127)変換ロジックをカプセル化と言っていることから、フィールドの隠蔽だけを指しているわけではないことはわかる。抽象的に考えること・データ構造を理解することオブジェクト指向では、データをオブジェクト内に隠蔽し、限定された手続きのみで操作できるようにします。(P.150)フィールドの隠蔽のみを指しているよう。Rubyメソッド呼び出しでかっこが省略されているので、これらのコードはまるでオブジェクトの名前付きフィールドか名前付き変数の参照のように見える。オブジェクトのカプセル化については厳格な言語だ。オブジェクトの外からオブジェクトの内部状態にアクセスすることはできない。オブジェクトは、厳重にカプセル化されている。オブジェクトの状態には、オブジェクトが定義するメソッドを通じてでなければアクセスできない。クラスは非常にオープンである。(P.222)これまたフィールドの隠蔽のみを指しているよう。実装の詳細を隠蔽しよう。インターフェイスの裏にある実装は、プログラムのほかの部分に一切影響や支障を及ぼすことなく変更できるように隠しておく必要がある。この種の構成上の原則を表現する用語は何種類かあり、情報隠蔽、カプセル化、抽象化、モジュール化などといった用語はどれも同じ種類の発想を表している。ヘッダのようなもと取るかによって、ちょっと意味が変わってきそう。情報隠蔽とカプセル化は同じものとしている。データを参照・変更することができなくなります。(P.32)これはフィールドの隠蔽を言ってますね。学ぶUML―オブジェクト指向の基礎からUMLの利用法まで、しっかりよくわかる!カプセル化を簡単に言うと「公開部分と非公開部分に分けること」です。そのため、情報隠蔽と呼ばれることもあります。(P.34)これはクラスの中の話だと思うんで、フィールドの隠蔽がカプセル化ってことですね。カプセル化と情報隠蔽は同じ、と。(157)」の動機では、委譲オブジェクトの利用をカプセル化することの有効性について述べました。(P.160)オブジェクト指向の主要な教義の1つは、カプセル化、あるいはデータの隠蔽です。自分のデータを公開してはならないということです。(P.206)ちょっと判断に困るなぁ。情報隠蔽は極めて重要です。(P.125)クラス同士の関係をシンプルにするためには、情報隠蔽がどうしても必要になります。サーバクラスが提供してやれば、クライアントクラスは委譲クラスを利用しなくてもよくなります。これで、サーバクラスが委譲クラスへ委譲しているという実装詳細を、クライアントクラスから隠すことができます。(P.310)これはリファクタリングを元に書かれているので、参考までに。使ってフィールドにアクセスさせることをカプセル化と呼ぶのはちょっと違うんじゃ。知っているようにして、その担当に仕事を頼む人は、その中身をしらないようにしなさいということです。風邪薬の錠剤は、よくカプセルになっています。そのカプセルの中にはいろいろな種類の薬が入っていますが、我々はその中にどんな種類の薬が入っているかは全然理解してません。カプセルに入った風邪薬を飲むと「風邪が治まる」ということだけは知っています。こんな感じのイメージがカプセル化というわけです。(P.21-22)これもフィールドの隠蔽のことでいいのかな。委譲を含めてると考えてもいいかも。カプセルを使った説明は良くあるけど、そのどれとも違う感じの説明になってるのが面白い。データとメソッドをまとめて記述します。(P.107)カプセルの殻がクラス、中身がデータとメソッド。隠蔽はなくてもいい、と。このページはこの本を参考にしたと思われる。プログラミングのセオリーカプセル化という言葉から「ブラックボックス化」をイメージする人が多いようです。メソッドを用意するというサンプルプログラムがよく示されます。このようなプログラムのメリットは、フィールドに書き込まれる値をチェックし、不適切な値が代入されないようにできることです。しなければいけない」と思い込んでしまうでしょう。それではコードが長くなってしまいます。カプセル化に対するイメージを変えましょう。ことがカプセル化である」または「そもそもオブジェクトは振る舞いと属性を持つものである」というイメージに変えましょう。フィールドとメソッドを持つクラスを記述するだけで、すでにカプセル化が行われているのです。定義できないので、自然とカプセル化ができるはずです。指定することにこだわる必要はありません。それだけじゃなくて、クラスの中に置けばカプセル化とな。使ったところで出来上がったプログラムがオブジェクト指向かというと、それは違うってのは誰もが認めるところなのに、矢沢さんはそうは考えてないみたいです。2.0を使ったアジャイルモデル駆動開発のすべてクラスが何を知っていて何を行うかを「決める」ことを、クラスを「抽象化する」と言います。クラスがこれらの事柄をどう達成するか設計すると言うのではなく、クラスを「カプセル化する」といいます。情報に対するアクセスを制限してうまくクラスを設計することを、情報を「隠蔽する」と言います。・・・システムとして動くために必要なシステムの機能をどのようにモジュール化するかという問題は、カプセル化によって対処します。オブジェクト指向の世界では、システムはクラスにモジュール化され、クラスはさらにメソッドと属性にモジュール化されます。これを、振る舞いをクラスにカプセル化する、あるいは、機能をメソッドにカプセル化すると言います。カプセル化は、設計時に考慮すべきことであり、システム内で機能をどのように区分けするかという視点でクラスを捉えることです。システムを構成する部品は内部がどう実装されているかを知らなくても使えるようになっているべきです。(P.55-56)抽象化はクラスが何を知っているかが必要、というのは斬新かも。何を行うかを決めることを抽象化と呼ぶ、ってのはよくあるけど、それプラス何を知っているかも必要、とな。達成するかを決めることをカプセル化すると言う・・・?さらに情報に対するアクセスを制御してうまくクラスを設計することを情報隠蔽と言う・・・?なんかわけわからん。カプセル化は設計時に考慮すべきこと、ってのは考えたことなかったな。ことは、単純なフィールドの隠蔽を指しているわけではなさそう。つの項目にグループ化すること。属性に対する外部からのアクセスを制限すること。527)カプセル化で隠蔽についてはなにも規定していないところを見ると、カプセル化と情報隠蔽は全く別物であるとしているのかな。カプセル化だけなら隠蔽されている必要はないし、情報隠蔽だけなら関連する概念はまとまってなくていい、と。類似の概念に「カプセル化」がありますが、厳密には両者は異なる概念です。(P.209)これは新しい。の」設計と実装を学ぶわけじゃないから注意が必要。書かれたライブラリ等の設計と実装を学ぶ本。インスタンス化された型のオブジェクトを操作するために、テンプレートクラスとテンプレート関数のセットをカプセル化するクラスである※2。ここで言う「カプセル化」とは、殻の中に隠蔽することではなく、ひとまとめにするという意味で使っている。使ったテンプレートとして実装されることが多い。(P.20)カプセル化には複数の意味がある、と言うことですね。話なので、あくまで参考程度にね。定義すると、データの格納方法や取得方法がカプセル化されて、システムのほかのオブジェクトはその詳細を関知する必要がなくなります。Studio2005対応クラスを記述することで、あるものの性質とそれができることを、単一で自己完結かつ自立したコードの塊にカプセル化できます。これがクラスというものの大きな利点です。リストボックスコントロールの内容を並べ替えたいときは、そのリストボックスに自身をソートするように指示すればよいのです。そのリストボックスがソートをどうやって行うかは問題ではありません。プログラマは、それがソート可能であるということだけを知っていればよいのです。(P.67)プロパティはメンバ変数のように見えるので、利用者にシンプルなインターフェイスを提供できます。同時に、メソッドとして実装されることで、よいオブジェクト指向設計に必要なデータ隠蔽を行えます。(P.97〜100)うーん、判断に困る。上手に組織化されたメンテナンス性の良いクラスの集まりを作る、オブジェクト指向のテクニック―カプセル化やデータ隠蔽など―を使っていれば、その同じテクニックがスレッドセーフなクラス作りを支えてくれます。その問題の変数にアクセスするコードが少なければ少ないほど、すべてのコードが正しい同期化をしている状態を確立しやすくなり、変数がアクセスされる条件を判断するのも容易になります。言語はステートのカプセル化をプログラマに強制しません。抽象化*1やカプセル化と実行性能が両立しないときもあります。メソッドは提供すべきでない。同意義だが、とくにデータや物理的で低レベルの機能を表すオブジェクトに関して使う。通信機能の、高級で使いやすいオブジェクトへの抽象化だ。(P.18-19)オブジェクトの内部的なステート変数を公開するとカプセル化に違反し、不変項の保全が困難になります。(P.46)ステートってのはステートパターンじゃなくて、フィールドの値のことですね。ことはカプセル化とデータ隠蔽は同じもの、ってことかな。(インスタンス化とは多分別物。同意義ってのはちょっと引っかかる。パターンは処理をオブジェクトとしてカプセル化するため、オブジェクトを利用する利点を有効に活用できます。継承これだけでは判断できないけど、カプセル化がフィールドの隠蔽と同じじゃない、ってことはわかる。カプセル化によって、オブジェクトのフィールドへアクセスする際には所定の手続きを踏まなければならないようにすることができます。不変式が破られないようにオブジェクトを守ることです。情報隠蔽この本はいろいろと駄目な本なので参考程度に。(別巻3))二番目の見方は、カプセル化を強調するものだ。これは、部品の内部構造は見ることもましてやデザインすることもできないことを意味する。(P.207)パルナスのモジュールに関する情報隠蔽の定義は、非常に重要な研究計画の第一発表段階にあたり、オブジェクト指向プログラミングの知的先祖なのだ。彼は、モジュールを独自のデータモデルおよび演算一式を備えたソフトウェア実体と定義した。データは適切な操作を介してのみアクセスできる。・・・だが実は、オブジェクト指向プログラミングで実現がもっとも期待されているのは、第一段階に由来するものだ。それに加えて、再利用のためにデザインされたテスト済みの事前作成のモジュールライブラリまたはクラスに関するアイディアである。(P.264)情報隠蔽とカプセル化は同じものとしてるようだけど、その意味するところはちょっと読み取れない。(P.132)委譲をカプセル化としていることから、カプセル化はフィールドの隠蔽だけを指すものじゃないとしているってことでいいのかな。SERIES)カプセル化の利点は、ちょっと考える以上に重要です。(つまり、カプセル化)、メンバ関数のみがそのデータにアクセスできるようにしておけば、常にクラスの不変な条件が成り立つようにしておけます。するということは、カプセル化しないということです。つのアクセスレベルしかないのです。(カプセル化にならない)「その他」です。(P.98-99)何かがカプセル化されているということは、それが見えないところに隠されているということです。見えるものが少ないほど、いろいろな変更が可能になり、柔軟性が増します。変更の影響を受けるのは、その変更が見えるものだけだからです。カプセル化するほど、変更する能力が増すわけです。(P.101)フィールドの隠蔽がカプセル化を意味するってことですね。下で「何かが」という表現があるので、上はカプセル化の中で「データの」カプセル化を単にカプセル化と呼んでいる可能性は捨てきれない。探し方が足りないのかもしれないけど。レコードで値オブジェクトを簡単に作る業務で使う関数型言語の第一回は、レコードについてです。(1)検索はてなブログをはじめよう!bleis-tiftさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。