単一責任の原則- クラスを変更する理由は 1 つだけにする必要があります。モノリシックなクラスがある場合は、変更する理由が複数ある可能性があります。変更する理由を 1 つ定義するだけで、合理的な範囲で細かく設定できます。「大」から始めることをお勧めします。コードの 3 分の 1 を別のクラスにリファクタリングします。それができたら、新しいクラスからやり直してください。1 つのクラスから 20 のクラスに直接移行するのは非常に困難です。
オープン/クローズの原則- クラスは、拡張に対してオープンである必要がありますが、変更に対してはクローズされている必要があります。妥当な場合は、メンバーとメソッドを仮想または抽象としてマークします。各項目は比較的小さく、基本的な機能や動作の定義を提供する必要があります。ただし、後で機能を変更する必要がある場合は、コードを変更して新しい機能や別の機能を導入するのではなく、コードを追加できます。
Liskov Substitution Principle - クラスは、その基底クラスを置換可能でなければなりません。ここでの鍵は、私の意見では、継承を正しく行うことです。膨大な case ステートメント、またはオブジェクトの派生型をチェックする 2 ページの if ステートメントがある場合は、この原則に違反しており、アプローチを再考する必要があります。
インターフェイス分離の原則- 私の考えでは、この原則は単一責任の原則によく似ています。高レベル(または成熟した)クラス/インターフェースに特に適用されます。大規模なクラスでこの原則を使用する 1 つの方法は、クラスに空のインターフェイスを実装させることです。次に、クラスを使用するすべての型をインターフェイスの型に変更します。これにより、コードが壊れます。ただし、クラスをどのように消費しているかを正確に指摘します。それぞれ独自のメソッドとプロパティのサブセットを使用する 3 つのインスタンスがある場合、3 つの異なるインターフェイスが必要であることがわかります。各インターフェイスは、集合的な機能セットを表し、変更する理由の 1 つです。
依存性逆転の原則- 親と子の比喩は、私にこれを理解させました。親クラスを考えてみましょう。動作を定義しますが、汚い詳細には関係ありません。頼もしいです。ただし、子クラスは詳細がすべてであり、頻繁に変更されるため依存できません。あなたは常に親、責任あるクラスに依存したいと考えており、決してその逆ではありません。子クラスに依存する親クラスがある場合、何かを変更すると予期しない動作が発生します。私の考えでは、これは SOA の考え方と同じです。サービス コントラクトは、入力、出力、および動作を定義しますが、詳細はありません。
もちろん、私の意見や理解は不完全または間違っている可能性があります。ボブおじさんのように、これらの原則を習得した人から学ぶことをお勧めします。私にとって良い出発点は、彼の著書Agile Principles, Patterns, and Practices in C#でした。もう 1 つの優れたリソースは、Hanselminutes の Uncle Bob です。
もちろん、Joel と Jeff が指摘したように、これらは原則であって規則ではありません。それらはあなた方を導くためのツールであって、その土地の法律ではありません。
編集:
本当に興味深いこれらのSOLID スクリーンキャストを見つけました。1回につき約10~15分です。