勉強日記

チラ裏

PoEAA ch18 Mapper

martinfowler.com


Mapper

An object that sets up a communication between two independent objects.

  • 2つのサブシステムをつなぐ
  • 疎結合に保ちたい
    • 変更できないから
    • 変更できるにしても、依存させたくないから

f:id:wand_ta:20190519180433p:plain
Mapper

How It Works

  • サブシステムをつなぐ
  • コミュニケーションの詳細を制御する
    • 両サブシステムが意識しなくて良いように
  • shuffle
  • mapperをどうやって起動するか?
    • サブシステムからmapperを直接起動しては意味がない
      • サブシステムが何かに依存するのを避けるためのmapperなのだから
    • 第三のサブシステムを設けてmapper起動する
    • Observer Pattern取り入れる
      • サブシステム: Publisher
      • mapper: Observer
      • mapperはイベントをリッスンして起動する
  • mapperがどう動作するかは、マッピング対象の層の種類による
    • Data Mapperとか

When to Use It

  • システムの部品の結合をほぐす
  • MapperにするかGatewayにするか

f:id:wand_ta:20190519180452p:plain
Gateway (Mapperとは依存の方向が異なる)

  • Gatewayのほうが、書くにも使うにもシンプル
  • サブシステム間で互いに依存がないことを保証する必要がある場合にのみMapper使え
    • 【補】片方向依存があってもいいならGateway
    • サブシステム間の相互作用がとりわけ複雑
    • それでいて、サブシステムの主要な目的には関係がない
  • 例えばどんなとき
    • Domain ModelとDBとのO/Rマッピング(Data Mapper)
      • データ変換は複雑
      • Domain ModelはDBのことは意識するべきではない
      • DBも誰に使われるか知っているべきではない
  • GoFMediatorに似ている
  • 異なる点
    • Mediator Pattern: 各クラスはMediatorを知っている
    • Mapper Pattern: 各クラスはMapperを知らない

f:id:wand_ta:20190519180510p:plain
GoFのMediator Pattern (双方向依存)