コンピュータサイエンスにおいて、情報隠蔽とは、コンピュータプログラムにおいて変更される可能性が最も高い設計上の決定事項を分離する原則であり、設計上の決定事項が変更された場合でも、プログラムの他の部分が大幅な変更を受けることを防ぐものです。この保護には、実装(その詳細が変更される可能性が高い)からプログラムの残りの部分を保護する安定したインターフェースを提供することが含まれます。別の言い方をすれば、情報隠蔽とは、プログラミング言語の機能(プライベート変数など)または明示的なエクスポートポリシーを使用して、クラスまたはソフトウェアコンポーネントの特定の側面がクライアントからアクセスできないようにする機能です。
カプセル化という用語は、情報隠蔽とほぼ同義で使われることが多い。しかし、両者の区別については必ずしも意見が一致しているわけではない。情報隠蔽を原理、カプセル化を技術と考える人もいる。ソフトウェアモジュールは、情報をモジュールまたはインターフェースを提供する他の構造にカプセル化することで情報を隠蔽する。[ 1 ]
情報隠蔽の一般的な用途の一つは、データの物理的な格納レイアウトを隠蔽することです。これにより、レイアウトが変更された場合でも、変更がプログラム全体のごく一部に限定されます。例えば、3次元点( x , y , z )がプログラム内で3つの浮動小数点スカラー変数で表現されている場合、後で表現がサイズ3の単一の配列変数に変更されたとしても、情報隠蔽を念頭に設計されたモジュールは、プログラムの残りの部分をそのような変更から保護します。
オブジェクト指向プログラミングでは、情報隠蔽(型のネストによる)によって、コードの不確実な実装(設計上の決定)への依存を明確に定義されたインターフェースに移すことで、ソフトウェア開発のリスクを軽減します。インターフェースのクライアントは、純粋にインターフェースを介して操作を実行するため、実装が変更されてもクライアントを変更する必要はありません。
オブジェクト指向設計に関する著書の中で、Grady Booch はカプセル化を「抽象化の構造と動作を構成する要素を区画化するプロセスであり、カプセル化は抽象化の契約インターフェースとその実装を分離する役割を果たす」と定義した。[ 2 ]
目的は、変更の可能性を実現することです。コンポーネントの内部メカニズムは、他のコンポーネントに影響を与えることなく改善できます。また、同じパブリックインターフェイスをサポートする別のコンポーネントに置き換えることもできます。カプセル化は、ユーザーがコンポーネントの内部データを無効または矛盾した状態に設定することを防ぐことで、コンポーネントの整合性も保護します。カプセル化のもう1つの利点は、ソフトウェアコンポーネント間の相互依存性を制限することで、システムの複雑さを軽減し、堅牢性を高めることです。[ 2 ]
この意味で、カプセル化の概念は、オブジェクト指向プログラミングにおける適用方法よりも一般的です。例えば、リレーショナルデータベースは、唯一の公開インターフェースがクエリ言語( SQLなど)であり、データベース管理システムの内部機構やデータ構造をすべて隠蔽しているという意味でカプセル化されています。このように、カプセル化は、あらゆる粒度レベルにおいて、優れたソフトウェアアーキテクチャの中核となる原則です。
ソフトウェアをインターフェースの背後にカプセル化することで、現実世界の物体の挙動や相互作用を模倣したオブジェクトを構築できます。例えば、シンプルなデジタル目覚まし時計は、一般の人(専門家ではない人)でも使用・理解できる現実世界の物体です。時計の内部構造をすべて理解する必要はなく、提供されているインターフェース(ボタンや画面)を通して、目覚まし時計の機能や使用方法を理解できます。同様に、時計が別のモデルに置き換えられたとしても、インターフェースの動作が同じであれば、一般の人はこれまでと同じように使い続けることができます。
オブジェクト指向プログラミング言語というより具体的な場面では、この概念は情報隠蔽メカニズム、バンドルメカニズム、あるいはその両方の組み合わせを意味する。(詳細は「カプセル化(オブジェクト指向プログラミング)」を参照。)
情報隠蔽の概念は、1972 年にDavid Parnasによって初めて説明されました。 [ 3 ] [ 4 ]それ以前には、Richard Gauthier と Stephen Pont が 1970 年に著したDesigning Systems Programsでモジュール性について議論していましたが、モジュール型プログラミング自体は、特にI/Oサブシステムやソフトウェアライブラリにおいて、長年にわたって多くの商用サイトで使用されていました。ただし、「情報隠蔽」というタグは付けられていませんでした。しかし、同様の理由と、より明白なコードの再利用という理由からでした。
情報隠蔽は、あらゆる機器、ソフトウェア、ハードウェアを機能モジュールに分割するための効果的な基準となります。例えば、自動車は複雑な機器です。自動車の設計、製造、保守を効率化するために、複雑な機器は、設計上の決定事項を隠蔽する特定のインターフェースを持つモジュールに分割されます。このように自動車を設計することで、自動車メーカーは、製造コストを抑えつつ、多様なオプションを提供することができます。
例えば、自動車メーカーは、標準バージョンと高級バージョンの両方を販売している場合があります。高級バージョンには、標準バージョンよりも強力なエンジンが搭載されています。高級バージョン用と標準バージョン用の2種類のエンジンを設計するエンジニアは、両方のエンジンに同じインターフェースを提供します。どちらのエンジンも、両バージョンで同じエンジンベイに収まります。どちらのエンジンも同じトランスミッション、同じエンジンマウント、同じコントロールに適合します。エンジンの違いは、より強力な高級バージョンは排気量が大きく、その排気量の大きいエンジンに必要な燃料と空気の混合気を供給するようにプログラムされた燃料噴射システムを備えている点です。
よりパワフルなエンジンに加えて、高級バージョンでは、CDプレーヤー付きのより優れたラジオ、より快適なシート、より幅広のタイヤを備えたより優れたサスペンションシステム、および異なる塗装色などの他のオプションも提供される場合があります。これらの変更すべてを含めて、車のほとんどの部分は標準バージョンと高級バージョンで同じです。CDプレーヤー付きのラジオは、高級モデルでは標準ラジオ(これもモジュール)に取って代わるモジュールです。より快適なシートは、標準タイプのシートと同じシートマウントに取り付けられます。シートが革製かプラスチック製か、ランバーサポートがあるかどうかは関係ありません。
エンジニアは、作業を細分化し、それを各チームに割り当てることで車の設計を行います。各チームは、特定の規格やインターフェースに基づいて担当部品を設計します。これにより、チームは部品設計において柔軟性を確保しつつ、同時にすべての部品が確実に組み合わさるようにすることができます。
自動車メーカーは、コスト削減策の一環として、複数の異なるモデルに同じ基本構造を頻繁に使用する。このような「プラットフォーム」は、情報隠蔽の一例でもある。なぜなら、フロアプランはセダン用かハッチバック用かを知らなくても設計できるからである。
この例からもわかるように、情報隠蔽は柔軟性をもたらします。この柔軟性により、プログラマーは、ユーザーのニーズに合わせてコンピュータプログラムが変更される際の通常の進化の過程で、プログラムの機能を修正することができます。情報隠蔽の原理を用いてソースコードをモジュールに分解するなど、コンピュータプログラムが適切に設計されている場合、変更は通常、全体的な変更ではなく局所的な変更となるため、進化的な変更ははるかに容易になります。
自動車は、ドライバーとのインターフェースの仕方という点で、この好例を示しています。自動車は、人々が訓練を受け、免許を取得する際に使用する標準的なインターフェース(ペダル、ハンドル、シフトレバー、ウインカー、計器類など)を備えています。そのため、人々は自動車の運転方法を学ぶだけでよく、新しいモデルを運転するたびに全く異なる運転方法を学ぶ必要はありません。(もちろん、マニュアルトランスミッションとオートマチックトランスミッションなど、いくつかの違いはありますが、全体として自動車は統一されたインターフェースを維持しています。)