インターフェース分離原理

王林
リリース: 2024-08-25 22:30:33
オリジナル
902 人が閲覧しました

Interface Segregation Principle

クライアントは、使用しないメソッドに依存することを強制されるべきではありません

さまざまな出力デバイスがオブジェクトを使用して表現されるオフィス空間の例を考えてみましょう

インターフェイス分離原則の前:

IMultiFunction インターフェイス

/**
 * @ImultiFunction interface has methods related to all output devices present in office space
 * for devices like Printer, Scanner, Fax machines, etc
*/
public interface IMultiFunction {
    public void print();
    public void getPrintSpoolDetails();
    public void scan();
    public void scanPhoto();
    public void fax();
    public void internetFax();
}
ログイン後にコピー

さまざまなデバイス向けに上記の共通インターフェースを実装中

すべての機能を備えた XeroxWorkCenter クラス

/**
 * 
 * You must have seen Xerox work station device which has all the features in one like printing, scanning, xerox,
 * fax etc
*/
public class XeroxWorkCenter implements IMultiFunction {

    @Override
    public void print() {
        // real printing code
    }

    @Override
    public void getPrintSpoolDetails() {
        // real get print spool details code
    }

    @Override
    public void scan() {
        // read scanning code
    }

    @Override
    public void scanPhoto() {
        // real scan photo code 
    }

    @Override
    public void fax() {
        // real fax code
    }

    @Override
    public void internetFax() {
        // real internet fax code
    }

}
ログイン後にコピー

HpPrinterNScanner クラスには印刷機能とスキャン機能があります

public class HpPrinterNScanner implements IMultiFunction {

    @Override
    public void print() {
        // real printing code
    }

    @Override
    public void getPrintSpoolDetails() {
        // real get print spool details code
    }

    @Override
    public void scan() {
        // read scanning code
    }

    @Override
    public void scanPhoto() {
        // real scan photo code 
    }

    //Since HpPrinterNScanner has only printing and scanning abilities fax() and internetFax() will have empty body
    @Override
    public void fax() {}

    @Override
    public void internetFax() {}

}
ログイン後にコピー

CanonPrinter クラスは印刷機能のみを持ちます

public class CanonPrinter implements IMultiFunction {

    @Override
    public void print() {
        // real printing code
    }

    @Override
    public void getPrintSpoolDetails() {
        // real get print spool details code
    }

    //Since the CanonPrinter has only printing ability rest of the method will have an empty body
    @Override
    public void scan() {}

    @Override
    public void scanPhoto() {}

    @Override
    public void fax() {}

    @Override
    public void internetFax() {}

}
ログイン後にコピー

ISP の違反を特定する技術

  • ファットインターフェイス (2 つの多数のメソッド宣言を持つインターフェイス)
  • 凝集性の低いインターフェース (互いに関連性が低いメソッドを持つインターフェース)
  • *空のメソッドの実装 *(クラスが使用しないメソッドの実装を強制される場合、メソッドの実装は空白の本体のままになります)

インターフェース分離原則後:

public interface IPrint {
    public void print();
    public void getPrintSpoolDetails();
}
ログイン後にコピー
public interface IScan {
    public void scan();
    public void scanPhoto();
}
ログイン後にコピー
public interface IFax {
    public void fax();
    public void internetFax();
}
ログイン後にコピー
/**
 * 
 * You must have seen the Xerox workstation device which has all the features in one like printing, scanning, xerox, fax, etc.
*/
public class XeroxWorkCenter implements IPrint,IScan,IFax {

    @Override
    public void print() {
        // real printing code
    }

    @Override
    public void getPrintSpoolDetails() {
        // real get print spool details code
    }

    @Override
    public void scan() {
        // read scanning code
    }

    @Override
    public void scanPhoto() {
        // real scan photo code ̰
    }

    @Override
    public void fax() {
        // real fax code
    }

    @Override
    public void internetFax() {
        // real internet fax code
    }

}
ログイン後にコピー
public class HpPrinterNScanner implements IPrint,IScan {

    @Override
    public void print() {
        // real printing code
    }

    @Override
    public void getPrintSpoolDetails() {
        // real get print spool details code
    }

    @Override
    public void scan() {
        // read scanning code
    }

    @Override
    public void scanPhoto() {
        // real scan photo code 
    }
}
ログイン後にコピー
public class CanonPrinter implements IPrint {

    @Override
    public void print() {
        // real printing code
    }

    @Override
    public void getPrintSpoolDetails() {
        // real get print spool details code
    } 
}
ログイン後にコピー

各インターフェースは単一の責任を持ち、よりクリーンになりました。

ISP が他の SOLID 原則と保持する関係

単一責任
インターフェースを異なるインターフェースに分離した後、IPrint、IScan などのすべてのインターフェースが単一の責任を持つようになりました

リスコフの置換
分離により、すべてのサブタイプまたは実装クラスはインターフェース参照変数

で置き換えられるため、すべてのクラス (インターフェースを実装) が Liskov 置換に従います。

以上がインターフェース分離原理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!