SOLOD原則のSRPって他4つと少し雰囲気違いません?
SOLID原則のSRP(Simgle Responsibility Principal)、どうも他の4つと比較して少しだけ雰囲気が違う...ような気がする。
SOLIDと依存性と抽象とSRP
私はSOLID原則のことをざっくりと以下のように捉えている。
- 目的:
- 依存性の管理による保守性/拡張性/変更容易性の向上
(例: 修正による意図しないモジュールへの悪影響を防ぐ)
- 依存性の管理による保守性/拡張性/変更容易性の向上
- 手段:
- モジュール間にインタフェース
(orそれに類する抽象的&ファイアウォール的な役割を果たすもの)
を設置してモジュール間の依存関係を管理する
- モジュール間にインタフェース
なんて乱雑なまとめ方...でもそこまで大きくは外していないはず...(と思いたい)。
そして各原則は、いかにしてインタフェース(やそれに類するもの)を扱って依存性を整えるか?をメインに扱っていると思っている。
例えばDIP, ISPはインタフェース(というか抽象)をどう扱うか?どう構成するか?の話でまぁそのまんま。
OCPは定義はともかく実現の手段にはインタフェース(等)を使うし、LSPも少なくともSOLIDの文脈においてはインタフェース越しに入れ替え可能な部品としてのクラスの満たすべき原則、という意味合いが強いように感じる(いやこれは結構苦しいか?)
一方でSRPは他4つと比べると、インタフェースという文脈から比較的独立している(気がする)。
もちろんSRPを守ったクラスはインタフェースを用いた抽象化と相性が良いので、インタフェースの文脈と全く関係ないとは言えない(多分)
ただSRPはインタフェースを考慮せず、具象クラスに直接依存するような構成であっても十分に効果を発揮してくれる(ような気もする)
その意味で他の4つとは少し趣が異なる。(と言えなくもない)
などといってみたがよく考えるとこの論法は他のいくつかの原則でも成り立ちそうだ。
妄言かもしれない...
SRPとSOLIDの歴史的(?)な話
ただそんなことを思いながらSOLIDについての調査を進めるとwikipediaで以下のような記載を見つけた。
The principles are a subset of many principles promoted by American software engineer and instructor Robert C. Martin,[1][2][3] first introduced in his 2000 paper Design Principles and Design Patterns discussing software rot.[2][4]: 2–3
...
4. Martin, Robert C. (2000). "Design Principles and Design Patterns" (PDF). objectmentor.com. Archived from the original on 2015-09-06.
どうやらwikipediaによるとSOLIDに含まれる多くの原則は 2000 年の論文Design Principles and Design Patterns (by ボブおじさん)にて最初に紹介されたらしい。
読んでみると確かに OCP, LSP, DIP, ISP はここで紹介されている。一方でSRPは見当たらない。
OCP, LSP, DIP, ISPとセットの形で SRP が出された最初の契機は確認できる限りでは
Agile Software Development, Principles, Patterns, and Practices (2002年) (日本語訳は多分かの有名な「アジャイルソフトウェア開発の奥義」)
のようだ。
(SRPのwikipediaはブログ記事となっているが、そのままだと時系列的におかしい。でも実際にはブログ発な気もする...)
さらにSOLIDという名称で括られたのはその後2004年の様子。(Clean Architecture より)
SRP追加の経緯は...
じゃあどういう経緯でSRPが追加されたのかは...残念ながらわからなかった。
だから、この話はここでお終いなんだ...すまない...
最後に
SRPの追加経緯に誰か当時に詳しい人いたら教えてください。
あとSRPって他4つと少し雰囲気違うな、という私の妄言は案外的を射る部分も...あったりして。
Discussion