勉強日記

チラ裏

PoEAA Part 1 Chapter 1 Layering

まえがき

  • レイヤ分けは普遍的
  • レイヤ分けの性質
    • 上のレイヤは下のレイヤのサービスを利用する
    • 下のレイヤは、上のレイヤのことを知らない
    • 上のレイヤは、直下のレイヤのことは知っているが、その下のレイヤのことは知らない(不透過性)
      • 必ずしもそうとは限らない
      • 完全にそうとは限らない
  • レイヤ分けの利点
    • 1つのレイヤを、モジュール強度の高い自己完結したものとしてとらえられる
      • FTPTCPを理解するうえでEtnernetの理解は不要
    • レイヤを置換可能
    • レイヤ間の依存性を最小にする
    • 標準の定義
    • 再利用性
  • レイヤ分けの欠点
    • カプセル化が不完全
      • 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
    • アプリケーションの動作上必要な他システムとの連携
  • Domain LogicでData Sourceを完全に隠蔽することもある
  • 実用上、完全には隠蔽しないこともよくある
    • presentation層がdata sourceから直接データを取得し、domain logicに処理させて表示する
  • 各層の中で複数のパッケージを作ることがある
    • rich-client用/command line用のpresentationパッケージ
    • domainを細分
    • あるdomainパッケージからしか使わないdata sourceパッケージ
  • エンドユーザーが動かさないプログラム
  • presentation と data source とは、「アプリケーション外部と結合」という点で似ている
    • Hexagonal Architectureの背景にある考え方
      • 対称的
  • 非対称も便利
    • presentation
      • 外部にサービスを提供するインタフェース
    • data source
      • サービスを提供されるインタフェース
  • 単純なスクリプトレベルでも、最低限3つのサブルーチンに分けなさい
    • 複雑になっていったらクラスを分ける
    • さらに複雑になったら、各層の中でパッケージングする
  • domain/data source層がpresentation層に依存するのはNG
  • domain層とdata source層の依存関係は複雑で、適用パターンにより違ってくる
  • 何がドメインロジックで何がそうでないかの判定方法
    • レイヤを挿げ替える思考実験
      • プレゼンテーション層
      • データソース層
    • 機能の多重化が生じるなら、それはドメインロジックが他の層に漏れている

Choosing Where To Run Your Layers

  • システムが物理的な構造を有している場合、何をどこに置くか
  • サーバーに配置
    • 保守が容易
      • 各クライアントを修正し、サーバーと同期する必要がない
      • クライアント上の他ソフトウェアとの互換性の心配もない
  • クライアントに配置
    • 応答性がよい
    • サーバーとの接続が切れても動作できる
  • コードを配置したら、極力単一のプロセスで動かすように
    • 本当に必要な場合を除き、プロセスを分けない
    • プロセスを分けると、Remote FacadesData 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.