web-dev-qa-db-ja.com

理解できないようですSOLID原理と設計パターン

OOP最近入りました [〜#〜] solid [〜#〜] の原則と設計パターンに問題があります。私はなぜ人々がそれらを使用するのかを理解し、私もそれらを使用したいのですが、クラスを仕様に合わせて開発することに頭を悩ませることはできません。

44
will

私は、デザインパターンに2週間費やした大学のクラスを受講し、 4人組 の本を読みましたが、役に立ちませんでした。 myの問題にどのパターンが役立ったか、それらをどのように使用して問題を解決するかを理解することは、OOプログラミング。

実際にクリックしてくれた本はHead First Design Patternsでした。それは問題を示すことから始まり、開発者が考えたさまざまなアプローチ、そしてそれを修正するために設計パターンをどのように使用したのかを示します。それは非常に単純な言語を使用し、本を非常に魅力的にします。

設計パターンは最終的にはソリューションを説明する方法になりますが、クラスをソリューションに適合させる必要はありません。それらを、さまざまな問題に対する適切な解決策を提案するガイドとして考えてください。

SOLIDについて話しましょう:

  1. 単一の責任。クラスの責任は1つだけです。つまり、たとえば、Personクラスは、データベース内での永続性などではなく、個人自体に関するドメインの問題のみを考慮する必要があります。そのために、たとえばPersonDAOを使用することができます。 Personクラスは、その責任をできる限り短くしたい場合があります。クラスが使用している外部依存関係(つまり、他のクラス)が多すぎる場合は、そのクラスが担当していることが多すぎるという症状です。この問題は、多くの場合、開発者がオブジェクトを使用して現実世界をモデル化しようとし、それを過度に実行しようとしたときに発生します。疎結合アプリケーションは、ナビゲートが非常に簡単でなく、現実の世界のしくみを正確にモデル化していないことがよくあります。
  2. Open Closed。クラスは拡張可能でなければなりませんが、変更はできません。つまり、クラスに新しいフィールドを追加することは問題ありませんが、既存のものを変更することはできません。プログラムの他のコンポーネントは、このフィールドに依存する場合があります。
  3. Liskov置換。サブタイプdogおよびサブクラスcatが渡された場合、animalタイプのオブジェクトを期待するクラスは機能するはずです。つまり、cat型のサブクラスは吠えることができないため、たとえば、Animalはbarkというメソッドを持つべきではありません。 Animalクラスを使用するクラスも、Dogクラスに属するメソッドに依存するべきではありません。 「この動物が犬の場合、(動物から犬へのキャスト)樹皮。動物が猫の場合、(動物から猫へのキャスト)ニャー」のようなことはしないでください。
  4. インターフェース分離の原則。インターフェイスをできる限り小さくしてください。 IStudentAndTeacherと呼ばれる単一の大きなインターフェースではなく、学生でもある教師はIStudentとITeacherの両方のインターフェースを実装する必要があります。
  5. 依存関係の逆転の原理。オブジェクトは依存関係をインスタンス化するべきではありませんが、それらに渡す必要があります。たとえば、内部にEngineオブジェクトを持つCarはengine = new DieselEngine()を実行すべきではありませんが、コンストラクターでエンジンに渡す必要があります。この方法では、carクラスはDieselEngineクラスに結合されません。
93
Uri