TL;DR
- レイヤードアーキテクチャは、一緒に変更されるコードを別々の層に分けてしまう。
- ドメインコードを中心に置き、各層が内側の層にだけ依存するオニオンアーキテクチャを使う。
内容
レイヤードアーキテクチャ
レイヤードアーキテクチャでは、コードを次の層に分ける。
- コアドメインまたはビジネスロジックの層
- データベースの層
- サービスの層
- API または UI の層(またはその変形)
この構造は、「一緒に変更されるコードは、一緒に配置されるべき」という設計原則を破っている。各層が水平方向に組み立てられているので、ワークフローの動きを変えると、すべての層に手を入れる必要がある。
そこで、垂直方向のスライスに切り替えるとよい。各ワークフローに、その仕事を果たすすべてのコードを含める。要件が変わったら、そのスライスのコードだけを変えればよい。
しかし、ワークフローを横方向のパイプにしても、層が複雑に絡み合ったままでは、ロジックを理解したりテストしたりするのが不必要に難しくなる。
オニオンアーキテクチャ
オニオンアーキテクチャ(クリーンアーキテクチャ、ヘキサゴナルアーキテクチャ)では、ドメインコードを中心に置き、その周りに他の側面を配置する。各層は内側の層にだけ依存し、外側の層には依存しない。I/O の扱いはI/O を端に追いやるで扱う。