クリーンアーキテクチャについて

業務でクリーンアーキテクチャを触ることがあったのでメモ。

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

有名な玉ねぎ図
内側にいくにつれてビジネスロジックに近づいていく。

クリーンアーキテクチャにも色々あり、ヘキサゴナルアーキテクチャ、オニオンアーキテクチャなどがある。また、ドメインロジックを重視するという意味ではDDD(ドメイン駆動設計)と親和性が高い。

複雑で大規模なシステムでGoやjavaで採用されるイメージだが、laravelなどでも採用されることがある。

メリット

各層が明確に分離されているため、

  • テストが書きやすい(ビジネスロジックが独立しているため、ユニットテストがしやすい)
  • 拡張性(新しい機能の追加が既存のコア部分に影響を与えにくい)
  • 保守性(変更・メンテナンスしやすい)
  • フレームワークやデータベースなども変更しやすい
    というメリットがある。

ruby on railsなどのMVCだとコントローラーに処理を書きすぎていわゆるfat controllerになりやすいと言われるが、それを防ぐことができる。

設計原則

  • 依存性逆転の原則
    高レベルのモジュールは低レベルのモジュールに依存してはいけない
  • インターフェース分離の原則
    各層の責任を明確にし、変更の影響範囲を限定

レイヤー構成

  • エンティティ(ドメインモデル)
    ビジネスルールや業務ロジックを表現
    ユーザー、商品、支払いなどのドメインオブジェクト

  • ユースケース(アプリケーション層)
    ユーザー認証や注文処理など、システムの具体的な振る舞いを定義

  • インターフェース(アダプター層)
    外部との通信や入出力を抽象化
    WebAPI, コントローラー、DBリポジトリなど

  • フレームワーク(外部層)
    Webフレームワーク、DB、UIなどの技術スタック
    フレームワークも柔軟に変更可能。