「Clean Architecture 達人に学ぶソフトウェアの構造と設計」を読んで

はじめに

約1年ほど前に書籍「Clean Architecture 達人に学ぶソフトウェアの構造と設計」を買ってずっと読んでいなかったのですが、最近アーキテクチャや設計周りの関心が強くなってきてようやく読む気になったので読みました。 所々読むのに飽きてきて読んでない章があったりしますが、感想を記しておこうと思います。

Amazon CAPTCHA

感想

本書ではソースコードレベルでの設計原則、コンポーネントレベルでの設計原則を解説してその後それらの設計原則をもとにアーキテクチャレベルの設計原則やプラクティスが語られていました。

その中で自分が感じたことは結局ソースコードレベルでもコンポーネントレベルでもアーキテクチャレベルでも高凝集疎結合が大事ということです。ほとんどの設計話は結局この2つの要素にたどり着くのではないかと思います。

例えばSOLID。分解すると

  • SRP: 単一責任の原則
    • モジュールを変更する理由を一つにするように高凝集にする
  • OCP: オープン・クローズドの原則
    • 拡張については開くように疎結合にし、修正については閉じるように高凝集にする
  • LSP: リスコフの置換原則
    • 交換可能となるよう実装には依存しないように疎結合にする
  • ISP: インターフェース分離の原則
    • 使用しない処理に依存しないようにインターフェースを分離し高凝集疎結合にする
  • DIP: 依存関係逆転の原則
    • 方針が実装詳細に依存しないように疎結合にする

というように凝集度、結合度の話に行き着くと思います。

他にもコンポーネントレベルでの設計原則として以下の6つの設計原則の紹介がありましたが、これも高凝集、疎結合の話に行き着くと思います。というかこの書籍ではそれぞれの原則を凝集度・結合度にカテゴライズして紹介していました。

  • 凝集度に関する原則

    • REP: 再利用・リリース等価の原則
      • 再利用の単位とリリースの単位が等価になるように高凝集にする
    • CCP: 閉鎖性共通の原則
      • 変更の理由がコンポーネントごとに同じになるように高凝集にする(SRPに近い)
    • CRP: 全再利用の原則
      • 実際に使わないものに依存しないようにするために、一緒に用いられるものはまとめて高凝集にする(ISPに近い)
  • 結合度に関する原則

    • ADP: 非循環依存関係の原則
    • SDP: 安定依存の原則
      • 安定度の高い方に依存させ、変更しやすいモジュールが依存されないように疎結合にする
    • SAP: 安定度・抽象度等価の原則
      • 安定度の高いコンポーネントは抽象度も高くする。すなわちSDPと組み合わせると抽象度の高い方に依存させて疎結合にする(DIPに近い)

このように設計の根本には高凝集・疎結合が存在していて、これらの要素を満たすように設計することが大事だなと思いました。

また、この書籍を読んでいく中で心に残った考え方として「優れたアーキテクトは方針に関係なく詳細を決める」というものがありました。この考え方は非常にDIPに近いと感じました。DIPに近いということは結合度の話に帰着させることができると思います。プログラマであろうとアーキテクトであろうと根本にある考え方は一緒なんだと思います。

さいごに

ということでこの書籍の感想を書きました。個人的にはソースコードレベル、コンポーネントレベルの設計原則を知れただけでもこの本を買って良かったなと思います。

次はこの書籍を読んで2年ほど前に購入して読んでいなかったIDDD本も読みたくなってきたので読もうと思います。

Twitterでまとめてた感想・あらすじ