現在扱うシステムで採用されているアーキテクチャなので、こちらを読んで焦点を絞ったまとめ
レイヤードアーキテクチャとは
ソフトウェアシステムの関心事を切り離し、ドメイン層を他から分離するテクニック。
ドメインとは
システムが担う業務知識、業務影響、または業務活動の領域
ユーザーがプログラムを適用する対象領域
レイヤードアーキテクチャにおける核の部分
ドメイン層とは
ドメインロジックの責務を負う、設計および実装の一部分。単位
ドメインモデルのソフトウェアにおける表現をそのまま反映させた場所
ドメインロジックとは
ドメインを成立させているプログラム処理
ドメインモデルとは
特定の図ではなく図が伝えようとしている考え方
図で知識が厳密に構成され、選び抜かれて抽象化されたものを表すことができる
なんか分かりづらかったがドメインモデル図イメージできれば良いと思っている
モデルとは
選び抜かれてシンプルにされ、意図的に組み立てられた知識の表現形式
情報のもつ意味を明らかにし、その情報を問題に集中させたもの
ここまで前提的知識
ドメイン層とそれ以外の層の構成
- ユーザーインターフェース層
- 外部からの操作によるコマンドを解釈する領域
- 例)バッチにおけるCLI、MVCにおけるViewなど
- アプリケーション層
- ソフトウェアが行うことになっている仕事を定義する領域
- 例)プログラムの進捗状態反映(ログ)、MVCにおけるControllerなど
-
ドメイン層
- ビジネスの概念、情報、ルールを表す領域
- 例)ドメインロジック、MVCにおけるModelなど
- インフラストラクチャ層
- 上位のレイヤ全体を支える一般的な技術的機能
- 外部との接続機構、MVCにおけるO/R Mapperなど
重要な考え方
- ドメイン層は特別ということ
- レイヤ内のどの要素も、同じレイヤの他の要素か、その「下にある」レイヤの要素にしか依存しない ということ。
- 凝集度の高い側面を隔離するレイヤを選び出すこと
- ビジネスの本質的な情報のみなので、変更・保守・追加がし易いこと
- 特定のアーキテクチャに依存しないこと(なのでこれが確立したアーキテクチャな訳ではない)
- DI化されたレイヤードアーキテクチャ、ヘキサゴナルアーキテクチャなどがある(実装レベルの別記事にて)
書籍情報
https://amzn.to/2Df8ZqX
Eric Evans, エリック・エヴァンスのドメイン駆動設計
雑感
ドメインを理解するには、「それ以外」を理解できないといけない感じがした。
レイヤードアーキテクチャが、「ドメインとそれ以外」と表現するのはドメインが本質な事を強調しているのであって、実際は「それ以外」のレイヤ達も適切に切り分けることが重要。なので、「それ以外」を理解しないといけなそう