オブジェクト向け設計-インタフェース分離の原則

3797 ワード

概要
インタフェース分離原則(Inteface Segregation Principle,ISP)とは、設計時に異なる機能を異なるインタフェースに定義するか、単一の総インタフェースではなく機能区分に従って複数の専門インタフェースを定義し、クラス依存を実現するために不要なインタフェース(方法)を避けることを意味し、別の角度から理解すると、クラスはできるだけ少ないインタフェースや実装クラスに依存すべきである.プログラムの冗長性と複雑さを軽減します.
深く理解する
インタフェース分離の原則は、アーキテクチャ設計者がインタフェースを設計する際に以下のキーに注意することを指導する.
  • あるクラスの他のクラス(インタフェースの実装クラス)への依存は、最小のインタフェースの上に
  • を確立すべきである.
  • は複数の専門的なインタフェースを確立することができ、膨大で肥大化したインタフェース
  • を確立しないでください.
  • インタフェース機能を適切に区分し、インタフェースの方法はできるだけ少ない(適度)
  • .
    コードの例
    以下、ブランド自動車を例に、その行為を抽象的に説明する.
  • 自動車インタフェース
  • //     
    public interface Car {
        //   
        void start();
        //   
        void run();
        //   
        void refuel();
        //   
        void charge();
    }
    
    //   VV7   
    public class HavalVV7 implements Car{
        @Override
        public void start() {
            //     
        }
    
        @Override
        public void run() {
            //   、   
        }
    
        @Override
        public void refuel() {
            //    、  
        }
    
        @Override
        public void charge() {
            //     ,   
        }
    }
    
    
  • ハーバーVV 7自動車
  • //   VV7   
    public class HavalVV7 implements Car{
        @Override
        public void start() {
            //     
        }
    
        @Override
        public void run() {
            //   、   
        }
    
        @Override
        public void refuel() {
            //    、  
        }
    
        @Override
        public void charge() {
            //     ,   
        }
    }
  • テスラModel 3
  • //    Model3
    public class TeslaModel3 implements Car {
        @Override
        public void start() {
            //     
        }
    
        @Override
        public void run() {
            //   、   
        }
    
        @Override
        public void refuel() {
            //     ,    
        }
    
        @Override
        public void charge() {
            //    、  
        }
    }
  • トヨタデュアルエンジンカムリ
  • //        
    public class ToyotaCamry implements Car {
    
        @Override
        public void start() {
            //     
        }
    
        @Override
        public void run() {
            //   、   
        }
    
        @Override
        public void refuel() {
            //    、  、   
        }
    
        @Override
        public void charge() {
            //    、  、          
        }
    }

    以上の例では、ハーバーVV 7は純ガソリン車であり、充電動作はない.反対にテスラモデル3は純電気自動車で、ガソリンを注ぐ行為はない.トヨタのカムリは2エンジン(ガソリン+バッテリー)車なので、ガソリンを注ぐことも充電することもできます.異なるブランドの異なる車種を見ることができ、実現する必要がない方法もあり、この場合、異なるタイプの車種の行為特性に対してインタフェースをそれぞれ設計することができる.
  • は従来の自動車インタフェースを再構築し、公共行為特性
  • を保持する.
    //     
    public interface Car {
        //   
        void start();
        //   
        void run();
    }
  • ガソリン車インターフェースと電気自動車インターフェース
  • を追加する.
    //    
    public interface OilCar extends Car{
        //       void refuel();
    }
    
    //     
    public interface ElectricCar extends Car {
        //   
        void charge();
    }
  • は3種類の自動車を再構築する:再構築後のインタフェースの多重性は
  • より高くなった.
    //   VV7   :          
    public class HavalVV7 implements OilCar{
        @Override    public void start() {
            //         }
    
        @Override    public void run() {
            //   、       }
    
        @Override    public void refuel() {
            //    、      }
    }
    
    //    Model3:          
    public class TeslaModel3 implements ElectricCar {
        @Override
        public void start() {
            //   
        }
    
        @Override
        public void run() {
            //   、   
        }
    
        @Override
        public void charge() {
            //    、  
        }
    }
          
     //        :           
    public class ToyotaCamry implements OilCar,ElectricCar {
    
        @Override
        public void start() {
            //     
        }
    
        @Override
        public void run() {
            //   、   
        }
    
        @Override
        public void refuel() {
            //    、  、   
        }
    
        @Override
        public void charge() {
            //    、  、          
        }
    }

    まとめ
    インタフェース分離の原則は高集約、低結合の設計思想に合致し、クラスに良好な可読性、多重性、拡張性、メンテナンス性を持たせることができる.インタフェースを設計する際には,後で変更が発生する可能性のある場所を予断するなど,ビジネスモデルを考えるのに時間がかかる.