勉強日記

チラ裏

Clean Code ch8 Boundaries

www.oreilly.com


Boundaries

  • 全てのコードを自分たちの支配下に置けるとは限らない
  • これらの「外部のコード」を自分たちのコードに綺麗に組み込まなければならない
  • 本章では、クリーンな境界を維持する実践とテクニックに目を向ける

Using Third-Party Code

  • インタフェースの綱引き
    • サードパーティ: 広く適用できるインタフェースを追求する
      • 多くの環境で幅広いユーザに売り込みたいから
    • 利用側: ニーズ特化のインタフェースを求める
  • ライブラリの生のMapなどを直接引き回すべきではない
  • なぜ
    • 必要以上の機能が使えてしまう
      • ロジックの意図としては要素を削除される想定がないのにclear()メソッドが生えていたり
    • Javaの非ジェネリクス時代のMapの場合、利用側がダウンキャストまみれになる
    • Mapのインタフェースが変更されたら変更箇所甚大になる
      • そんな変更はまずないだろうって?
      • Java5でジェネリクスが追加されましたよね
  • 自前のクラス(boundary)に閉じ込めよう
    • 【補】集約と委譲
    • MapMap<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()が取れなくなったりしましたね
    • 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
    • ...するといけないから