SOLID

SOLID（ソリッド）は、ソフトウェア工学の用語であり、特にオブジェクト指向で用いられる五つの原則の頭字語である。ソフトウェア設計をより平易かつ柔軟にして保守しやすくすることを目的にしている。その特徴はインターフェースを仲介にしての機能の使用と、インターフェースによる機能の注入である。

この五つの原則は、アメリカのソフトウェア技術者が提唱していた数々の設計原則の中からチョイスされたものである。マーティンが提唱していた原則は、例えば2000年に発表されたレポート『Design Principles and Design Patterns』の中で紹介されている Talk given at the 2009 Gotham Ruby Conference.。そのうち五原則をSOLIDという語呂合わせの頭字語にして普及させたのは、ソフトウェア技術者マイケル・フェザーズであり、2004年以降に広く知られるようになった。SOLIDはオブジェクト指向設計由来であるが、アジャイルソフトウェア開発やといった方法論の哲学にもなっている。

 五つの原則 
SOLIDは、次の5つの原則からなる。

 単一責任の原則 (single-responsibility principle)
 開放閉鎖の原則（open/closed principle）
 リスコフの置換原則（Liskov substitution principle）
 インターフェース分離の原則 (interface segregation principle)
 依存性逆転の原則（dependency inversion principle）

 単一責任の原則 (single-responsibility principle) 
There should never be more than one reason for a class to change.これは、every class should have only one responsibility.とも言い換えられる。ここでの責務とは提供機能と同義である。この原則は、clientに特定の機能を提供する役割（role）役者（actor）としてのserviceのクラスに焦点を当てている。

この原則下のserviceは、それぞれ一つの機能または一つの役割しか持てない。この原則下のclientは、機能別に担当serviceを変更することになる。

 開放閉鎖の原則（open/closed principle） 
software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.
この原則下のinterfaceはその構成が不変になり、serviceは構成の変化が許される。serviceの構成変化は、継承によるサブクラス定義でなされるのが普通である。

 リスコフの置換原則（Liskov substitution principle） 
Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.この原則下のclientは、一つのinterfaceを通して、様々なserviceクラスを利用することになる。

 インターフェース分離の原則 (Interface segregation principle) 
Many client-specific interfaces are better than one general-purpose interface.この原則下のinterfaceは、様々に機能分化されて細かな用途ごとに定義されることになる。

 依存性逆転の原則（dependency inversion principle） 
High-level modules should not import anything from low-level modules. Both should depend on abstractions (e.g., interfaces), [not] concretions.この原則は、Mix-inをモチーフにして依存性の注入などのベースになっている。

この原則下のclientは、専門機能が分離されたモジュールにされる。その下位モジュールは専門機能の扱い方を変えたものにされる。専門機能とは、clientがinterfaceを通して利用するserviceであり、上位clientと下位clientは共に、専門機能interfaceに依存することになる。ここでのclientは具象であり、interfaceは抽象である。

 脚注 

 関連項目 
 依存性の注入
 GRASP
 コードの再利用

 Don't repeat yourself
 KISSの原則
 YAGNI（You aren't gonna need it）

Category:プログラミング原則
Category:オブジェクト指向
Category:ソフトウェア設計