TL;DR

アプリケーションの構成要素を、責務が定義された論理的なグループ(レイヤ)にまとめ、グループ間のやりとりの方法を定義して常に守る設計手法。

なぜ必要か

エリック・エヴァンスのドメイン駆動設計では、レイヤ化について次のように述べている。

ソフトウェアシステムを分割する方法にはあらゆる種類のものがあるが、経験と慣習を通じて業界が収束している共通見解はレイヤー化アーキテクチャである

RustによるWebアプリケーション開発 設計からリリース・運用までは、レイヤードアーキテクチャを採用する理由として、コードの秩序を保ちやすいことと、設計手法の理解や実装への導入が比較的手軽なことを挙げている。各レイヤに定義した責務ごとにコードを整理するので、関心の分離を守ったコードを残しやすい。どこに何があるかを把握しやすくなり、保守しやすさにつながる。また、従来の疎結合なコードベースを作る手法を組み合わせれば、比較的手軽に実装できる。

仕組み

基本のルールは「レイヤ間の通信は、必ずレイヤ内か、隣接するレイヤとだけ行う」ことである。このルールを守ると、コードを変更したときの影響範囲をレイヤ内に限定できる。

例

RustによるWebアプリケーション開発 設計からリリース・運用までのサンプルアプリケーションは、レイヤードアーキテクチャを採用している。

注意点

関心の分離を達成するために、レイヤごとにモデルのデータ型を定義する必要が出てくる。その結果、データを受け渡すときに似た構造のデータをひたすら詰め替えるバケツリレーが発生したり、似た処理をする関数が複数のレイヤに登場したりする。これは開発速度や保守性の低下につながる。従来のレイヤードアーキテクチャの問題点は、手を動かしてわかるクリーンアーキテクチャ 第2章でも扱われている。

関連

出典