クリーンアーキテクチャについて考察してみた

@aintek on Sun Sep 08 2019
6.0 min

目次

参考文献

先に本記事を書くにあたって参考にした文献を示す。

クリーンアーキテクチャの目的

関心の分離

少なくとも以下のレイヤーが存在する。

  • ビジネスルールのレイヤー
  • インターフェースのレイヤー

_
クリーンアーキテクチャを適用した場合、以下のようなシステムを生み出す(らしい)。

  • フレームワークやライブラリ、モジュールに依存しない。つまりフレームワーク等の制約の影響を受けない
  • 外部の要因を受けずにテストが可能
  • UIが独立しており、他の要因を受けずに変更が可能
  • データベースが独立しており、DBの種類によらず、ビジネスルールはDBの種類による影響を受けない
  • ビジネスルールが外部の影響を受けない
    • つまり外部のフレームワークやライブラリ、モジュールについてそれらがどのような設計になっているかなどを知らない状態

_
クリーンアーキテクチャを表現する図は、ソフトウェアの領域を層として表現している。
内側がシステムの方針を定めており、外側はその方針を実現するための仕組みを表現している。

クリーンアーキテクチャには、依存ルールという言葉がある。

  • 内側の円は、それより外側にある円について何も知らないというルール
  • 外側の円で定義及び利用されるデータフォーマットを、それよりも内側の円で利用しないというルール

_
クリーンアーキテクチャを構成する要素は以下のとおり。

  • エンティティ
  • ユースケース
  • インターフェースアダプタ
  • フレームワークとドライバ

_
もちろん、この4つ以外の層を追加しても良い。
ただし、依存ルールは守ること。

エンティティ

ビジネスルールを書くレイヤ。
このレイヤにはビジネスルールを扱うためのデータ構造やそれらを操作するメソッドが実装される。
これを「アプリケーションのビジネスオブジェクト」と呼ぶことにしよう。

このビジネスオブジェクトは、外のレイヤ(例えばページナビゲーションやセキュリティなど)の影響を受けない。
逆に言えば、外のレイヤはエンティティレイヤに影響を与える設計であってはいけない。

ユースケース

このレイヤでは、ビジネスシーンに応じたエンティティへのデータの流れを実装する。
このレイヤはエンティティレイヤに影響を与えてはいけないし、
外のレイヤ(フレームワークやライブラリ、モジュールなど)から影響を受けない。

このレイヤに変更が入る場合は、ユースケースが変化する場合のみである。
※ユースケースには単なるメソッド呼び出しのみ定義されるのかデータ構造も含むのかわかっていない。

インターフェースアダプタ

このレイヤでは、「ユースケース(エンティティ)」から「フレームワークとドライバ層」で利用するためのデータフォーマットを行う。

※正直なところ、このレイヤで具体的にどのような実装を行うのか分かっていない。

このレイヤは、MVCモデルのビューやコントローラのような役割を持つ(らしい)。
※本当にここにそんなに詰め込んでよいのだろうか。
※まぁここがビューやコントローラの役割を担うというのは分からなくないが・・・
※ただ、これを実装しようとした場合、このレイヤの機能を実現するにはディレクトリ名が一意に決まらず、
組織内での認識の合意が取れている必要があると考える。

フレームワークとドライバ

このレイヤには、フレームワークやライブラリが含まれる。
つまりウェブアプリケーションフレームワークやDBクライアントライブラリはここで利用することになる。

キーとなる考え方(DIP)

上記の記事では、

  • 安定したモジュール方向へ依存するような設計にする
  • 安定したモジュールとは下位モジュールであることが多いため依存関係は逆転する、という発想
  • つまりDIPは、不安定なモジュールへの依存を安定なモジュールへの依存に変える、というもの

と言っている。
これが正しいかどうかはまだわからないが、わからなくはないという感想。

※クリーンアーキテクチャでは、これを実現するための手法としてインターフェースとアダプタが定義されているのだと思う。

クリーンアーキテクチャにおいて、あるレイヤから別のレイヤへデータが移動する際は、
これらのレイヤをしっかりと隔離・分離するためにレイヤ毎のデータ構造で受け渡しするべきだ。
つまり、エンティティやDBのデータをそのまま別のレイヤに渡すべきではない。

さいごに

クリーンアーキテクチャによって達成したことは、以下の通り。

  • ざっくり言うと関心の分離できる
  • 上記による外部のフレームワークやライブラリ、モジュールといった要素との分離が可能
  • これらによって、他の要素の影響を受けずにテスト可能
  • 各レイヤの独立性が高いため、各々のレイヤは容易に置き換え可能であり、他のレイヤに影響を及ぼさない

だと思う。
つまり、これらが実現できる実装であれば、それはクリーンアーキテクチャと言えると思う。

日別に記事を見る