質問: オブジェクト指向の「カプセル化」について >>@itより http://www.atmarkit.co.jp/fjava/devs/object02/fig2_1.gif オブジェクトが、「固有の状態」と「振る舞い」をカプセル化して隠ぺいしている >>msより メソッド (振る舞い) とプロパティ (属性) をインタフェースとして備えています @itの記事では、メソッド自体(振る舞い)もカプセル化により隠ぺいされていると理解したのですが、 msではインターフェイスとしてメソッドとプロパティが公開されていると説明されていました。 カプセル化では、インターフェイスとして何が公開されているのか、 隠ぺいされているものは何なのか。以上の二点がわかりません。 ちなみに各記事のurlはこちらです。 http://www.microsoft.com/japan/msdn/academic/articles/csharp/02/csharp2.aspx http://www.atmarkit.co.jp/im/carc/serial/object02/object02.html
回答: オブジェクトのカプセル化の目的は、内部の振る舞いと属性を外部から隠蔽することで再利用性・メンテナンス性を高めることにあります。 すべてのメソッド(=メッセージ)を隠蔽してしまっては、外部とのインターフェイスが取れなくなりますので、メソッドをすべて隠蔽することはありません。 プロパティ (属性) が外部に公開されても構いませんが、プロパティを外部から書き換えられることで内部の振る舞いに支障が出るようなカプセル化は失敗です。 という前提でmsと@itの言葉を整理してみましょう。 ・@it「固有の状態」 内部の振る舞いに関する属性を固有の状態と呼んでいると思われます。カプセル化には必須のことです。 ・@it「振る舞い」 内部の振る舞いの事を呼んでいると思われます。同じくカプセル化には必須のことです。 ・ms「メソッド (振る舞い)」 外部とのインターフェイスのためのメソッドです。外部の要求に対してメソッドとしての振る舞いをしますが、内部の振る舞いが隠蔽されているならばカプセル化は問題ありません。 ・ms「プロパティ (属性)」 外部とのインターフェイスのための属性です。これ単体で使われることはありません。何らかのメソッドで対で使われる必要があります。属性に値を入れてメソッドを呼ぶか、メソッドを呼んで属性に値を入れてもらうかどちらかでしょう。 これ以外に内部の振る舞いのための属性が存在する前提で書かれたものと思われます。