読者です 読者をやめる 読者になる 読者になる

オブジェクト指向入門読み終わった

ちまちま読んでたオブジェクト指向入門を読み終わった。だいたい入門と言っているが、原題は"Object-Oriented Software Construction"で入門感はないし、上下巻あわせて2000ページくらいあって読みきるのが大変だった。

原著は18年前に発売された本だが、内容のほとんどは今でも有益で、全体を通してためになる。オブジェクト指向が解決しようとしている課題や、背景にある理論や考え方について解説してくれるだけではなく、実際にソフトウェアを設計する際にどのようにクラスを見つけ、どんな場面で継承を使い、ソフトウェア全体をどのように形作っていくのかという実践的な議論も充実している。

本の序盤では、ソフトウェアの品質の様々な側面についての解説や、オブジェクト指向以前から使われていたモジュールや型の概念のがもつ諸課題について詳しく解説してくれる。それらの問題をふまえ、次に、ソフトウェアの再利用性や拡張性、そして信頼性を担保する仕組みとしてオブジェクト指向が提案される。オブジェクト指向の考え方の後ろにあるのは抽象データ型の考え方だ。抽象データ型は、型と特性、公理、事前条件によって特徴付けられた抽象的なデータ構造の仕様記述でソフトウェアモデルを厳密かつ、過不足なく表現することができる。実は、オブジェクト指向におけるクラスは実装を伴う抽象データ型であるということが読み進めるとわかってくる。

抽象データ型をクラスとして記述するにあたって、公理をや事前条件をクラスの表記に組み込む必要がある。この本で解説につかっているプログラミング言語*1ではクラスに表明を記述することができ、ルーチンごとの事前条件や事後条件、クラス全体の不変条件を記述できる。ルーチンが呼び出し側に要求する事前条件とルーチンが呼び出し側に保証する事後条件を、契約のようにみなすこともできる(これが契約による設計のメタファだ)。

抽象データ型をベースにした考え方は本の全体で一貫していて、後半の実践部分でも、クラスを見つけるのに大事なのは、ソフトウェアの問題領域に対する適切な抽象を見つけることだと述べている。ソフトウェアが対象にしている問題領域に対する適切な抽象が見つかれば、適切なクラスとクラスがもつべき特性や表明、クラスが何を要求し何を提供してくれるのかといったことに対して、妥当な答えを出すことができるようになる。

最近はこの本で学んだこと参考に、抽象を意識してクラスの設計を考えてみている。別々のモノだと思っていたデータ群が実は同じ抽象に基づいていてひとつのクラスで表現したら見通しがよくなったり、似てるけど別々に実装されていた一連の処理群が実はある抽象に基づいていることに気づいて、特定のインターフェースを実装する形にしたらソフトウェアの他の部分とうまく適合したり、と有益な体験が続いている。機能ベースで考えてたりすると、ある機能を実装するメソッドをどのクラスに所属させるか悩むみたいなことがあったりするけども、悩むのは実はおかしいはずで、どのクラスにも機能追加するのが不自然であれば新たな抽象概念が登場したのではないかとか、いろいろ考えることができるようになった。

大学のころの研究室の先生が、「ソフトウェア開発っていうのは抽象化のことなんだよ」とおっしゃていたが、数年いろいろソフトウェア開発してみて、この本を読んでみると、少しはおっしゃっられていたことが、わかったような気がしたりしなかったりする。

オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング)

オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング)

オブジェクト指向入門 第2版 方法論・実践 (IT Architects' Archiveクラシックモダン・コンピューティング)

オブジェクト指向入門 第2版 方法論・実践 (IT Architects' Archiveクラシックモダン・コンピューティング)

*1:プログラミング言語の名前は伏せられていて下巻の最後の方でやっと教えてくれる