インターフェイス分離原則: 同じ抽象クラスまたはインターフェイスから共通の機能を抽出し、機能の拡張用に別のインターフェイスを抽出します。各クラスは、ユニバーサル インターフェイスを確立するのではなく、独自の専用インターフェイスを確立します。
意味
- インターフェイス分離原則 (
Interface Segregation Principle
、ISP
) は、単一のインターフェイス全体ではなく、複数の特殊なインターフェイスを使用することを指します。クライアントは、必要のないインターフェイスに依存すべきではありません。インターフェース分離の原理は、よく言われる「高凝集性・低結合性」の設計思想に準拠しているため、クラスの可読性、拡張性、保守性が良好です。
本旨
- 高い凝集性と低い結合性
- クラスは必要のないインターフェイスに依存すべきではありません、つまり、クラス間の依存関係は最小限のインターフェイスに基づいている必要があります。
アドバンテージ
- インターフェイスの分離により、システムの凝集性が向上し、外部との相互作用が減少し、システムの結合が減少します。
- 肥大化したインターフェイスを複数の粒度の小さいインターフェイスに分解すると、外部変更の拡散を防ぎ、システムの柔軟性、拡張性、保守性を向上させることができます。
インターフェースの分離と単一責任原則の違い
- 単一責任原則はもともと責任に焦点を当てていましたが、インターフェイス分離原則はインターフェイスの依存関係の分離に焦点を当てていました。
- 単一責任原則は主にクラスを制約し、次にインターフェイスとメソッドを制約し、プログラムの実装と詳細を目的としていますが、インターフェイス分離原則は主にインターフェイスを制約し、主に抽象化とプログラム全体のフレームワークの構築を目的としています。 。
実現方法
- クラスへのクラスの依存関係は、最小のインターフェイスに基づく必要があります。
- 単一のインターフェイスを確立して、結束性を高め、外部とのやり取りを減らします。巨大で肥大化したインターフェイスを構築せず、インターフェイスでほとんどのことを達成するために最小限のメソッドを使用するようにします。
- インターフェイスをできるだけ改良してください。インターフェイス内のメソッドはできるだけ少なくする必要がありますが、制限は必要です。少ないほど良いです。適度でなければなりません。インターフェイスが小さすぎると、メソッドが多すぎます。カスタム サービスは、必要なメソッドのみを呼び出しクラスに公開し、必要のないメソッドは非表示にします。モジュールにカスタマイズされたサービスを提供することに重点を置くことによってのみ、確立される依存関係を最小限に抑えることができます。
- 将来起こり得る変化についての予測を含め、ビジネス モデルについてより多くの時間を費やして考えてください。したがって、抽象化とビジネス モデルを理解することが非常に重要です。
場合
動物の行動を例として、新しい動物インターフェイスを作成し、食べる、寝る、飛ぶ、泳ぐ、這うなどの行動を追加してから、魚を追加して動物インターフェイスを実装します。
ここで問題があり、魚は飛ぶことも這うこともできないため、これら 2 つのインターフェイスを実装する方法がなく、魚は使用しないメソッド、つまり飛行と這うメソッドに依存せざるを得なくなります。インターフェース分離の原理
ケースの改善
動物の共通の特徴(食べる、寝る)を抽象化し、魚が必要としないインターフェースを個別に抽象化する、つまり、共通の特徴は同じ抽象クラスまたはインターフェースに抽出され、特徴は魚にとって別のインターフェースに抽出されます。拡大。将来どのインターフェイスが必要になり、どのインターフェイスを実装しますか? これにより、インターフェイスの範囲が最小限に抑えられます。
public interface Animal {
void eat();
void sleep();
}
public interface Birds{
void fly();
}
public interface Fish {
void swim();
}
public class Eagle implements Animal,Birds{
@Override
public void eat() {
System.out.println("老鹰在吃东西");
}
@Override
public void sleep() {
System.out.println("老鹰在睡觉");
}
@Override
public void fly() {
System.out.println("老鹰在飞翔");
}
}
public class Salmon implements Animal,Fish{
@Override
public void eat() {
System.out.println("三文鱼在吃东西");
}
@Override
public void sleep() {
System.out.println("三文鱼在睡觉");
}
@Override
public void swim() {
System.out.println("三文鱼在游动");
}
}