クリーンアーキテクチャを少し説明できるようになれる記事

# はじめに
クリーンアーキテクチャって最近流行ってるけどよく分からない。理解しようとすると結構学習コストがかかりそうだし、必要になったタイミングで改めて勉強しよう...と思っている人いると思います（自分がそうでした）
そんな人向けに、この記事さえ読めばなんとなくクリーンアーキテクチャの本質が分かるようになる記事を書いてみました。
自分なりの解釈も混じっている部分もありますがご了承ください。


# クリーンアーキテクチャとは

クリーンアーキテクチャとはビジネスロジック（ドメイン）を中心に置き、インターフェースの層や技術を外側に配置する設計アプローチです。
**よく誤解されがちですが「クリーンアーキテクチャ」というソフトウェアのアーキテクチャではありません。**
一般的に優れているアーキテクチャの共通点はこうだよね、典型的な実装例はこうだよね、ということについて述べられています。
[Clean Architecture本](https://amzn.asia/d/39SnETH)の表紙に「アーキテクチャのルールはどれも同じである！」と書かれている通りです。
つまり、Railsなどでアプリケーションの雛形を作成する際の new コマンドで自動生成されるようなファイルやディレクトリ構成のスナップショットのようなものではありません。
そのため、クリーン「な」アーキテクチャと表現した方がしっくりきます。

ヘキサゴナルアーキテクチャ（ポート&アダプタ）の影響を受けており、根幹の考えは両者とも同じです。
ポートとアダプタというと、Usecase（DDDでいうアプリケーションサービス的な役割）のPortという表現はまさにそのように感じます。
両者に言えることですが、外部のフレームワークやデータベースといった「技術的な詳細」を最外層へ追いやり、一番大切なビジネスロジックを中心に配置します。
依存方向が肝となり、ビジネスロジックは技術的な詳細に依存してはいけません。技術の詳細がビジネスロジックに依存するようにします。
外側から中心という一方向に依存するようにコントロールすることで、変更に強くテストも容易な持続可能なソフトウェア開発が可能になります。
一言で言うと、こんな感じになるかと思います。
- 変更に強いソフトウェア設計法
- ドメイン（ビジネスロジック）が技術から独立したアーキテクチャ
- ビジネスロジック中心の設計法
- 層分けされた依存性逆転の設計法

# じゃんけんアプリで例えてみる

正直今までの説明だと抽象的すぎてイメージしにくいかと思うので、具体例を出してみます。
例えばじゃんけんアプリで例えてみましょう。
じゃんけんでは「パーはグーに勝つ」というビジネスルールがあります。
このビジネスルールは、じゃんけんがじゃんけんとして成り立つ上でとても大切なルールです。
DBがMySQLからMongoDBに変わろうが、「パーはグーに勝つ」というルールは影響を受けてはいけません。
クリーンなアーキテクチャは技術の詳細とビジネスロジックが疎結合のため、このような技術的な詳細の変更がビジネスロジック（ユースケースやドメインオブジェクト）に影響を与えることなく変更することができます。

# クリーンアーキテクチャが重要視していること
クリーンアーキテクチャは、特段新しい考えやアプローチではありません。
**依存方向**や**関係性の分離**や**SOLID原則**を特に尊重した設計方針なのです。
個人的にはSOLID原則のうち以下の二つが特に強く現れていると思います。
- 依存性逆転（DIP）の原則
   - ドメイン層（ビジネスルールなどが配置される）が技術的な詳細に依存しないようにする上でこの原則を使う  
- 単一責任の原則
   - 各層が一つだけの責任を持つためにこの原則を使う。Enterprise Business Rules層（ドメイン層）はビジネスルールを担当し、Frameworks & Drivers層（インフラ層）は技術の詳細を担当するなど

特に、依存性逆転の原則はクリーンアーキテクチャの本質でもあるので、あらかじめ理解しておいてください。
# ドメイン駆動設計と相性が良い理由

「ドメイン駆動設計 アーキテクチャ」と調べると、必ずと言って良いほどクリーンアーキテクチャやヘキサゴナルアーキテクチャ、オニオンアーキテクチャが登場します。なぜでしょうか？


ドメイン駆動設計は、ビジネスの核心となるドメインを理解し、その知識を基にソフトウェアを設計するアプローチです。
しかし、システムである以上、フレームワークやデータベースなど技術的な詳細を利用・差し替え・バージョン更新していく必要があります。
重要なドメインオブジェクトは、これらの影響を受けずに守り抜きたいですよね。


これらのクリーンなアーキテクチャは、ビジネスロジックを中心に考え、依存関係の方向をコントロールすることで、技術的な詳細を外側に追いやります。つまり、ドメイン駆動設計で構築したドメインオブジェクトを守りやすくなります。このため、これらと相性が良いとされています。

もちろん、xxxアーキテクチャのような言葉は重要ではなく、本当に大事なのはそれらが大切にしている思想です。

# よくある誤解 - 図の通りの完璧な層を分けること・図が大事であること
以下の同心円は見たことありますか？
![](https://storage.googleapis.com/zenn-user-upload/e0d8171bb822-20230924.png)

右下の矢印の図は処理の流れを具体的に表現しています。
黄色のEntitiesや赤いUseCasesはドメイン駆動設計の思想が特に強く現れます。
中心に向かっている矢印の向きが大事だ...というのは色々な記事で言及されていると思います。


しかしこの図をみる上で注意しなければならないことがあります。
それは、「必ず図通り、全部の層に分ける必要がある」という誤解です。
私も最初そのように思っていたのですが、実際にRobert C. Martin (Uncle Bob)氏の[記事](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html#:~:text=do%20little%20harm.-,Only%20Four%20Circles%3F,-No%2C%20the%20circles)を見るとそうではないと言及されています。

> Only Four Circles?
No, the circles are schematic. You may find that you need more than just these four. There’s no rule that says you must always have just these four. 

機械翻訳
> 4つの円だけ？
いいえ。この4つ以外にも必要なものがあるかもしれません。常にこの4つだけでなければならないというルールはありません。

**つまり、この図の通り全部の層に分ける必要もなく、依存関係をしっかりコントロールすることが重要だということです。**

ちなみに彼は図の意味は以下の通りだと[述べています。](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html#:~:text=The%20diagram%20at%20the%20top%20of%20this%20article%20is%20an%20attempt%20at%20integrating%20all%20these%20architectures%20into%20a%20single%20actionable%20idea.)

> The diagram at the top of this article is an attempt at integrating all these architectures into a single actionable idea.

機械翻訳
> この記事の冒頭にある図は、これらすべてのアーキテクチャを 1 つの実行可能なアイデアに統合する試みです


この図があまりにも有名になりすぎてしまったため、誤解している人も多いのではないのかと思います。
あくまで参考程度にしておきましょう。

**また、ディレクトリ構成やパッケージ構成も図の通りに分ける必要がありません。**
エンジニアがそのパッケージ構成を見た際に、「このアプリケーションは何ができるのか？」が伝わるような構成にします。
例えば、勤怠システムであれば、そのリポジトリの中身の構成を見たときに「これは勤怠システムなんだな」と分かるような構成にします。
層を意識した構成よりも、ユースケースを中心にした構成を考えると「このアプリケーションは何ができるのか？」が伝わりやすいです。
個人的には層で分けた構成もそれはそれで良いと思っており、チームや自分で意思決定した構成であれば何でも良いと考えています。
詳しくは「叫ぶアーキテクチャ」と調べてみてください。


# まとめ


- クリーンアーキテクチャというアーキテクチャは存在しない。優れたアーキテクチャの共通点を述べており、どのように活かすかはあなた次第
- ビジネスルールを中心に置き、技術的な詳細は外側に追いやる設計方針
- ビジネスルールが技術的詳細に依存してはならない。技術的詳細がビジネスルールに依存しなければならない
  - それを実現するために依存性逆転の原則（DIP）が関わってくる 
- 同心円の図の通り層を再現する必要はない。依存関係を適切にコントロールすることが重要
- ヘキサゴナルアーキテクチャや依存性逆転の原則を先に学んでおくと理解がスムーズ


# 参考記事
- [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=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=271UIOAK2ZOVJ&dib=eyJ2IjoiMSJ9.MKtrGDnbxVCK4r5WC1vE2P2tnz90ubBifH_qJsaiZfsybJ-0IQyMXouwYc4Kt7YpflWtQbK7JYZ8X3DeEozd9E-iAyHMnmImAIsg-pM6pIAm6nryyBfC31hvOd-no83oml5h64TCiOY1IU6yRzinMwhon_oaDrXQnTglIrx-fFRDbo7bIuqPfL85q-4qVjSIJmb5ZvF6DHStmTybWGeyqCPqw2ZpCa8pEXQ1QqXIiSM.VRFa5F9I-zZFMTWoKIrpbd-6CIW5skA3P1-Z5_P-x84&dib_tag=se&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&qid=1743226503&s=books&sprefix=%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%2Cstripbooks%2C141&sr=1-1)
- [The Clean Architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)
- [Software Design (ソフトウェアデザイン) 2023年6月号 [雑誌]](https://www.amazon.co.jp/Software-Design-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3-2023%E5%B9%B46%E6%9C%88%E5%8F%B7-%E9%9B%91%E8%AA%8C-ebook/dp/B0C4K9X2XV/ref=sr_1_6?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1KOO9EMXC98KG&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&qid=1695535163&sprefix=%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%2Caps%2C261&sr=8-6p)
- [手を動かしてわかるクリーンアーキテクチャ　ヘキサゴナルアーキテクチャによるクリーンなアプリケーション開発](https://www.amazon.co.jp/%E6%89%8B%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%82%8F%E3%81%8B%E3%82%8B%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-%E3%83%98%E3%82%AD%E3%82%B5%E3%82%B4%E3%83%8A%E3%83%AB%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%AB%E3%82%88%E3%82%8B%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%81%AA%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-Tom-Hombergs/dp/429501978X)