web-dev-qa-db-ja.com

より重要なことは何ですか? SOLIDまたはKISS?

より重要なことは何ですか? SOLIDまたはKISS?

SOLIDと一貫性を持たせるには、DecoratorクラスとFooterクラスを注入し、それらのインターフェイスを作成する必要があります。

public class HelloService {
   String name;
   HelloService(String name){
      this.name = name;
   }
   public String getHello() {
      Decorator decorator = new Decorator();

      String full = decorator.bar
              + this.name 
              + Footer.add(this.name);

      return full;
   }
}

public class Decorator {
    public String bar() {
        return "Some";
    }
}

public class Footer {
    public static String add(String name) {
        if (name.length() > 10) {
            return "A";
        } else {
            return "B";
        }
    }
}

それは誇張ではないでしょうか?

私の例は単純ですが、複雑な場合はどうすればよいですか?教室の他のクラスを1か所だけで使用する場合、それらも注入する必要がありますか?

ルールに準拠し、誰もが読めるようにクラスを改善するにはどうすればよいですか?

6
cimlihor

TLDR;

どちらも「より重要」ではありません。開発者は原則を提供しません。原則は開発者に役立ちます。彼らがあなたの目標を達成し、あなたを助ける方法と範囲でそれらを適用してくださいdeliver。


いくつかの校正ポイント:

  • D in SOLID is notDependency Injection ; it's Dependency Inversion Dependency InjectionInverting dependencyの主な解決策ですが、その重要な側面 [〜#〜] d [〜 #〜] は、実際に実際に変更される可能性のあるものを簡単に変更できるようにします。

  • [〜#〜] kiss [〜#〜] は、物事をシンプルで「愚か」に保つように開発者に思い出させるそのままそれはnot物事を作ることを提案more実際よりも簡単です。保守性、拡張性、または機能を犠牲にすることは義務付けられていません。 tank開発者の「シンプルさ」または「エレガンス」の感覚を満たすために、ビジネスのROIを要求することもありません。

  • ソフトウェアの原則は実用的です。単純なコードでも、依存関係が逆になったコードでも、test-drivenコードでも、本質的に「優れています」。良いコードは目的を果たします。コーディングの原則は、コードの目的を果たす範囲にのみ適用されます。

  • コードの目的を理解する必要がありますand原則。コードの目的を理解していない場合(保守性などの企業の「目標」を含む)、原則はほとんど役に立ちません。そして、もしあなたが原則を理解しなければ、とにかくそれらを実際に適用することはできません。

言い換えれば、 the POAP を適用します。これは、自分の単一記事の「ブログ」から恥知らずに引用します...

原則、パターン、および実践は最終的な目的ではありません。したがって、それぞれの優れた適切なアプリケーションは、より優れた、より最終的な目的に触発され、制約されます。

自分が何をしているのかを理解する必要があります。

(POAPはPOAPから免除されません。)

残念ながら、これを教えるのは難しいです。ドメインの専門家メンターがいない場合は、できる限りそれをいじってください。そして、次にこのコードに触れる必要があるときは、何が機能して何が機能しなかったかを自問してみてください。

17
svidgen

最も重要なことは、プログラムが機能し、期待される結果を提供することによってユーザーを幸せにすることです。しかし、昨日彼らを幸せにした理由は、明日彼らを幸せに保つにはもはや十分ではないかもしれません。

これが、2つの原則が競合しないが絡み合っている理由です。

  • KISSは、簡単な解決策を考え出すことで、気を散らすことなく最初の結果に集中するのに役立ちます。追加のボーナスとして、複雑さを回避することにより、KISSはバグの可能性を減らします。

  • ただし、実際の生活では、ユーザーは自分の考えを変え、開発中に新しいまたは忘れられた要件を追加する傾向があり、その後何年もの間システムが使用されることはありません。非常に頻繁に、コードは完成する前に進化する必要があります。 SOLIDは、より簡単に進化できる堅牢な設計を実現するのに役立つようです。

  • SOLIDおよびKISSは、同じソリューションを参照することさえできます

ソフトウェア開発の技術における主な課題は、2つのバランスを取ることです。できる限りシンプルにしてください。ただし、単純ではありません。同時に、SOLID)にして、重みを大きくしないでください。つまり、原則を盲目的に適用しないでください。


