TLDR
SOLID原則は曖昧性が高く混乱の元である。概して有用性は低く、適用範囲も限定的である。とても「原則」と呼べるようなものではない。
原則名 | 曖昧性 | 遵守すべき度 | 有害度 |
---|---|---|---|
単一責任の原則 | 高 | 低 | 高 |
開放閉鎖の原則 | 高 | 低 | 高 |
リスコフの置換原則 | 低 | 高 | 低 |
インターフェイス分離の原則 | 低 | 高 | 低 |
依存性逆転の原則 | 低 | 中 | 低 |
単一責任の原則(Single-responsibility principle)
概要
クラスを変更する理由は一つだけであるべきである。変更する理由とはアクター(マーケティング担当やセキュリティ担当など)のことである。
詳細
単一責任の原則 - Wikipedia に詳しい。
提唱者のRobert C. Martinによると、「責任」とは「変更の理由」のことであり、「変更の理由」とはユースケース図におけるアクターのことであるらしい。つまり、ある一つのモジュールに対し、経理担当者から来た要望により変更が入る場合とセキュリティ担当者から来た要望により変更が入る場合があるとしたら、それは単一責任の原則に反するということである。
確かに一考の価値はある指針ではあるが、本原則は良いモジュール分割の十分条件ではないことに注意したい。極端な例でいうと、どのアクターからも変更要望が来ないモジュール(ビジネスロジックに関係がないシステム的なモジュール)は自動的に本原則を満たすことになる。
一方、必要条件であるかも疑わしい。例えば、処理フローを担うモジュール(いわゆるサービスクラスなど)は複数のアクターが関わることが多い。
開放閉鎖の原則(Open/closed principle)
概要
モジュールは拡張に対して開いていなければならず、修正に対して閉じていなければならない。つまり、仕様追加の際、既存クラスや既存メソッドの修正なしに、新規クラスの追加で対応できる。
詳細
具体例としてはenumとswitch文をクラスの多態で書き換えるものしか見たことがない。実際のところ、switch文を多態で書き換えると、かえって保守性が下がる疑いがある。
以上から,オブジェクト指向でOpen-Closed Principleに対応するためには,
変更の可能性があるところを見つける
その部分を抽象化してクラスにしてしまう.
抽象クラスのサブクラスで変化に対応する
とすればよいことがわかります.これがOpen-Closed Principleを満たすオブジェクト指向ソフトウェアの戦略だといえます.http://objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/dp-ocp.html
上記は、DLLを利用したプラグインのような機構をイメージしているのだろうか。
確かに、アプリ(exe)に変更を加えずプラグイン(DLL)で機能追加できるのは優れた仕組みである。
しかしそれを実現するには綿密な設計が必要で、プラグイン公開後にはインターフェイス変更が困難であり、設計・仕様変更の足を引っ張る可能性が高い。とても一般的に適用すべき「原則」とは言えない。
リスコフの置換原則(Liskov substitution principle)
概要
サブクラスは親クラスに置き換え可能でなければならない。
【メリット】
これに反する場合、多態ができなくなる。
自明であり、遵守すべきである。
インターフェイス分離の原則(Interface segregation principle)
概要
インターフェイスには、全ての具象クラスが本当に必要とするメソッドを持たせること。
※ここで言うインターフェイスとはJavaなどの言語機能として用意されているinterfaceのこと。
詳細
【メリット】
具象クラスを実装する際、必要としないメソッドまで実装しなくて済む。
自明であり、遵守すべきである。
依存性逆転の原則(Dependency inversion principle)
概要
高水準モジュールは低水準モジュールに直接依存してはならない。
高水準クラスも低水準クラスもインターフェイスに依存させる。
インターフェイスは高水準モジュール側に含める。
詳細
【メリット】
高水準モジュールは低水準モジュールなしで開発できるようになる。
高水準クラス |
↓ 依存 | 高水準モジュール
インターフェイス |
↑ 依存 ------ ↑依存 ----------
低水準クラス | 低水準モジュール
DLLやpackageがある静的言語(JavaやC#等)では比較的有用である。インターフェイスを用意することにより実装コストは多少増加するものの、本原則の適用には一考の価値がある。