思い出させるために(ウィキから):
インターフェイス分離の原則(ISP) は、クライアントが使用しない方法に依存することを強制されるべきではないと述べています。
そして今、私の例を見てください。
これが私の可変エンティティです。どこかから編集され、読み取り専用インターフェイスを介して変更を通知できます。
interface ICounter
{
event Action<int> NewNumber;
}
class Counter : ICounter
{
public event Action<int> NewNumber;
int number = 0;
public void IncrementAndSend(int x)
{
number += x;
if (NewNumber != null) NewNumber(number);
}
}
そして、これを使用するトランスポート層のクラスを次に示します。インジェクションの 2 つのバリアント (Attach_1
およびAttach_2
) と、以下の私の仮定を見てください。
class OneToManyRouter
{
IEnumerable<Counter> _destinations;
public OneToManyRouter(IEnumerable<Counter> destinations)
{
_destinations = destinations;
}
// 1
public void Attach_1(ICounter source)
{
source.NewNumber += (n) =>
{
foreach (var dest in _destinations) dest.IncrementAndSend(n);
};
}
// 2
public void Attach_2(Counter source)
{
source.NewNumber += (n) =>
{
foreach (var dest in _destinations) dest.IncrementAndSend(n);
};
}
}
- ISP は実際のオブジェクトに関するものです。着信パラメーターへの「過剰な」参照を使用してはなりません。
- ISP はクラスに関するものです。クラスがすでにどこかで完全なインターフェースを使用している場合、特定のメソッドで参照型を制限する必要はありません。
ICounter
この例ではインターフェイスが過剰です。 - このアーキテクチャは、SOLID 原則の観点からは完全に間違っています (では、なぜでしょうか?)。