TL;DR

  • モジュールのインタフェースは「ある程度汎用的」に作るのがよい。機能は現在のニーズに絞り、インタフェースは現在のニーズに縛られないようにする。
  • 汎用的なインタフェースはシンプルで深くなりやすく、システム全体の複雑さを減らす。

内容

ある程度汎用的に作る

モジュール設計で抽象化したインタフェースを作るとき、インタフェースを汎用的(general-purpose)にするか、専用的(special-purpose)にするかという問題に直面する。著者の経験では、モジュールのインタフェースは「ある程度汎用的」に作るのがよい。ここでいう「ある程度汎用的」とは、機能は現在のニーズを満たすものにとどめ、インタフェースは現在のニーズに縛られないということである。「ある程度」というのが肝心で、汎用的すぎると現在のニーズを満たせなくなる。

汎用的なインタフェースは、専用的なものよりシンプルで深くなりやすい(深いモジュール)。インタフェースがシンプルなら知っておくべき情報が少なくて済むので、認知的負荷も減る。再利用もしやすい。

誰が何をいつ知るべきか

ソフトウェア設計で重要な要素の 1 つは、誰が、何を、いつ知る必要があるかを決めることである。詳細が重要な場合は、それをできるだけ明示的にしたほうがよい。そうした情報をインタフェースの裏に隠すと、かえって不明瞭さを生む(第2章 The Nature of Complexity)。

バランスを見つけるための問い

汎用的なインタフェースと専用的なインタフェースのバランスを見つけるには、次の問いを自分に投げかける。

  • 現在のニーズをすべて満たす、最もシンプルなインタフェースは何か。 モジュール全体の機能を落とさずにメソッドの数を減らせるなら、より汎用的なメソッドを作っていることになる。ただし、メソッドの数を減らすことに意味があるのは、個々のメソッドがシンプルなままの場合だけである。メソッドに引数を追加する必要があるなら当てはまらない
  • このメソッドはどんな場面で使われるか。 特定の用途でしか使われないなら、汎用的ではない。いくつかのメソッドを 1 つの汎用的なメソッドで置き換えられないかを考える
  • このインタフェースは、現在のニーズに対して使いやすいか。 ニーズを満たすために追加のコードをたくさん書く必要があるなら、汎用的すぎる

まとめ

汎用的なインタフェースには、専用的なインタフェースより多くの利点がある。シンプルで深いメソッドが少数にまとまりやすく、クラス間の関係も明確になる。専用的なインタフェースでは、クラス間で情報漏洩が起きやすい。モジュールをある程度汎用的にすることは、システム全体の複雑さを減らすためのベストプラクティスの 1 つである。

キーワード

自分の理解

章のタイトルのうまい訳は思いつかなかった。

専用的なインタフェースでクラス間の情報漏洩が起きやすいのは、必要な情報がインタフェースに表れず、不明瞭さが増すからだと考えている。