2

アグリゲーションやコンポジションのさまざまな側面を理解しようと本を読んでいますが、アグリゲーションは緩い結合を強化するだけでなく、カプセル化を破ることもできると感じたところに出くわしました。

緩い結合を強化します。

public class Car{
    private Engine engine;
    Car(Engine e){
        this.engine=e;
    }
}

上記では、Engineクラスの任意の実装を作成し、作成時にCarオブジェクトにプッシュできます。また、Engineインスタンスは車なしで動作できるため、集約の完璧な例です。(この例は実際の素晴らしい例ではないかもしれませんが、私は自分の主張を述べたと思います)

これで、クライアントコードはエンジンオブジェクトを完全に制御できるようになり、Carに渡されるエンジンオブジェクトのいくつかの状態を変更できます。また、Carの実装では、オブジェクトまたは状態(Engine)にカプセル化が解除されるため、カプセル化が解除されます。車の中で正しい完全性。

私の理解は正しいですか?

4

2 に答える 2

1

は、可変である場合、つまり車がエンジンの状態を変更できる場合にのみ、破損Engineする可能性があります。ただし、不変クラス(状態にアクセスするゲッターと状態を変更しないビジネスメソッドのみを持つ)をCar定義するか、クラスによって実装されるインターフェイスを作成することができます。不変ではありません。状態を変更できる機能が含まれています。ただし、クライアントに対して「不変」メソッドのみを公開するインターフェースを実装します。そのため、車は読み取り専用インターフェースの背後に隠れている状態を変更できません。この場合、カプセル化は壊れていません。EngineEngineEngineImplEngineImplEngineEngineImplEngine

あなたは正しいです:これは実際の例ではありません:実際の世界では、ドライバーは自分の車が提供するインターフェースを介してエンジンを制御し、エンジンを壊す可能性があります:(

于 2012-12-11T07:58:15.177 に答える
1

ここでは、緩い結合が自動車とエンジンの関係を対象としています。

車はコンストラクターを介して任意のエンジンを受け入れますが、車はゲッターメソッドによってエンジンを公開しないと思います。

このコンストラクターは、適切なアクセス制御/レベルを備えている必要があり、エンジンと車の統合を処理するファクトリまたはその他の作成パターンで使用される必要があります。

車のクライアントがエンジンにアクセスできるようにするには、車のインターフェースを使用する必要があります。

于 2012-12-11T07:56:49.217 に答える