タイトル
プログラマのためのJava設計ベストプラクティス
著者
カーク クネンシルト (著), Kirk Knoernschild (原著), 長瀬 嘉秀 (翻訳), 今野 睦 (翻訳), テクノロジックアート (翻訳)
出版社
ピアソンエデュケーション
Amazonで購入する

開放・閉鎖原則(Open Closed Principle)、Liskovの置換原則(Liskov Substitution Principle)、依存関係反転法則(Dependency Inversion Principle)、インターフェース分離原則(Interface Segregation Principle)、コンポジット再利用原則(Composite Reuse Principle)、最小知識原則(Principle of Least Knowledge)、以上が本書で説明されているオブジェクト指向設計におけるクラス原則です。

優れたクラス設計を行うためには、上記のような頭の痛くなる言葉を覚える必要はありません。が、この言葉の意味と何が言いたいのかを理解することは大切です。

本書は、オブジェクト指向の原則、デザインパターンとその実践的な利用方法、UMLとJavaとのマッピング、モデリングの指針、アーキテクチャモデリング、ソフトウェア開発プロセスといった、避けては通れない問題を丁寧に解説している。

特徴

まず、本書の目次を見てください。

  • オブジェクト指向の原則とパターン
  • クラス原則
  • パッケージ原則
  • パターン
  • UML入門
  • UMLの基礎
  • UMLとソフトウェア開発プロセス
  • モデリング戦略
  • 要件モデリング
  • 問題分析
  • アーキテクチャの確立
  • クラスの割り当て
  • 振る舞いモデリング
  • 構造モデリング
  • アーキテクチャモデリング
  • アーキテクチャメカニズム(レイヤ・Observer・MVC・パーティション)
  • サブシステムの設計
  • RUPとXP
  • J2EEとUML

本書のすべてを読破する必要はないと思います。が、240ページと薄い部類に入る本なので、読み始めるのに気合とか勇気とかはいらないと思います。

本書の中で特におすすめ&読んで欲しい部分は、「オブジェクト指向の原則とパターン」です。本書のタイトルが「プログラマのためのJava設計ベストプラクティス」となっていますが、この「オブジェクト指向の原則とパターン」の部分を含め、本書のほとんどは、Javaに依存しません。

本書の中で、UMLに関する部分はあまり期待しないほうがいいです。他にもっといい解説をしている本が出ているので、UMLに関してはそちらを参考にしたほうが良いでしょう。ただ、それ以外の部分に関しては、結構深いところや経験のない技術者の方は気づきにくい点も解説してあり、非常に役に立ちます。

設計に関して解説している本で、オブジェクト指向の原則に触れているものは少ないと思います。原則は、パターンよりも抽象度が上の概念ですので、ここをしっかり理解できると、デザインパターンも理解が早いと思います。買って損はないと思います。おすすめです。

おぼえがき

開放・閉鎖原則(Open Closed Principle: OCP)

既存のクラスを修正せずに、システムに新しい機能を追加できるように設計すること。「モジュールは拡張性について開いて(Open)おり,修正について閉じて(Closed)いなければならない。

詳しくはデザインパターンとOpen-Closed Principleを参考に。

Liskovの置換原則(Liskov Substitution Principle: LSP)

振る舞いにおいて、下位クラスのインスタンスが上位クラスのインスタンスとみなせるかどうか。

下位クラスで保証する事前条件を上位クラスで保証する事前条件より強めることはできない。つまり、下位クラスは、上位クラスよりも事前条件を甘くしなければならないということ。Javaの例で言うと、親クラスに

public abstract void execute() throws IllegalArgumentException

というメソッドがあるとする。サブクラスでは

public void execute() throws Exception

という宣言は許されない。「throws Exception」は、親クラスの例外より高水準(強い)例外は定義できない。

下位クラスのメソッドで保証する事後条件を、上位クラスの事後条件よりも弱くすることはできない。Javaの例で言うと、Objectクラスのcloneというメソッドは、protected宣言されている。サブクラスでは、cloneというメソッドをprotected以上のアクセス制限をかけなければいけない。protected Object clone() throws CloneNotSupportedException というメソッドがあります。サブクラスでは、private Object clone() throws CloneNotSupportedException という宣言は許されないということになります。

参考文献は、オブジェクトの広場(PDF)です。

依存関係反転原則(Dependency Inversion Principle: DIP)

抽象に依存する。具象に依存してはいけない。例えば、インスタンスを生成するために具象クラスを指定しする場合(newする場合)は、依存関係反転原則を侵害しているといえる。この場合、主な解決策は、Factoryクラスを使用して、インスタンス生成を具象クラスに依存させない用にする。

しかし、すべてのインスタンス生成にFactoryクラスを適用するのはばかげていて、実際には、クラスの実装が将来変更するかどうか不明な場合にこの原則を適用する。

インターフェース分離原則(Interface Segregation Principle: ISP)

単独の汎用的なインターフェースよりも、多くの特化したインターフェースのほうが良い。つまり、インターフェースの凝集度を高めるべきであるということ。インターフェースは、オブジェクトが存在している瞬間に果たす役割に過ぎないということから、インターフェースの操作は複数の役割に対応しないように定義すべきである。

コンポジット再利用原則(Composite Reuse Principle: CRP)

継承よりもコンポジションのほうがよいというもの。継承は、静的な関連しかできないが、コンポジションは動的な関連にできる。また、サブクラスの種類が増えた場合に、継承では対応できなくなってくる。なにより、開放・閉鎖原則を侵害してしまう。

最小知識原則(Principle of Least Knowledge: PLK)

別名、デメテルの法則とよばれる。別のオブジェクトのメソッド呼び出しで取得できるオブジェクトのメソッドは呼び出さないというもの。この原則の例外は、インターフェース型で取得した場合である。インターフェース型で取得したオブジェクトに関しては、メソッド呼び出しを許可できる。

詳しい解説は、達人プログラマーが参考になります。

参考

  • オブジェクト指向の法則に関してよくまとめられています。

オブジェクト指向の法則集

  • 設計のさらに上級編(J2EE編)はこちら

  • 法則や原則以外のプログラマーが知っておくとよいことが非常に丁寧にまとめられています。【超おすすめ】

  • 本書より厚めですが、こちらもおすすめ。UMLに関して非常に丁寧に解説してくれます。本書のUMLの部分を補うだけでなく、こちらもオブジェクト指向の原則を解説してくれています。【超おすすめ】

  • 現場で使える即知識。いかがですか?