PS:プログラムはKISSでもSOLIDでもありません。 HelloServiceのメンバーとしてbar()およびadd()を持っているため、このソリューションはすでに過剰設計されています。

PS2:しかし、DecoratorFooterがカプセ​​ル化に値すると考える場合は、クラスを適切なDIで分離して、いくつかの異なるデコレーターとフッターを使用できるようにする(たとえば、ターゲットデバイスに応じてレイアウトを最適化する)ための将来の証明になります。

P.S.3:もちろん、DIを追加することは、コードの小さな部分では不釣り合いのようです。しかし、現実世界では、現実世界の複雑さのクラスでは、追加のDI作業が比例してはるかに遅くなることがよくあります

8
Christophe

SOLID自体は終わりではありません終わりを意味するです。あなたの例に適用すると、これは、コードをSOLID必要に応じて、それ以上でもそれ以下でもないようにすることを意味します。これはKISS原理にも一致します。

  • たとえば、単体テストの目的でHelloServiceDecoratorから分離する必要がある場合は、DIを使用します。機能テストまたは統合テストで十分だと思われる場合は、おそらくそれは必要ありません。

  • HelloServiceを再利用したいが、異なるデコレーターとフッターを使用する場合、パラメーターとしてそれらを注入することは、コードをDRYに保つためのおそらく最も「単純で愚かな」ソリューションです。デコレーターとフッターが1つしかない場合は、デコレーターとフッターに個別のクラスを用意する必要はないでしょう。

  • コンポーネント間に直接の依存関係を導入することを避ける必要がある場合、これは汎用libの一部であり、DecoratorおよびFooterのロジックはそのlibのユーザーによって提供される必要があるためです( OCP)、DIが必要になります

特にSOLIDからのDは、あなたがこれらの種類の問題を解決するためのおそらく最も単純な解決策であるため、KISSと完全に一致しています。

DIが(まだ)必要ない場合は、「念のため」使用しないでください。代わりに、YAGNI:DIの実際の要件が得られたらすぐにDIにリファクタリングしてください。

3
Doc Brown

原則と「ベストプラクティス」をそれらの目的を完全に理解せずに適用することは、非常に破壊的な場合があります。しっかりとしたDは悪名高いものです。

依存関係の逆転は、「インターフェースの使用」として多くの人に読み込まれます。これはそれほど遠くはありませんが、多くの人が、作成したすべてのクラスでインターフェースを平手打ちするきっかけになります。これは通常役に立ちません。

それが実際に意味することは、3番目のエンティティCを導入してAとBの間の依存関係を分離しようとすることです。次に、AとBの両方にCを知ってもらいますが、お互いは知りません。

これは有益な場合がありますが、すでに指摘されている他の人と同様に、目的を持っている必要があります。なぜそれをしているのかわからない場合は、知らないでください。

インターフェイスは、クラスのいくつかの動作の側面を定義するときに最も価値があります。それが彼らの第一の価値です。コードをテストできるという理由だけでそれらを使用することは、インターフェースの乱用です。これは通常、インターフェースが表すクラスと1対1の関係を持つインターフェースにつながります。これは、インターフェース分離の原則であるSOLIDのIに違反します。

Cat : IScratcher, IJumper, IPettable   // helpful

Cat : ICat    // utterly useless

そのため、テスト用にそのICatインターフェイスを作成する場合は、それがトレードオフであることに注意してください。あなたは基本的に「私はSOLIDのことは気にしない、私は自分のクラスをテストしたいだけだ」と言っています。

あなたが本当にすべきことは、IScratcher、IJumper、IPettableに対して別々のテスト方法を用意することです。

2
Martin Maat

固体。

KISSの問題は、「単純な」の定義は、質問する人によって異なります。コード例には、「単純な」インターフェイスのパターンで解決されるいくつかの具体的な問題があるため、 「静的」という言葉。

コードは長くなりますが、インターフェイスではcomplicatedではなくなります。

確かに、短くても間違いなくより複雑なコード、おそらく正規表現を書くことができますか?正規表現に慣れていた人は、「しかし、とても簡単です。なぜこれらすべてのクラスが必要なのですか?」

0
Ewan