カプセル化

カプセル化(カプセルか、: encapsulation)は、コンピュータプログラミングで用いられる概念で互いに関連するデータとロジックなどを1つのモジュールとしてまとめることである[1]。また、より広い意味ではまとめたモジュールの内側の詳細を外側から隠蔽することをも含む[2]。この隠蔽は計算機科学者デビッド・パーナスが提唱した情報隠蔽英語版と同義である。

カプセル化はオブジェクト指向での使用が最も有名であり、そこではフィールドとそれを操作するメソッドをまとめたオブジェクトの内部要素への直接アクセスを制限するためのアクセスコンロールを設けている。内部隠蔽されたフィールドを操作または閲覧するためのメソッドは、ミューテイタ/アクセッサ英語版と呼ばれ、これはセッター/ゲッターの俗称でも知られている。フィールドとメソッドの一体化には、フィールド展開用のメモリ基底アドレスをアドホック多相英語版表現にしたThis参照の機構が用いられている。これらカプセル化のコンセプトの定義と実装の書式は、オブジェクトの設計図に例えられているクラスに投影されている。オブジェクト指向のカプセル化は、特にデータ抽象の側面が強調されている。

なお、カプセル化はオブジェクト指向の専売特許ではなく、抽象データ型プログラムモジュールソフトウェアコンポーネントの実装にも使用されている。

概要

構造化プログラミングを提唱したエドガー・ダイクストラは、プログラムの段階的詳細化法の知見から、プログラムを構成するアルゴリズムとそのアルゴリズムで用いられるデータ構造は密接に関連しており、アルゴリズムをある程度詳細化してからでないと多くの場合そのデータ構造は決定できないことを指摘した[3]

さらに、アルゴリズムに関連するデータ構造を決定するためには、まず必要なデータ構造の存在を変数名で代用、すなわち抽象(abstract)し(これをデータ抽象(data abstract)と呼ぶ)、アルゴリズムの方の詳細化を進めることでそのデータ抽象された変数名が必要とされる情報を徐々に集めてゆき、十分な情報が集まった段階でそのデータ構造を決定させればよいということを示した[注釈 1]。なお、データ抽象を駆使してアルゴリズムとそのデータ構造を洗練化(段階的詳細化)したものは真珠(pearl)[注釈 2]と呼ばれる[4][注釈 3]

このように開発されたプログラムにおいては、アルゴリズムとそのデータ構造は一体不可分のようになるため、プログラムの拡張などにより、アルゴリズムを後から変更する必要が出てくると、必然的に一度決定したはずのデータ構造や関連操作を修正しなくてはならなくなる。しかも、その修正箇所は大規模なプログラム開発であれば多数の関連ソースコードの各所に散在してしまうことになる[注釈 4]

以上のことを踏まえれば、ほとんど一体不可分のものであるアルゴリズムの操作と、そのアルゴリズムに関連するデータ構造に対しては、異なる名前を持つ異なる真珠として扱うよりも一つの変数名からなる一つのモジュール(module)とした方が、仮に後でアルゴリズムの変更を行うにしても変更箇所がそのモジュールの内部に限定されることになるので、保守管理しやすい。このように、関連するデータとその操作を一つの何かまとまりにまとめることを情報のカプセル化(encapsulation)またはモジュール化(modulization)と呼ぶ[注釈 5]

情報隠蔽

デイビッド・パーナスはモジュール間の結合に関する議論を進める上で、プログラムやモジュールに関する設計情報は濫りに公開してはならず、むしろ積極的に隠蔽すべきであるという情報隠蔽(information hiding)の考え方を説いた。つまり、公開すべきものはプログラムやモジュールの仕様であって、その実現手段ではないと主張した[5][注釈 6]

公開すべき仕様上の機能を呼び出す機構はインターフェース(interface)と呼ばれる。インターフェースを経由することでモジュールの機能の情報隠蔽をすることができる。ほかに情報隠蔽を実現する機構としては、モジュールの機構自体に公開/非公開(public/private)の区別を指定する方法が一般的である。

脚注

注釈

出典

参考文献

  • E.W.ダイクストラ、C.A.R.ホーア、O.-J.ダール 著、野下浩平,川谷慧,武市正人(共訳) 訳『構造化プログラミング』サイエンス社、1975年。 
  • 山崎利治『プログラムの設計』共立出版〈計算機科学/ソフトウェア技術講座〉、1990年。 
  • 落水 浩一郎『ソフトウェア工学実践の基礎』日科技連、1993年。 
  • D.L.Parnas (1971), “Information distribution aspects of design methodology”, Proceedings of IFIP Congress 

関連項目