PoEAA ch18 Gateway
Gateway
An object that encapsulates access to an external system or resource.
- OOシステムはオブジェクトではない外部リソースを取り扱わねばならないことがある
- 外部リソースはそれ専用のAPIをもつ
- そのまま使うのはよくない
- オブジェクトでラップしろ
How It Works
- やることは至ってシンプルなラッピング
- 用途を満たすシンプルなAPI(=メソッドとか)を定義し、外部リソースの操作にマッピングする
- GatewayはService Stubのよい適用場所でもある
- 後述
- Service Stubを適用しやすい設計にするのは重要なこと
- テスト容易性
- Gatewayはシンプルに保て
- 一番大事な役割は...
- 外部リソースのラッピング・クライアントコードの要求への適合
- スタブの適用箇所の提供
- これらを満足できる程度の最小のものであるべき
- 複雑なロジックはクライアントコードに任せろ
- 一番大事な役割は...
- コード自動生成を使うのは良いアイデア
- 2つ以上のオブジェクトでGatewayを作るのもよい
When to Use It
- 外部のもの感があり、インタフェースがぎこちない(OOPと合わない)ものがあればGateway適用を検討せよ
- Gatewayを導入するとテストが容易になる
- Gatewayでを導入すると置換可能になる
- 【補】クライアントコードをinterfaceに依存させれば、特定の実装には依存しなくなる
- テスト用Gatewayへの置換も可能(後述)
- Mapperという別の選択肢
- 外部リソースとの結合を切り離す
- Gatewayよりも複雑
- クライアントと外部リソースを互いにignorantにするため
- これって改めてデザインパターンとして挙げるほどのものか?
- GoFのなにがしかと同じじゃないの?
- 下記の理由につき区別した
- Facadeとの違い
- Adapterとの違い
- Mediatorとの違い
- 【疑問】Bridgeパターンとはどう違うの
- 既存のインタフェースはないが、様々な実装ありきでインタフェースを作る点がそっくり
- Bridgeパターンは「種類の継承ツリーと実装の継承ツリーとを分離する」ことを旨とするから違うのかな
- Facade, Adapter, Mediatorよりは似てると思う
Example: A Gateway to a Proprietary Messaging Service (Java)
- コード略(pp.468-472)
- Gatewayのインタフェースについて
- 戻り値から例外へのマッピング
- exit 0: 正常終了
- ほか: 異常終了
- Gatewayのスタブ
- もう一つのテスト方法: Service Stub
- 外部サービス自体のスタブを作る
- 【補】JSON Serverとか
- スタブの開発作業が困難でなければうまくいく
- 外部サービス自体のスタブを作る
- GatewayのスタブとServiceのスタブを併用するのもよい
- Pluginパターンを併用することで、本物とスタブの選択をconfiguration timeまで遅延できる
英語
- do the trick
- うまくいく
- ludicrous
- ばかばかしい
- laudable
- 称賛に値する