オブジェクト指向プログラミングでの設計原則を学んだので整理します。
これらにより柔軟性や再利用性の向上が図れ、全てのデザインパターンはこれらに沿っているとのこと。
Liskov Substitution Principle (リスコフの置換原則)
- 説明
- 親クラスのオブジェクトは、子クラスのオブジェクトによって置換可能でなければならない
- 親クラスの機能を、子クラスでも必ず使えるようにしなければならない
- そのためには、親クラスの機能は、十分に一般的なものでなければならない
- 親クラスのオブジェクトは、子クラスのオブジェクトによって置換可能でなければならない
- メリット
- 親クラスを使っているクライアントコードへの影響を抑えられる
- これを守ることで、次のOpen-Closed Principleも守ることができる
Open-Closed Principle (オープン・クローズドの原則)
- 説明
- クラスは拡張に対してOpenであり、変更に対してClosedであるべき
- 以下のときに設計・実装が完了したと考えられ、クラスはClosedだと認識される
- 正しく機能することが確認されている
- 全ての属性・動作がカプセル化されている
- クラスやインスタンスが、システムの動作を害する原因となっておらず、安定していると確認されている
- メリット
- 予期しない変更を防ぎ、安定性を保つ
- 拡張が可能(例:そのクラスを継承)
Dependency Inversion Principle (依存性逆転の原則)
- 説明
- クライアントがクラスを使用する際に、低レイヤーの具象クラスを直接使うのではなく、高レイヤーの汎化階層にアクセスし、具象クラスへのアクセスを間接化すべき
- 例
- インターフェースが具象クラスの動作を汎化し、クライアントはインターフェースのみにアクセスするようにする
- メリット
- システム内を疎結合にし、変更に対して柔軟、再利用が容易になる
Composing Object Principle (Composition over inheritance / 継承より合成)
- 説明
- 継承ではなく集約(合成)によって機能拡張を実現する
- 例
- 実現したい機能を持ったクラスを継承するのではなく、そのオブジェクトをプロパティとして使用する
- メリット
- 継承よりも疎結合にできる(継承で拡張すると、親クラスのプロパティ・メソッドを全て継承することになるため)
Interface Segregation Principle (インターフェース分離の原則)
- 説明
- インターフェースを小さく分割し、インターフェースを実装したクラスに対して不必要なメソッドの実装を強いらないようにする
- メリット
- 不必要な依存関係をなくし、疎結合を実現できる
Principle of Least Knowledge (最小知識の原則 / Law of Demeter / デメテルの法則)
- 説明
- あるメソッドから呼び出すメソッドは、以下に属するものに限定する
-
- 同一オブジェクト内
-
- そのメソッドの引数
-
- そのメソッド内で生成したオブジェクト
-
- 同一オブジェクトのインスタンス変数
-
- したがってメソッドのチェーンは避ける
- あるメソッドから呼び出すメソッドは、以下に属するものに限定する
- メリット
- 不必要なクラス間のアクセスをなくし、疎結合を実現できる
感想
これまで実装でやりがちだったこと(メソッドのチェーンなど)もアンチパターンだと指摘されていて、なぜそれがダメなのか理由が分かった。今後取り入れて実装していきたい。