2012-12-03 11 views
17

最近OOPに取り掛かりたいと思っています。私はSOLIDの原則とデザインパターンで問題があります。私はなぜ人々がそれらを使用するのかを見ています。私も本当に使いたいと思っていますが、私のクラスを仕様に近づけることはできません。私はそのようなことの理解に役立つものを本当にありがたく思っています。SOLID原則とデザインパターンを理解できないようです。

+1

私はこのことをよく理解しているのは、仕事の経験だけであり、重要なのは良い開発者のチームでの経験です。 – sll

+0

あなたはもう少し具体的でなければならないと思います。 –

+0

アンチパターンから学習してみてください。意図的にSOLIDのアドバイスに違反する小さなアプリと、アドバイスに従っているアプリを書いてみて、書くのが苦痛ではないものを見てみてください。 – MatthewMartin

答えて

51

私は大学で2週間のデザインパターンを費やし、Gang of Four本を無駄に読んでいます。それぞれのパターンがどのようなものだったかを理解し、それらをどのように使ってフィットするのかを理解することは、OOプログラミングの経験があまりない開発者である私にとっては非常に難しい問題でした。

実際に私をクリックした本はHead First Design Patternsでした。まず、問題を表示し、開発者が検討したさまざまなアプローチ、そしてそれを修正するためにデザインパターンを使用し終わった方法を示します。それは非常に単純な言語を使用し、本を非常に魅力的に保ちます。

デザインパターンは解決策を説明する方法になりますが、には、ソリューションにクラスを適合させるためのがありません。さまざまな問題を解決するうえでの参考になるものと考えてください。

はのは、SOLIDについてお話しましょう:

  1. シングル責任。クラスには1つの責任しか持たないでください。つまり、Personクラスは、たとえば、データベース内での永続性などではなく、Person自体に関するドメインの問題についてのみ心配する必要があります。そのためには、たとえばPersonDAOを使用することができます。 Personクラスは責任を最短で保つことができます。あるクラスが多すぎる外部依存関係(他のクラス)を使用している場合、それはクラスの責任が多すぎるという症状です。この問題は、開発者がオブジェクトを使用して実際の世界をモデル化し、あまりにも遠くに持ち越そうとするときによく起こります。疎結合のアプリケーションでは、ナビゲートするのが簡単ではなく、実際の動作を正確にモデル化していないことがよくあります。
  2. 開封。クラスは拡張可能でなければなりませんが、変更はできません。つまり、新しいフィールドをクラスに追加するのは問題ありませんが、既存のものを変更することはできません。プログラム上の他の構成要素は、前記フィールドに依存してもよい。
  3. リスコフ置換。サブクラスのdogとsubclassのcatが渡された場合、動物型のオブジェクトを予期するクラスが動作するはずです。つまり、Cat型のサブクラスは樹皮できないため、Animalはbarkと呼ばれるメソッドを持つべきではありません。 Animalクラスを使用するクラスは、クラスDogに属するメソッドに依存してはいけません。 「この動物が犬ならば、(動物を犬に投げつける)樹皮なら、動物が猫ならば(動物を猫に投げつける)猫」。
  4. 界面分離原理。できるだけインターフェースを小さくしてください。学生でもある教師は、IStudentAndTeacherと呼ばれる単一の大きなインターフェイスではなく、IStudentインターフェイスとITeacherインターフェイスの両方を実装する必要があります。
  5. 依存性逆転原理。オブジェクトは依存関係をインスタンス化するべきではありませんが、それらはそれらに渡されるべきです。たとえば、Engineオブジェクトを内部に持つCarは、engine = new DieselEngine()ではなく、エンジンがコンストラクタで渡されるべきであると言います。この方法では、車クラスはDieselEngineクラスに結合されません。
+5

+1 GoFのデザインパターンの本は理解しづらい。ヘッド・ファースト・ブックは、プログラミングの次のレベルに到達するために絶対に読まなければならないものです。 –

+7

** 1)**変更する理由が1つあるはずです。それは1つの責任とは異なります。 ** 2)**いいえ、あなたはクラスをまったく変更すべきではありません。拡張は継承と同じです。 ** 3)** CanBarkメソッドを持っていれば 'Bark'メソッドを持つことができます。 ;)** 4 **正しい、しかしかなり不自由な例;)** 5 **それは依存性注入です。依存関係の逆転は、抽象化に依存すべきであり、上位レベルのモジュールは下位レベルのモジュールに依存する必要があり、その逆ではないことを示しています。 – jgauffin

+0

その本を読み始めました。それは重要な助けです。ありがとう。 – will

関連する問題