クリーンアーキテクチャとオニオンアーキテクチャ

共通する目的

「システムの変更に強く、テストがしやすいコードを書くこと」


1. 共通のキーワード:依存性の逆転

これらのアーキテクチャを理解する上で最も重要なルールは、**「内側(ビジネスロジック)は、外側(データベースや画面)のことを知ってはいけない」**という点。

これを**「依存の方向を内側に向ける」**と言う。


2. クリーンアーキテクチャ (Clean Architecture)

ボブおじさん(Robert C. Martin)が提唱した、現在最も有名な設計思想の一つ。Clean Architecture diagramの画像

Shutterstock

4つの層

  1. Entities(エンティティ): 最中心部。ビジネスの根本的なルール。特定のアプリに依存しない(例:ECサイトなら「商品」「注文」の概念)。
  2. Use Cases(ユースケース): 「注文をキャンセルする」といった、アプリ固有のビジネスロジック。
  3. Interface Adapters(コントローラー/プレゼンター): 外側のデータを内側で使いやすい形に、あるいはその逆に変換する変換器。
  4. Frameworks & Drivers(Web/DB/外部サービス): 一番外側。DBやWebフレームワークなど、具体的で「変更されやすい」もの。

ポイント: データベースをPostgreSQLからMongoDBに変えたとしても、中心の「Entities」や「Use Cases」は1文字も書き直さなくて済むのが理想。


3. オニオンアーキテクチャ (Onion Architecture)

ジェフリー・パレルモが提唱したもので、クリーンアーキテクチャと非常によく似ている。

特徴

  • ドメイン中心: データの保存方法ではなく、「何をするプログラムか」というドメイン(業務知識)を中心。
  • タマネギの皮: 外側の層は、自分より内側の層にだけ依存する。
  • 依存性の注入 (DI): インターフェース(抽象)を内側に置き、実装(具体)を外側に置くことで、内側が外側に依存しないように制御する。

4. ヘキサゴナルアーキテクチャ (Ports and Adapters)

これらすべての元祖に近い考え方がこれ。Hexagonal Architecture diagramの画像

Shutterstock

特徴

  • ポート(港)とアダプター: 中心にあるアプリケーションを「六角形(ヘキサゴン)」に見立て、外の世界(DB、UI、テスト、他社API)を接続先として扱う。
  • 差し替え自由: 本物のDBをつなぐ「アダプター」も、テスト用のダミーをつなぐ「アダプター」も、同じ「ポート」に差し込むだけ、という考え方。

5. メリットとデメリット

メリット

テストが楽DBや画面がなくても、ロジックだけでユニットテストができる。
フレームワークに依存しないReactやRailsのバージョンアップ、フレームワーク自体の乗り換えに強くなる。
ビジネスルールが明確コードを読めば「何ができるシステムか」がすぐ分かり、仕様変更に対応しやすい。

デメリット

  • コード量が増える: データを変換するだけのクラスやインターフェースをたくさん作る必要がある。
  • 難易度が高い: チーム全員がこの思想を理解していないと、依存関係がぐちゃぐちゃになり逆効果。

6. 結論:どれを使うべき?

現代のWeb開発では、これらを厳格に守るというよりは、**「エッセンスを取り入れる」**のが主流。

  1. ビジネスロジックと、DBアクセスUI表示を分離する。
  2. インターフェースを使って、具体的なライブラリに依存しすぎないようにする。

まずはこの2点から意識するのが、保守性の高いコードへの近道である。