← 一覧へ
SW工学・管理
#정보은닉#캡슐화#모듈화#결합도#객체지향#134회#131회#129회
最終更新 · 2026-07-05

情報隠蔽(Information Hiding)

1. 概要

A. 定義

モジュール内部の実装の詳細・データを外部から隠し、明確に定義されたインタフェースのみを公開することで、モジュール間の結合度を下げるソフトウェア設計原理。D.L. Parnasが1972年の論文で提案した。

情報隠蔽の出発点は、「何をモジュールの境界とするか」という問いである。Parnasは、システムを処理順序(フローチャート)ではなく、変更の可能性が高い決定(設計上の秘密)を基準に分割せよと述べた。頻繁に変わりそうな部分(データ構造の表現、アルゴリズム、外部仕様など)を一つのモジュールの中に閉じ込め、その決定を「秘密」として隠せば、その秘密が変わっても他のモジュールは影響を受けない。すなわち情報隠蔽は単なるアクセス制限の手法ではなく、変更の波及を局所化するためのモジュール分割戦略である。

B. 必要性

ソフトウェアの総コストは開発よりも変更・保守においてより大きく発生するが、モジュール同士が互いの内部を知って依存していると、一か所の修正が連鎖的に他の箇所を壊す波及効果(Ripple Effect)が生じる。情報隠蔽は、各モジュールが公開されたインタフェースのみを通じて相互作用するようにし、内部実装が変わってもインタフェースさえ維持されれば他のモジュールには手を加えなくても済むようにする。これによってモジュールの独立性と保守性が高まり、複雑な内部を隠すことで抽象化が実現される。

2. 概念構造

flowchart LR
  C[呼び出し側モジュール] -->|公開インタフェース| I[インタフェース<br/>公開]
  I --> M[モジュール内部<br/>データ構造・アルゴリズム・状態<br/>隠蔽]

核心は、インタフェースと実装を契約と実行に分離することである。呼び出す側は、そのモジュールが何(What)を保証するか(インタフェースの約束)だけを知っていればよく、それをどのように(How)実現するか(内部のデータ構造・アルゴリズム)は知る必要もなく、知ってもいけない。例えば「ソートされたリストを返す」という契約だけを公開すれば、内部でクイックソートを使おうとマージソートを使おうと、呼び出し側には関係がない。呼び出し側が内部実装を知らないからこそその実装を自由に変えられるのであり、「知らない」ことがむしろ柔軟性の源泉となる。

3. 情報隠蔽とカプセル化の関係

二つの概念はしばしば混同されるが、階層が異なる。情報隠蔽は「何をなぜ隠すか」を定める設計原理(目的)であり、カプセル化はデータとそのデータを扱うメソッドを一つにまとめる実装手法(手段)である。カプセル化によってデータをオブジェクト内にまとめ、privateでアクセスを制限することで、情報隠蔽という目的が実際に実現される。すなわちカプセル化がなくても隠蔽を論じることはできるが(モジュールのインタフェース規約など)、オブジェクト指向においてはカプセル化が隠蔽を実現する代表的な手段である。目的と手段の関係として理解すれば、両者の違いは明確になる。

区分 情報隠蔽 カプセル化
概念 実装の詳細を隠す設計原理(目的) データ+メソッドをまとめる手法(手段)
焦点 アクセス制限・秘密の隠蔽 結合(まとめること)
関係 カプセル化を通じて実現される 情報隠蔽を支援する手段
実装例 private、モジュールのインタフェース規約 クラス、オブジェクト

4. 実装手法と関連原則

情報隠蔽は、複数の階層の手法・原則として具体化される。言語レベルではアクセス修飾子(private・protected)で内部を隠し、インタフェース/抽象クラスで契約のみを公開して実装を分離する。設計原則としては、オブジェクトが見知らぬオブジェクトの内部にまで踏み込まないようにするデメテルの法則、拡張に対して開かれ変更に対して閉じるようにする開放閉鎖原則(OCP)、具体的な実装ではなく抽象に依存させる依存性逆転原則(DIP)が、いずれも隠蔽と通じている。これらは結局、「変更可能な詳細を抽象の背後に隠す」という一つの志向を共有している。

区分 内容
アクセス修飾子 private・protectedで内部を隠蔽
インタフェース/抽象クラス 契約のみを公開、実装を分離
関連原則 カプセル化・抽象化、デメテルの法則、OCP、DIP

5. 利点および効果

情報隠蔽がもたらす効果は互いにつながっている。モジュールがインタフェースのみを通じてやり取りするため結合度が下がり、関連する機能・データが一つのモジュールに集まるため凝集度が高まる。結合度が低く凝集度が高ければ、一つのモジュールを独立して修正・交換できるため保守性が高まり、検証済みのインタフェースを複数の箇所で再利用できる。また内部データを外部が直接操作できないようにするため、誤った状態変更を防止する完全性・セキュリティの効果まで得られる。すなわち一つの原理が複数の品質指標を同時に改善する。

効果 説明
低い結合度 モジュール間の依存が減少 → 独立した修正
高い凝集度 関連する機能がモジュール内部に集中
保守性 インタフェース維持時に内部変更の影響なし
再利用性・セキュリティ 検証済みインタフェースの再利用、内部データの保護

6. 考慮事項および示唆点

  • 規模を貫く原理: クラスのprivateからMSAのサービス境界、オープンAPIの設計に至るまで、「実装を隠し契約のみを公開する」という同じ原理が貫かれている。MSAにおいて各サービスがDBを直接共有せず、APIのみで通信することも情報隠蔽の拡張である。
  • インタフェースの安定性こそが柔軟性: インタフェースが頻繁に変わると隠蔽の利点が失われるため、インタフェース優先設計(API-first)によって契約を先に安定させることが重要である。
  • 過度な隠蔽のコスト: 過剰な抽象化レイヤーは、性能のオーバーヘッドとデバッグ・追跡の困難を招く。隠す価値のある「変更可能な秘密」とそうでないものを区別し、適正な抽象化レベルを定めなければならない。

一言まとめ: 情報隠蔽は、変更可能な実装の詳細を隠しインタフェースのみを公開することで変更の波及を局所化する設計原理であり、目的である隠蔽を手段であるカプセル化が実現し、結合度の低減・保守性の向上を通じてMSA・API設計の基礎となる。