「オブジェクトデザイン」を読んだ

「オブジェクトデザイン」という設計技法の本を読みました。

www.shoeisha.co.jp

オブジェクトデザインは、2007年9月に出版された本で、残念ながら今は絶版となっています。原著は2002年11月に出版されたこちらですね。

www.informit.com

実は先日たまたま図書館の蔵書にあるのを発見し、借りて読むことができたので、今回はこの本について書きたいと思います。

ちなみに、なぜ10年以上前に出版された本を読もうと思ったのかというと、最近までEric Evansの「ドメイン駆動設計」を読み返していたのですが、その中で「責務駆動設計」というキーワードが脳裏に焼き付いていて、ちょうど同じ頃に @j5ik2o さんの「ドメインオブジェクトの責務について」という記事の中でこの本の存在を知ったのがきっかけでした。

この本のテーマ

この本では、オブジェクト指向設計について次のように解説しています。

実世界に存在しないオブジェクトを考え出すことで、現実世界の情報、プロセス、相互作用、関係、そしてエラーでさえも表現します。生命のないものに対して、生命と知性を与えます。理解が困難な現実世界のオブジェクトを、よりシンプルで管理しやすいソフトウェアオブジェクトへと分割します。

オブジェクト指向ソフトウェア開発は、その根本において実世界の物理学に従わないものです。現実世界をオブジェクト機構にモデリングすることが私たちの目的ではありません。そのため、私たちには現実世界を新たに考え出す資格があります。

この、管理しやすいソフトウェアオブジェクトへと分割するために、ロール、責務、コラボレーションという観点から設計を考えていく、というのがこの本の全体的なテーマとなっています。

本の構成

この本は大きく2つの部分で構成されています。

前半の第1章から第6章は、設計概念や責務駆動設計の中心的原理、実践方法について書かれています。前半を読むことで、設計の目的である、一貫した使いやすいオブジェクトを作り上げるために、ロール、責務、コラボレーションがどう作用するのかについて考えるための準備ができます。

後半の第7章から第10章は、前半で得た知識をもとに、ドキュメンテーションやコラボレーションにおける信頼領域内外での戦略、システムの柔軟性について解説しています。

ロール、責務、コラボレーション

アプリケーションは相互作用するオブジェクトの集合であり、それぞれのオブジェクトには ロール(役割) を割り当てます。このロールについて、この本では以下のような単純化した ロールステレオタイプ でオブジェクトを分類することで、責務に注目しやすくしています。

  • 情報保持役(Information Holder): 情報を知り、情報を提供する
  • 構造化役(Structurer): オブジェクト間の関係と、それらの関係についての情報を維持する
  • サービス提供役(Service Provider): 仕事を行うが、一般に演算サービスを提供する
  • 調整役(Coordinator): 他のオブジェクトにタスクを委譲することでイベントに対応する
  • 制御役(Controller): 判断を行い、他のオブジェクトのアクションをしっかりと指示する

責務 は、オブジェクトについて大雑把に記述したもので、本から引用すると以下の3つの主要な項目を含んでいます。

  • オブジェクトが行う動作
  • オブジェクトが持つ知識
  • オブジェクトが他に影響を与える主要な判断

コラボレーション は、オブジェクトもしくはロール(またはこの両方)の相互作用のことですね。

これらを踏まえて本の前半では、初期の探究的設計で作り上げた概念モデルに対して、オブジェクトを見つけ出し、ロールステレオタイプでオブジェクトの役割を単純化したうえで、それぞれの責務やコラボレーションを考えていくという流れで解説しています。あと、ロールや責務に応じたオブジェクトの名前付けのガイドラインについても解説があるので、個人的にとても参考になりました。

累進性の実感

もうひとつ、この本の中で印象に残った箇所について紹介します。

第7章「コラボレーションの記述」では、設計したオブジェクトをどのようにチームに伝えるかという、ドキュメンテーションの話になっています。この中で印象的だったのが、

7.8.2 ストーリーを展開する

単純なものから始めて、より興味深い視点や入り組んだ視点へと導く方法があります。 景観設計者(landscape architect)は連なった風景を設計するために累進性の実感(progressive realization)の原理を使います。景観設計者は、ものを意図的に隠して景観全体を渡り歩くまでは見えないようにするための、さまざまな眺め(view)を設計します。この考え方は、少しずつ、興味深い段階を踏んで、目指している目的地へと見物人を動かすというものです。あらゆる曲がり角に、新しく、興味深いものがあります。

John Simondsは著書『Landscape Architecture(邦題:ランドスケープ・アーキテクチュア)』の中で次のように述べています。「ある眺めは、計画上最も望ましいとした地点からだけ、最も印象深くその全貌を明らかにすべきである」。それぞれの眺めは、独自に魅力を発揮します。そして、新たな眺めは、それぞれ新たな驚きを含んでいます。累進性の実感により、曲がり角の向こうにあるものへの期待で楽しみが増えるのです。

ソフトウェアの設計者も、読み手がコラボレーションの景観を渡り歩くにつれてより深く理解するように仕向けることができます。

これは、ドキュメンテーションに限った話ではなく、例えばプログラミングであれば、宣言的にWHATを明示し、必要になったらHOWを探求させるような構成で書いておけば、累進性の実感を促すことにつながるのかなと思いました。

終わりに

オブジェクトデザインは非常に学びの多い本でした。

今回紹介した内容以外にも、実践するためのガイドラインが多く書かれています。 もちろん、10年以上前に出版された本なので、内容が古い部分もあるのですが、それらは脳内で補完しながら読む必要があります。

個人的には、恐らく1回読んだだけでは理解できていない部分があると思うので、間隔を空けて数カ月後にもう一度読んでみたいと思います。