「Clean Architecture 達人に学ぶソフトウェアの構造と設計」を読んで
はじめに
約1年ほど前に書籍「Clean Architecture 達人に学ぶソフトウェアの構造と設計」を買ってずっと読んでいなかったのですが、最近アーキテクチャや設計周りの関心が強くなってきてようやく読む気になったので読みました。 所々読むのに飽きてきて読んでない章があったりしますが、感想を記しておこうと思います。
感想
本書ではソースコードレベルでの設計原則、コンポーネントレベルでの設計原則を解説してその後それらの設計原則をもとにアーキテクチャレベルの設計原則やプラクティスが語られていました。
その中で自分が感じたことは結局ソースコードレベルでもコンポーネントレベルでもアーキテクチャレベルでも高凝集と疎結合が大事ということです。ほとんどの設計話は結局この2つの要素にたどり着くのではないかと思います。
例えばSOLID。分解すると
- SRP: 単一責任の原則
- モジュールを変更する理由を一つにするように高凝集にする
- OCP: オープン・クローズドの原則
- 拡張については開くように疎結合にし、修正については閉じるように高凝集にする
- LSP: リスコフの置換原則
- 交換可能となるよう実装には依存しないように疎結合にする
- ISP: インターフェース分離の原則
- 使用しない処理に依存しないようにインターフェースを分離し高凝集、疎結合にする
- DIP: 依存関係逆転の原則
- 方針が実装詳細に依存しないように疎結合にする
というように凝集度、結合度の話に行き着くと思います。
他にもコンポーネントレベルでの設計原則として以下の6つの設計原則の紹介がありましたが、これも高凝集、疎結合の話に行き着くと思います。というかこの書籍ではそれぞれの原則を凝集度・結合度にカテゴライズして紹介していました。
凝集度に関する原則
結合度に関する原則
このように設計の根本には高凝集・疎結合が存在していて、これらの要素を満たすように設計することが大事だなと思いました。
また、この書籍を読んでいく中で心に残った考え方として「優れたアーキテクトは方針に関係なく詳細を決める」というものがありました。この考え方は非常にDIPに近いと感じました。DIPに近いということは結合度の話に帰着させることができると思います。プログラマであろうとアーキテクトであろうと根本にある考え方は一緒なんだと思います。
さいごに
ということでこの書籍の感想を書きました。個人的にはソースコードレベル、コンポーネントレベルの設計原則を知れただけでもこの本を買って良かったなと思います。
次はこの書籍を読んで2年ほど前に購入して読んでいなかったIDDD本も読みたくなってきたので読もうと思います。
Twitterでまとめてた感想・あらすじ
買って全然読んでなかった本のClean Architectureやっと読み出した
— Ryutaro Kawaguchi (@kawakawaryuryu) 2020年3月24日
第5章はOOの真価は依存関係逆転にあるよねって話だった
— Ryutaro Kawaguchi (@kawakawaryuryu) 2020年3月24日
第6章は関数型プログラミングは不変性を重視してるって話。不変なことによって可変な時に生まれる競合やデッドロックを考えなくていい。Lispはパッと見よく分かんなかった
— Ryutaro Kawaguchi (@kawakawaryuryu) 2020年3月26日
第7-11章はSOLIDの話で、雑にまとめるとSRP以外はインターフェース切ろうな!って話でSRPは凝集度意識しような!って話だと感じました
— Ryutaro Kawaguchi (@kawakawaryuryu) 2020年3月29日
12-14章はコンポーネントの原則の話。読んでるとだいたいSOLIDが根本にあると感じる。CCP, CRP, SDP, SAPあたりはそう。あと原則が対象とする物の粒度が変わっても結局凝集度と結合度の話に帰着してるなと感じる。
— Ryutaro Kawaguchi (@kawakawaryuryu) 2020年3月30日
ちょっと間が空いたけど続き読んだ。15章はアーキテクチャについて。良いアーキテクチャは開発、デプロイ、運用、保守が容易。良いアーキテクトはプロダクトの方針とは関係なく詳細(何のDB使うか、何のwebサーバ使うかなど)を決める。この辺の考え方もISPやDIPに通ずる所があると感じる。
— Ryutaro Kawaguchi (@kawakawaryuryu) 2020年4月19日
16章はアーキテクチャの独立性についてで、優れたシステムは水平(UI、ビジネスルール、DBなど)にも垂直(ユースケース)にも切り離せている。それにより他の変更から影響を受けずに済む。大事。
— Ryutaro Kawaguchi (@kawakawaryuryu) 2020年4月19日
17章はビジネスルールとDBやUI間のようなビジネスルールには関係ないものとの間には境界線を引くことで具体的なDBやUIとは独立して開発できるしそれらを何にするか後から決定できていいよねって感じだった(意訳)
— Ryutaro Kawaguchi (@kawakawaryuryu) 2020年4月19日
18章は境界の種類は内部のパッケージ間、モジュール、スレッド、プロセス、サービスなどいろいろあるよねって話
— Ryutaro Kawaguchi (@kawakawaryuryu) 2020年4月21日
19章は方針も分解すると上位レベルの方針と下位レベルの方針とあって下位の方が変更の頻度・影響が大きいので下位が上位に向いていれば影響は小さくできるよねってこと。結局ここでもSRP, DIPが根底にあると感じる。
— Ryutaro Kawaguchi (@kawakawaryuryu) 2020年4月21日
20章はビジネスルールはエンティティに、アプリケーション固有のルールは
— Ryutaro Kawaguchi (@kawakawaryuryu) 2020年4月21日
ユースケースに記述しようとのこと。この辺から実装に近い話になってきたな。オニオンアーキテクチャを感じるぞ。
21章、叫ぶアーキテクチャ。優れたアーキテクチャはどんなユースケースなのか叫んでるらしい。
— Ryutaro Kawaguchi (@kawakawaryuryu) 2020年4月23日
22章、クリーンアーキテクチャの話。大事なのは依存が絶対外から内にしか行かないこと
— Ryutaro Kawaguchi (@kawakawaryuryu) 2020年4月23日
23章はHumble Objectというテストのしづらいモジュールとテストのしやすいモジュールに分けることでシステム全体としてテストがしやすくなるよねって話
— Ryutaro Kawaguchi (@kawakawaryuryu) 2020年4月29日
つーかだんだん当たり前の話になってきて読むの辛くなってきた
— Ryutaro Kawaguchi (@kawakawaryuryu) 2020年4月29日
途中すっとばしたけど最後の2章は事例に沿って書かれてて楽しかった
— Ryutaro Kawaguchi (@kawakawaryuryu) 2020年4月29日