Clean Architectureについてわかりやすく解説しました
この記事について
Clean Architectureの本を読み、実際に業務でWebアプリを作った際に得られた知見をまとめたものです。Clean Architectureの本は難解のように見えますが、よく読むと著者の言っていることは極めてシンプルです。本記事ではそのエッセンスだけ抽出して、できる限りわかりやすく解説します。
対象読者
Clean Architectureの本を読んでみたが、結局よくわからない、長すぎて途中で挫折したという方。
まず本のどこを読むべきか
Clean Architectureははっきり言ってボリュームがあり、一から読んでいると要点がつかめなくなってしまうので、まずは5章と22章を読んで最重要概念を掴んでから、他の章を読みましょう。本記事では5章と22章の要点の解説を行います。
5章(オブジェクト指向プログラミング)には何が書かれているのか
まず、5章の最後に書かれている著者の言葉を引用します。
オブジェクト指向とは、「ポリモーフィズムを使用することで、システムにある全てのソースコードの依存関係を絶対的に制御する能力」である。
5章を総括すると、以上の一文にまとめられるわけですが、この「依存関係を絶対的に制御する能力」とは、具体的にどういうことなのでしょうか?
5章にある上の図をみてください。この図はポリモーフィズムを利用せず単純に構成されたアーキテクチャです(つまりよろしくない例)。
矢印が実線と点線の二つあることに注目してください。
実線は「ソースコードの依存関係(Source Code Dependency)」で、これはクラスHL1からクラスML1を呼び出すといったものです。
点線は「制御の流れ(Flow of Control)」とあります。制御の流れとは、例えばRailsやLaravelなどのFWだと、コントローラーでパラメータを受け取って、データベースにアクセスしてデータを取得し、それを加工してデータを返す、といった一連の処理の流れのことを指しています。
図の中では、実線と点線の向きが全て同じになっていますが、この向きを依存関係逆転というテクニックを用いて、点線の向きを逆転させることができます。詳しくは本を読んで欲しいのですが、ML1のインターフェースIをクラスHL1、ML1の間に挟み込み、ML1からIの依存とすることで、依存関係を逆転させるというテクニックです。
この依存関係を逆転させることができるということが、最初に紹介した「依存関係の絶対的な制御」のことを指します。
依存関係を逆転させることで、今まで制御の流れと同じ方向しか依存関係の方向を制御できなかったものが、自由に依存関係を制御できるようになったということです。
22章(クリーンアーキテクチャ)には何が書かれているのか
筆者は、クリーンアーキテクチャを上の4つの層に別れたものとして定義しています。4つの層は、エンティティ、ユースケース、インターフェースアダプター、フレームワークとドライバの4つで、内側にあるほどビジネスルールに近く、外側にあるほどデータの入出力に近いものとなります。
そして、4つの層は外側から内側にしか依存してはいけないというルールがあります。つまり、入出力といった重要度の低いレイヤーから、ビジネスルールといった重要度の高いレイヤーに対してしか、依存をしてはいけないというルールです(依存性のルール)。それによって、重要度の高いレイヤーは低いレイヤーに依存せずに分離させることができます。
しかし、図の右下にあるように、Webアプリケーションの典型的なシナリオでは、コントローラー=>ユースケース=>プレゼンターといった順に処理の流れは進んでいきます。それを、5章で出てきた依存関係逆転を使うことによって、依存性のルールを守ることができます。もし、依存関係逆転のテクニックを使えなければ、ソースコードの依存関係も処理の流れと同一となってしまい、依存性のルールを守ることができません。
これが、クリーンアーキテクチャの肝となるアイデアです。
まとめ
まとめると、オブジェクト指向にによる依存関係の絶対的制御の能力を使うことによって、重要度の高いレイヤーを低いレイヤーから分離させ、テスト可能性や、FW・DB・UI非依存性を高めたものが、クリーンアーキテクチャといえます。
5章と22章を読むことで、クリーンアーキテクチャの最重要な部分を理解することができたかと思います。
この部分を理解した後に、他の章を読むことでさらにClean Architectureについて理解を進められるかと思います。