3

情報隠蔽は、システムを構成するモジュールを分離するのにどのように役立ちますか?

4

2 に答える 2

10

カプセル化 (情報隠蔽) により、絶対最小限のものだけを外の世界に公開できます。これは、クライアントに影響を与えることなく、非公開ビットを心ゆくまで変更できることを意味します。

適切なケース。文字列を配列に保持するデータ構造を実装したとします。配列を公開すると、データ構造のユーザーは、str[7]位置 7 の文字列を取得するために使用できます。

では、データ構造をバランスの取れたツリーとして再実装して、文字列の検索を高速化するとどうなるでしょうか。これを行うには、文字列をツリーに移動し、配列を文字列ではなく、ツリー内の場所へのポインターに変更します。

ポインターではなく文字列を期待するため、クライアントが壊れます。すべてのクライアントは、配列からポインターを取得し、ツリーでそれらを検索するように変更する必要があります。

ただし、実装を完全に非表示にし、関数を提供しただけの場合:

String getStringAt (int n);

互換性を保つためにデータ構造関数を変更するだけです。

アプリケーション プログラミング インターフェイス (API) が変更されていないため、クライアントが壊れることはありません。

私がクラスで従う最も重要なルールの 1 つは、最大の一貫性と最小の結合を目指すことです。言い換えれば、1 つのクラスに必要なものがすべて含まれ (それ以上のものはなく)、外部との情報共有はできるだけ少なくする必要があります。

つまりクライアントができることは API を呼び出すことだけです。API 以外のメソッドを公開したり、パブリック変数への自由なアクセスを許可したりしないでください。すべてをセッターとゲッターで行う必要があります。

于 2009-10-29T05:16:15.130 に答える
1

データ隠蔽は、モジュール間の結合を制限するのに役立つほどモジュールを分離しません。
これは、非表示の要素は、それらが定義されているモジュール以外のモジュールでは使用できないため、モジュールを「結合」する可能性のあるタイイン/依存関係/call-it-what-you-may を制限するためです。

言い換えれば、モジュール間の交換をAPIで明確に定義されたものに制限します。この事実は、特定のモジュールの実装が変更された場合に非常に役立ちます。API が同じままである限り、モジュールの相互運用性は維持されるためです。動作します。(モジュール A がモジュール B の変数 x を使用したかどうかを調べるためにコードを調べる必要はありません (B が x を隠している場合、それを使用するのはモジュールだけです!)

于 2009-10-29T05:17:18.507 に答える