まえがき
-
レイヤ分けは普遍的
-
マシンのアーキテクチャ
- プログラミング言語
- on OS
- on CPU命令セット
- on 論理ゲート
-
ネットワーク
- FTP
- on TCP
- on IP
- Ethernet
-
-
レイヤ分けの性質
- 上のレイヤは下のレイヤのサービスを利用する
- 下のレイヤは、上のレイヤのことを知らない
-
上のレイヤは、直下のレイヤのことは知っているが、その下のレイヤのことは知らない(不透過性)
- 必ずしもそうとは限らない
- 完全にそうとは限らない
-
レイヤ分けの利点
-
1つのレイヤを、モジュール強度の高い自己完結したものとしてとらえられる
- FTPがTCPを理解するうえでEtnernetの理解は不要
-
レイヤを置換可能
-
FTPはデータリンク層が何だろうと動作する
- Ethernet
- PPP
- Wi-Fi
-
- レイヤ間の依存性を最小にする
- 標準の定義
-
再利用性
-
TCP/IPスタックはあらゆる上位プロトコルから利用できる
- FTP
- telnet
- SSH
- HTTP
-
-
-
レイヤ分けの欠点
-
カプセル化が不完全
- UIにフィールドを1つ追加します
- 当然、対応するデータをDBに追加します
- その間の層(全部)が影響を受けます
-
性能面
-
層ごとに表現を変換する必要がある
- 【補】例えば、Controller層ではRequestを受け取り、idを抽出して、Service層に渡す
-
実装をカプセル化することで、補って余りある最適化が可能になることも
- 上位レイヤーに影響を与えずにトランザクション処理を最適化とか
-
-
- 何の層を作り、何の責務を負わせるか決めるのが一番難しい
The Evolution of Layers in Enterprise Applications
- 昔はレイヤ分けの概念がなかった
- 90年代、クライアント-サーバーに端を発する
- RDBのデータの表示・簡単な更新だけなら、この2層構造でよかった
-
複雑なビジネスロジックが絡むとそうはいかなくなる
-
クライアントのUIコードに直接書く
- 【補】「Smart UI」アンチパターンのことかな
- 複雑になり手に負えなくなる
- 画面に関するコードと混ざると、容易に多重化してしまう
-
DB側に「ストアドプロシージャ」として書く
- 構造化に難があり、結局ぎこちないコードになる
-
ストアドプロシージャはDBベンダ依存
- 「標準化されているためベンダを変えやすい」というSQLの利点が失われる
-
-
クライアント-サーバー構成と同時期に、OOが台頭
-
3層にしよう
-
Presentation
- UI
-
Domain
- ドメインロジック
- オブジェクトで構造化できる
- Data Source
-
-
-
3層構造はなかなか流行らなかった
- 多くのシステムは(少なくとも最初は)シンプル
-
シンプルならC-S2層構造用のツールやフレームワークが魅力的
- 3層構造に適用するのが困難であったり、不可能であったりした
-
Webの台頭による激震
- C-S2層構造のアプリケーションをWebブラウザに移植したくなった
- UIにビジネスロジックが混じってると移植できないよね
- 3層構造なら、Webブラウザ用に新しいpresentation層を追加するだけですむ
-
さらに、OO言語であるJavaが主流に
- domain層を実装しやすい
- Webページ構築用のツールがSQL前提のものでなかったのも手伝った
-
layer / tier
-
tier: 物理的に分かれていることを強調
- Client-Server は 2-tier system
-
layer: 必ずしも物理的に分かれていないことを強調
- Presentation-Domain-DataSource は 3-layer system
- domainはデスクトップPCかDBサーバーかどちらかにある
- 2ノード3層
- DBがローカルで動いていれば1ノード3層
-
The Three Principal Layers
-
Presentation Logic
- 結果の表示
- 入力の解釈・domain/data sourceのアクションへの変換
-
Domain Logic (Business Logic)
- 入力値や保持している値の計算
- 入力のバリデーション
- どのData Source Logicを実行するかの決定
-
Data Source Logic
-
アプリケーションの動作上必要な他システムとの連携
-
DB
- データ永続化
- トランザクションモニタ
- 他アプリケーション
- メッセージングシステム
-
-
- Domain LogicでData Sourceを完全に隠蔽することもある
-
実用上、完全には隠蔽しないこともよくある
- presentation層がdata sourceから直接データを取得し、domain logicに処理させて表示する
-
各層の中で複数のパッケージを作ることがある
- rich-client用/command line用のpresentationパッケージ
- domainを細分
- あるdomainパッケージからしか使わないdata sourceパッケージ
-
エンドユーザーが動かさないプログラム
- Webサービス
- バッチ処理
-
presentation と data source とは、「アプリケーション外部と結合」という点で似ている
-
Hexagonal Architectureの背景にある考え方
- 対称的
-
-
非対称も便利
-
presentation
- 外部にサービスを提供するインタフェース
-
data source
- サービスを提供されるインタフェース
-
-
単純なスクリプトレベルでも、最低限3つのサブルーチンに分けなさい
- 複雑になっていったらクラスを分ける
- さらに複雑になったら、各層の中でパッケージングする
- domain/data source層がpresentation層に依存するのはNG
- domain層とdata source層の依存関係は複雑で、適用パターンにより違ってくる
-
何がドメインロジックで何がそうでないかの判定方法
-
レイヤを挿げ替える思考実験
-
プレゼンテーション層
- 例えば、コマンドラインからWebアプリケーションへ
-
データソース層
- RDBからXMLファイルへ
-
- 機能の多重化が生じるなら、それはドメインロジックが他の層に漏れている
-
Choosing Where To Run Your Layers
- システムが物理的な構造を有している場合、何をどこに置くか
-
サーバーに配置
-
保守が容易
- 各クライアントを修正し、サーバーと同期する必要がない
- クライアント上の他ソフトウェアとの互換性の心配もない
-
-
クライアントに配置
- 応答性がよい
- サーバーとの接続が切れても動作できる
-
コードを配置したら、極力単一のプロセスで動かすように
- 本当に必要な場合を除き、プロセスを分けない
- プロセスを分けると、
Remote Facades
やData Transfer Objects
といったものの追加が必要になる
-
複雑性を加速させるものを極力避ける
- 分散システム
- 明示的なマルチスレッディング
- パラダイムの溝(オブジェクト/関連)
- マルチプラットフォーム
- 極端な性能要件
英語
-
whole
- [noun] A thing that is complete in itself.
-
hunt (somebody) down
- to search for someone until you catch or find them, especially in order to punish or harm them
-
bandwagon
- Used in reference to an activity, cause, etc. that is currently fashionable or popular and attracting increasing support.
-
make headway
- Make Forward movement or progress, especially when this is slow or difficult.
- headwayは [mass noun]
-
compelling
- Evoking interest, attention, or admiration in a powerfully irresistible way.
-
seismic
- Relating to earthquakes or other vibrations of the earth and its crust.
-
crust
- The outermost layer of rock of which a planet consists, especially the part of the earth above the mantle.
-
tier
- Each in a series of rows or levels of a structure placed one above the other.
-
behalf
- In the interests of a person, group, or principle.
-
mundane
- Lacking interest or excitement; dull.
- ありふれた
-
dogmatic
- Inclined to lay down principles as undeniably true.
-
jiggery-pokery
- Deceitful or dishonest behaviour.