Boundaries
-
全てのコードを自分たちの支配下に置けるとは限らない
- サードパーティ製品
- OSS
- 自社コンポーネントやサブシステム
- これらの「外部のコード」を自分たちのコードに綺麗に組み込まなければならない
- 本章では、クリーンな境界を維持する実践とテクニックに目を向ける
Using Third-Party Code
-
インタフェースの綱引き
-
サードパーティ: 広く適用できるインタフェースを追求する
- 多くの環境で幅広いユーザに売り込みたいから
- 利用側: ニーズ特化のインタフェースを求める
-
- ライブラリの生の
Map
などを直接引き回すべきではない -
なぜ
-
必要以上の機能が使えてしまう
- ロジックの意図としては要素を削除される想定がないのに
clear()
メソッドが生えていたり
- ロジックの意図としては要素を削除される想定がないのに
-
Javaの非ジェネリクス時代の
Map
の場合、利用側がダウンキャストまみれになる- ジェネリクスで改善できる
- 【補】全部連想配列のPHPコードみたいな
-
Map
のインタフェースが変更されたら変更箇所甚大になる- そんな変更はまずないだろうって?
- Java5でジェネリクスが追加されましたよね
-
-
自前のクラス(boundary)に閉じ込めよう
- 【補】集約と委譲
Map
かMap<T>
か、といった実装の詳細は隠蔽される
Exploring and Learning Boundaries
- サードパーティAPIを学習するのは大変
- サードパーティAPIを自分たちのソフトウェアに組み込むのはもっと大変
-
同時にやろうとすると二重に大変
- デバッグで、自分のコードが悪いのかサードパーティのコードが悪いのかの切り分けで泥沼にはまるのは珍しいことではない
-
サードパーティのコードを理解するためのテストを書こう
- サードパーティのコードをテストするのは自分たちの仕事ではない
- が、利用する部分を理解するためにテストを書き起こす
- Jim Newkirk はこの類のテストを「learning tests」と呼んでいる
Learning Log4j
- バグか、少なくとも一貫性のない仕様のあるログライブラリを学習する例
- 躓きながらドキュメントを読んだりググったりして調べていく
- 得た知識を単体テストに書き起こす
- 最終的に自前のロガークラス(boundary)にカプセル化する
Learning Tests Are Better Than Free
-
learning testsを書いた後で振り返ってみると、余計なコストはかからなかったことがわかる
- サードパーティコードの学習はどのみち行わなければならなかった
- 知識を得るうえで、learning testsは簡単で隔離された方法だった
-
理解を進めるうえで、learning testsは正確な実験だった
- 【補】コードとして実行可能・再現性があるという意味合いかな
-
さらにポジティブな見返りもある
-
サードパーティコードは、不具合修正や機能追加により、振る舞いが我々の意図せぬものに変わっている可能性がある
- 【補】Laravelで、コントローラのコンストラクタの中で
\Auth::user()
が取れなくなったりしましたね
- 【補】Laravelで、コントローラのコンストラクタの中で
- leaning testsを動かせばすぐに特定できる
-
-
learning testsを書かなかったとしても、結局boundaryクラスのoutboundのテストは書くべき
- さもないと怖くてサードパーティコードをアップデートできなくなりがち
Using Code That Does Not Yet Exist
- わかっているところ(自分たちの世界)と不明なところ(新しい世界)とを分離する
- 例: 分業していて、依存モジュール待ちの場合
-
Adapter Pattern (GoF)を使え
- 作業がブロックしないようにinterfaceだけ切っておく
-
このinterfaceはテストにも有用
- Fakeを使ってクライアントコードをテストできる
- 【補】Service Stub (PofEAA)
Clean Boundaries
-
自分たちの支配下に置くことができるコードに依存せよ
-
サードパーティに依存するコードは極力少なくしよう
- 自分たちのコードのロジックがわかりやすくなる
- 将来サードパーティのコードがアップデートされた時、修正箇所が絞られる
-
- さもないと、逆にサードパーティに支配される
英語
-
be inhibited from doing
-
…するのを(心理的に)抑制された
- 変更箇所が甚大で触りたくない、みたいな
-
-
off the edge
- 正気を失って
-
accommodate
- 余地がある
-
lest
- …するといけないから