🧅

とても雑なレイヤードアーキテクチャのイメージ

に公開

はじめに

レイヤードアーキテクチャが全くわからんという人向けに,とてもざっくりとしてたイメージをまとめた.

なんとなくイメージを掴んで,詳しい解説を読んだり調べたりしてほしい.

レイヤードアーキテクチャとは

レイヤードアーキテクチャ(Layered Architecture)は,システム全体を様々なレイヤー(層)に分割し,それぞれの層が特定の機能や責任を持つ設計パターンである.

各層は独立しており,下層への依存はあっても上層への依存は基本的にない.これにより,システムの柔軟性(追加や変更のしやすさ),保守性(バグが少ない,修正のしやすさ),再利用性(同じコードを書かなくて良い)が向上する.

MVC におけるレイヤードアーキテクチャ

まず,MVC フレームワークは,アプリケーションを以下の3つのコンポーネントに分ける.

コンポーネント 責務
Model DB 操作とテーブル連携の定義を担当する.
View ユーザーインターフェースを担当する.データを表示するための画面を作成する.
Controller ユーザーの入力に応じた「リクエスト」「レスポンス」を担当する.

このように役割を考えると,MVC フレームワークはレイヤードアーキテクチャの考え方に基づいて設計されていることがわかる.

サービスクラスの導入

しかし,「複雑なデータが必要な場合に複数のデータを合成してデータを作成する」「取得したデータに基づいて集計や解析を行う」などの処理を担当する層がない(このような処理はビジネスロジックと呼ばれる).これらの処理はコントローラに記述することもできるが,コントローラが肥大化してしまう.

したがって,MVC の責務に当たらない処理を担当するために「サービス層」を導入する.

サービス層はモデルとコントローラの間に位置する.コントローラからのリクエストを受け取り,必要な処理(ビジネスロジック)を実行した後,結果をコントローラに返す.

【参考】リポジトリパターンの導入

さらに,より複雑なアプリケーションの場合にはデータを DB 以外から取得する場合もある.例えば,Twitter の API からデータを取得する場合などである.

このような場合には,サービス層に加えて「リポジトリ層」を導入する.リポジトリ層を導入する場合,この層はデータソース(DB や外部の API)とのやりとりを担当する.この場合,リポジトリ層にはモデルを使用した DB からのデータ取得や API からのデータ取得を行うコードを記述する.

これにより,サービス層(ロジック担当)とデータソース間の関心の分離が達成され,よりクリーンなアーキテクチャが実現される.

まとめ(各レイヤーの役割)

各レイヤーの役割をまとめると以下のようになる.

コントローラはサービスを呼び出して使用し,サービスはリポジトリ(リポジトリを使用しない場合はモデル)を呼び出して使用する.

リポジトリはモデルを呼び出したり,その他のデータソースからデータを取得したりする.

コンポーネント 責務
View ユーザーインターフェースを担当する.データを表示するための画面を作成する.
Controller ユーザーの入力に応じた「リクエスト」「レスポンス」を担当する.
レスポンスに必要な情報の作成はサービスクラスに任せる.
Service 取得したデータを用いたビジネスロジックを担当する.
データの取得はリポジトリ層に任せる.
Repository (DB 以外も含めて)データソースとのやりとりを担当する.
DB を使用する場合はモデルに任せる.
Model DB 操作とテーブル連携の定義を担当する.
GitHubで編集を提案

Discussion