SOLID原則のまとめ

# はじめに
毎週金曜日の業務時間内にQiitaの記事を執筆する時間を貰えることになったので、この時間を利用して特に**自分の苦手な分野**の知識を深めていこうと思います。

今回は、SOLIDの原則についてまとめてみます。

# SOLID原則とは？
> In object-oriented computer programming, SOLID is a mnemonic acronym for five design principles intended to make software designs more understandable, flexible and maintainable. It is not related to the GRASP software design principles. The principles are a subset of many principles promoted by American software engineer and instructor Robert C. Martin.[1][2][3] Though they apply to any object-oriented design, the SOLID principles can also form a core philosophy for methodologies such as agile development or adaptive software development.[3] The theory of SOLID principles was introduced by Martin in his 2000 paper Design Principles and Design Patterns,[2][4] although the SOLID acronym was introduced later by Michael Feathers.[5]

引用元: https://en.wikipedia.org/wiki/SOLID


## 日本語訳(基本Google翻訳)
> オブジェクト指向プログラミング分野でのSOLID原則とは、ソフトウェア設計をよりわかりやすく、柔軟に、そして保守しやすくすることを目的とした5つの設計原則の略称です。 
GRASPソフトウェア設計の原則とは関係ありません。
この原則は、アメリカのソフトウェアエンジニアでありインストラクターのRobert C. Martinによって推進されている多くの原則のうちの一つです。
それらはあらゆるオブジェクト指向設計に適用されますが、SOLIDの原則はアジャイル開発やアダプティブソフトウェア開発のような方法論のためのコア哲学を形成することもできます。 
SOLIDという頭字語は後にMichael Feathersによって導入されましたが、SOLID原理の理論は彼の2000年の論文Design Principles and Design PatternsでMartinによって導入されました。


なるほど、、、
SOLID原則は、オブジェクト指向プログラミングでの5つの設計原則ということなんですね。

SOLID原則のそれぞれは、SRP、OCP、LSP、ISP、DIPの5つの原則の頭文字を綴ったものだそうです。

それぞれの5つの原則は、別途詳しく調べるとして、知らない単語もいくつかでてきたので、せっかくなので調べておきます。


## GRASP
> GRASP、General Responsibility Assignment Software Pattern あるいは ～Principle とは、オブジェクト指向設計において用いられる、クラスやオブジェクトに責務を割り当てる方針を導くパターンや原則である。Craig Larmanが著書「実践UML」で示した。

> GRASP で例として示される様々なパターンや原則として、「情報エキスパート (Information Expert)」、「生成者 (Creator)」、「コントローラ(Controller)」、「疎結合 (Low Coupling)」、「高凝集性 (High Cohesion)」、「多態性 (Polymorphism)」、「純粋人工物 (Pure Fabrication)」、「変動からの保護 (Protected Variations)」、「間接化 (Indirection)」がある。

引用元: https://ja.wikipedia.org/wiki/GRASP

色々な原則があるのですね。
こちらはまた別記事で調べていきたいと思います。


## Robert C. Martin
> Robert Cecil Martin, colloquially known as "Uncle Bob",[2] is an American software engineer and instructor. He is best known for being one of the authors of the Agile Manifesto[3][4] and for developing several software design principles. He was also the editor-in-chief of C++ Report magazine and served as the first chairman of the Agile Alliance.

引用元: https://en.wikipedia.org/wiki/Robert_C._Martin

### 日本語訳(基本Google翻訳)

> 口語的に "Uncle Bob"として知られるRobert Cecil Martinは、アメリカのソフトウェアエンジニア兼インストラクターです。
彼はAgile Manifestoの作者の一人であり、いくつかのソフトウェア設計原則を開発したことで最もよく知られています。
また、C ++ Report誌の編集長であり、アジャイルアライアンスの最初の会長を務めました。

なるほど、すごい人なんですね、、、

ググっていて発見しましたが、**有名な書籍**である

- [Clean Architecture 達人に学ぶソフトウェアの構造と設計](https://www.amazon.co.jp/Clean-Architecture-%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%A8%E8%A8%AD%E8%A8%88-Robert-C-Martin/dp/4048930656/ref=mp_s_a_1_1?_encoding=UTF8&imageClass=hi-res&keywords=%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3&phoneCarrier=wifi&phoneType=iPhone&qid=1560556899&rd=1&s=gateway&sr=8-1&view=Touch9)
- [アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技](https://www.amazon.co.jp/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%A5%A5%E7%BE%A9-%E7%AC%AC2%E7%89%88-%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E9%96%8B%E7%99%BA%E3%81%AE%E7%A5%9E%E9%AB%84%E3%81%A8%E5%8C%A0%E3%81%AE%E6%8A%80-%E3%83%AD%E3%83%90%E3%83%BC%E3%83%88%E3%83%BBC%E3%83%BB%E3%83%9E%E3%83%BC%E3%83%81%E3%83%B3/dp/4797347783/ref=mp_s_a_1_6?_encoding=UTF8&imageClass=hi-res&keywords=%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA&phoneCarrier=wifi&phoneType=iPhone&qid=1560556864&rd=1&s=gateway&sprefix=%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB&sr=8-6&view=Touch9)

- [Clean Code アジャイルソフトウェア達人の技](https://www.amazon.co.jp/Clean-Code-%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%81%94%E4%BA%BA%E3%81%AE%E6%8A%80-Robert-C-Martin/dp/4048930591/ref=asap_bc?ie=UTF8)



などの書籍は**Martin**さんが書いていたみたいです。

どれも有名な書籍のため是非自分も目を通しておきたいです。

ちなみに他にもいっぱい書籍を書いているみたいですが、他は全部英語のようでした...
https://www.amazon.co.jp/l/B000APG87E?_encoding=UTF8&redirectedFromKindleDbs=true&rfkd=1&shoppingPortalEnabled=true


# SOLID原則のまとめ
個別に詳細を記載していくと、時間内に書ききれずかなり重くなってしまいそうなため、ここでは概要だけ記載したいと思います。

次回以降に詳細に触れていけたらと思います。


| 略語 | 原則(英語) | 原則(日本語) | 意味 | 
|--------|--------|--------|--------|--------|
|SRP|Single Responsibility Principle|単一責務の原則|クラスを変更する理由は1つでなければならない|
|OCP|Open-Closed Principle|開放閉鎖の原則|クラスは拡張に対して開かれて、修正に対して閉じられていなければならない|
|LSP|Liskov Substitution Principle|リスコフの置換原則|派生型は基本型と置換可能でなければならない|
|ISP|Interface Segregation Principle|インターフェース分離の原則|クライアントが利用しないメソッドへの依存を強制してはならない|
|DIP|Dependency inversion principle|依存性逆転の原則|クライアントが利用しないメソッドへの依存を強制してはならない|


## 最後に
元々全部のSOLID原則を個別に調べてまとめようと思っていたのですが、重すぎて撃沈しました。(結局ほとんど内容がなくなってしまった....)

概要はわかったので、次回から地道に一個ずつ調べていきたい思います。