インターフェイス指向設計
本を読むこととは、その本を読んだことに費やした時間の間、その書籍のテーマについて考えを巡らせることではないか、と近頃思います。本を読みながら集中して、ある特定のテーマについて考え続ける。本を読み終えた頃には、その思考の量的な価値が、自らの中で質的な価値に変換されているというのが理想であり、それが読書の醍醐味ではないかと思います。
インターフェイス指向設計 ―アジャイル手法によるオブジェクト指向設計の実践 を読みました。この書籍はシステム設計における「インターフェイス」(ユーザーインターフェイスではなく、プログラムインターフェイス) についての書籍です。インターフェイスについて考えを巡らせるにあたって、思考のための指針を与えてくれる良著だと思います。
プログラムインターフェイスというものをどのように捉えるか。ファイルをブロック単位で読むための手順であるとか、ソートのアルゴリズムであるとか、そういった実装詳細よりも一段上の抽象レイヤの話なので、漠然と考えていてもつかみ所がなく、難しい。この書籍は、前半においてインターフェイスの善し悪しについての評価の原則を説き、その後、さまざまなインターフェイスに対して分類化を行い、インターフェイスというものをどう体系立てて整理するか、という点で良いヒントを与えてくれました。
たとえば、XML の DOM はプル型で、SAX はプッシュ型。別の角度から見ると DOM はランダムアクセスで、SAX はシーケンシャル。同様に、プログラミング言語における内部イテレータと外部イテレータをプル型、プッシュ型という観点から分類します。そしてそれぞれの分類ごとに、どのような利点と欠点、つまりトレードオフがあるかを検討していきます。
各インターフェイス実装の根底にある考え方でもってインターフェイスを分類し、そのトレードオフについて考える。その過程において、自分がこれまでに組んだシステムを分類に当てはめながら読みました。ある程度いくつかの例について考え終えたころには、インターフェイスの選択における判断基準が自分の中に確実に芽生えていることを実感することができました。
個人的には、第5章「継承とインターフェイス」において、継承とコンポジションそれぞれのトレードオフについて理解が得られたのが特に良かったと思います。継承はデータの階層化、インターフェイスは振る舞いのグルーピング。それぞれ着眼点が異なります。継承にはデータの階層化を行うという以外に、実装の共通化を行うという視点が含まれます。継承を軸に設計を行うと、どうしてもその着想に実装が入り込んで来るため、疎結合や階層化の観点から見て失敗しやすいのではないかと思いました。Java の InputStream クラスを継承による階層化からインターフェイスによるグルーピングへと変換する実例を見ながら、そのように理解しました。
「インターフェイスから考える」という考え方は、プログラムを綺麗に書くために最も大切な点ではないかと自分は考えます。ある程度システム設計をしてきた経験者の方々の中には、そのような直感が芽生えていることではないかと思います。その直感を確信に変えたい、と思っているすべてのエンジニアにおすすめの一冊です。