ISP =インターフェイスの棲み分け原理
次のようにISPが定義されています。
1、クライアントは自分の不要なインターフェースに依存しないでください
2、依存内の別のクラスへのクラスは、最小のインターフェイスに基づくべきです
図3に示すように、異なるインターフェースは、インターフェースの汚染である肥大化大きなインターフェースを形成するために一緒に組み合わされるべきではありません
4、より良い全体に単一のインターフェイスを使用するよりも、複数の特殊なインタフェースの使用
ISPの使用のためのいくつかの原則
1は、ときインターフェース分離インタフェースを分割の原則によれば、第1の単一責任の原則を満たしている必要があります完璧なデザインは、単に単一責任原則とインタフェースを分離する原則として、それはいくつかの設計原理間の競合することが可能で、アカウントにすべての設計原理を取りません、対価はインターフェースの統一の責任であり、設計上の考慮事項は、(できるだけ)プロの方法、それは確かに競合になりますです。矛盾する場合は、可能な限り単一の主な責任は、もちろん、我々は特定の状況を考慮しなければなりません。
図2は、高分子を改善するために:改善されたインターフェイス、クラス、モジュールの処理能力は、外部の相互作用を低減します。たとえば、あなたがキラーに注文を提出、このパフォーマンスは高い凝集である条件なしのタスクを完了するために、タスクを完了するためにキラー一週間後、一週間以内に人を殺すために彼に尋ねました。具体的には、それは次のようになります。インターフェイスは公表方法を必要にできるだけ少ない、インタフェースは、システムの開発にあまり多くの有益な外部のコミットメントであり、変更のコミットメントの小さいリスクでなく、コストを削減します。
図3は、カスタマイズされたサービス:優れたサービスを提供するには、別途個人として(訪問者が唯一のアプローチが必要)。
4、インターフェースのデザインは制限があります:経験に基づく判断
インターフェイスの分離単一責任の原則とコインの両側は、彼らが言うことを原理は一つのことです。
唯一のインタフェースの分離の原則は、サービスに、発信者の視点の問題を立っている、単一の原則義務は、ビューのサービス提供者のポイントの視点に立つことです。
================================================== =========================================
コンパクトは、それが起こったのかですか?
二つのことを言っている契約、私が契約している党は、党は、私が証書にあまりを与えないだろうと言うだろうと言うのは嫌です。
乙は、クラスがインタフェースを実装したときに、彼はすべてのメソッドを達成するためのインタフェースで存在しなければならないので、やることは比較的容易であることを以下ではありません。あなたは抽象メソッドを残したすべての方法を実現したくない場合は、抽象クラスを使用すると、フルサービス・プロバイダーではないことを、このクラスのインスタンス化することはできませんされています。当事者が少なく与えることはありませんので、それは必須です。
何より柔軟なルール当事者が、彼はデザインのものがない場合、我々は規律とコードを書くために皆を制御するために、いくつかの設計原理を使用する必要があります。コンパイラはBに検出することが可能であるため、以下で、パーティーにチェックアウトされていないがあまりないです。
だから、どのように私は、党がする持っていなかったことを知っていますか?ある場合だけで、発信者のインターフェイスタイプに渡さ見て、関数メンバへの呼び出しがなかっされていない、それは(太りすぎ)すぎに渡されたインターフェイスの種類を示し、他の言葉で、この脂肪インターフェイスは非常に簡単ですインターフェイスは大きなポートに渡さ小さいインターフェイスアップ、2つ以上の異なる性質の合併であり、インタフェースの一部だけが実行過剰の別の部分に、呼び出されます。
脂肪生成するインターフェースの原因に応じて、インターフェイス分離の原則の違反の悪い結果は、基本的に2つありますもたらすことがあります。
1、最初のケースでは、問題の設計は、インタフェースが来て、あまりにも多くの機能が含まれており、使用することをそこに持ってはいけませんその機能の一部が、インターフェイスは当然、分離の原則に違反しています。
私たちは例を見て:
シーンの説明:と呼ばれる少年たちに若い恋人たちの日の女の子のペアとは、梨花の雨を叫び、車が追突した彼に告げました。少女を同軸に小さな男の子高い感情的知性は、あなたが追突の恐れ、タンクのない購入明日、重要ではありませんと述べました。(女の子が唯一のオープンに~~~~、解雇することができないことを提供)
実現=「少女の初版は、唯一の他を開けないでください、車を運転します
#region车辆接口和实现インタフェースIVehicle { ボイド実行(); } クラスの車:IVehicle { 公共空ラン() { Console.WriteLineを(" カーが実行されました" ); } } クラストラック:IVehicle { 公共ボイド実行() { Console.WriteLineを(" トラックが実行されて" )。 } } #endregion
ドライバのカテゴリ:
クラスドライバ { プライベートIVehicleの_vehicle。 公共ドライバ(IVehicle車両) { _vehicle = 車両。 } 公共 ボイドドライブ() { _vehicle.Run()。 } }
サービスへの発信者:
VARドライバは= 新しい新しいドライバ(新新カー()); // オープンカーの ドライバー= 新しい新しいドライバ(新しい新しいトラック()); // オープントラック driver.Drive(); // この時、あなたは少女をしたい場合ていることがわかりますオープンタンク、それが今で満たすことができないされ 、// ドライバの設定パラメータの受け渡しがIVehicleインターフェイスであるため、インターフェースはITankではありません // あなたは女の子が街頭にタンクを開くことを望む会いしたい場合は、私たちが見る、ITankインタフェースを渡して、ドライバを変換する必要があります次の例 Console.ReadKey()。
実現=「少女の第二版は、車を開くことができませんタンクを開くことができますが、
クラスドライバ { プライベートITankの_tank。 公共ドライバ(ITankタンク) { _tank = タンク。 } 公共 ボイドドライブ() { _tank.Run()。 } }
VARドライバー= 新しい新しいドライバ(新新 HeavyTank()); // オープンタンク driver.Drive(); // この時あなたは小さな女の子が街頭に戦車を開発することができることがわかりますが、あなたが今だけその少女を見つけますオープンタンクではなく、ドライブ // 問題、それはありますか? // 私たちは、このインターフェイスは、我々は機能を使用する必要はありません脂肪を持って、渡される脂肪インタフェース(ITank)を入れ、火です。 // だから今、この設計は、分離インターフェースの原則に違反している // 次の例では、特定の変換ルック Console.ReadKey();
第三版の実現=「インターフェイス分離の原則に沿っは、タンクを開くことができる女の子は、車を彫ることができます。
#region车辆接口和实现インタフェースIVehicle { ボイド実行(); } クラスの車:IVehicle { 公共空ラン() { Console.WriteLineを(" カーが実行されました" ); } } クラストラック:IVehicle { 公共ボイド実行() { Console.WriteLineを(" トラックが実行されて" )。 } } #endregion
インタフェースIWeapon { ボイドファイア(); }
インタフェースITank:IVehicle、IWeapon { } クラスの軽戦車:ITank { 公共 空ファイア() { Console.WriteLineを(" ブーム!" ); } パブリック 無効実行() { Console.WriteLineを(" カーカーカー!" ); } } クラスHeavyTank:ITank { 公共 ボイドファイア() { Console.WriteLineを(" ブーム!!!!!!!! ")。 } 公共 ボイド実行() { Console.WriteLineを(" カ!!!カ!!!!カ!!!!!! " )。 } }
ドライバのカテゴリ:
クラスドライバ { プライベートIVehicleの_vehicle。 公共ドライバ(IVehicle車両) { _vehicle = 車両。 } 公共 ボイドドライブ() { _vehicle.Run()。 } }
サービスへの発信者:
// インターフェイス分離の原則は、発信者のサービスである必要はありません // 要件が実行されますされている、呼び出し側のオンデマンドサービスは非常に簡単です、この例を、火を必要としない // そのため、オリジナルの火を含ま独自のインタフェースをITankそして、脂肪インターフェイスに合わせてルール上で実行し、彼が呼び出し側に余分なインターフェースを提供し 、// そうITankをインタフェースがから隔離されている のvar =ドライバーの新しい新しいドライバ(新新 HeavyTank()); // オープンタンク driver.Driveを() ; ドライバは = 新しい新しいドライバ(新しい新しい車()); // 車運転 driver.Driveを(); Console.ReadKey();
後者の場合は、ハハすごい、明日続け~~~~~~~~~~