6.オブジェクト指向による設計
ここでは、オブジェクト指向による設計方法のよきガイドとして、パターンについて書かれた本を2冊紹介します。パターンとは、特定の問題に対する優れた設計方法を特定のフォーマットで記述し、その考え方や具体的な解決を多くの人たちで共有し合おうという目的でまとめられたもので、いわゆるソフトウェア開発のための定石集に該当します。
オブジェクト指向の設計とは、つまるところ、どんなクラスをどうやって組み合わせるかに尽きるので、設計のノウハウについては、なんだかんだと蘊蓄をたれるよりも、実際の組み合わせを見たほうが全然早いのです。どうもパターンというと何となく難しいものという認識があるようですが、発想自体は決してそんなに難しいことではありません。
そんなわけで、設計に関してお勧めする本は、パターンを扱った次の2冊になりました。最初の本で扱っているデザインパターンは、おもに再利用を目的にして限られた問題に対するクラスの組み合わせを対象としています。次の本で扱っているアーキテクチャパターンは、システムの特徴や特性など、クラスに限定されないもう少し大きな問題を対象としています。
デザインパターン 改訂版 |
著者 : | Erich Gamma/Richard Helm/Ralph Johnson /John Vlissides |
監訳 : | 本位田 真一/吉田 和樹 |
発行 : | ソフトバンク |
ISBN : | 4-7973-1112-6 |
|
|
何回かシステムの設計をするようになると、あるとき突然、「そういえば、この組み合わせって、たしか前にも使ったよなぁ?」と感じるときがやって来ます。そんなタイミングで読むとよいのがこの本です。この本では、オブジェクト指向の先人達が見つけ出した23個の珠玉のパターンが紹介されています。適用すべき対象も、どんなシステム開発にもありそうな問題ばかりで、とにかく実開発では本当に役立つ本です。
ただし、どのパターンにおいても、問題解決のためのクラスの組み合わせをベースにして、必ず「再利用」という視点からの味付けが加わっているため、一見するとその真意をわかりにくい部分があるので注意が必要です。「パターンは難しいもの」というイメージがあるのは、そのあたりの汎用化を目指したがゆえのトレードオフなのかもしれません。
内容が難しいと言われるこの本ですが、もし最初のFactory系4連発でつまずいてどうしても先に進めない場合には、途中のわかりやすい部分から入ることをおすすめします。組み込みエンジニアであれば、状態遷移を拡張性豊かに実装できるSTATEパターン(ただし、これを素直に実装するのはあまり現実的ではありませんが……)や複数のオブジェクトを制御するMEDIATORパターン(これは従来の組み込みでもよく使うやり方)、サブシステムの内部を隠蔽してくれるFACADEパターン(これもごく普通に使うやり方)あたりから入ると、違和感なく読みこなせると思います。
ちなみにこの本は、ソフトウェア分野における20世紀でもっとも優れた本の一つとまで言われるほどの重要かつ有名な本でもあります。ある程度設計をこなせるようになってきたら、ぜひ一読をおすすめします。逆に、設計の痛いところがわかっていないと、この本のありがたみがわからないので、初心者にはおすすめできません。
ソフトウェア アーキテクチャ ソフトウェア開発のためのパターン体系 |
著者 : | F. ブッシュマン/R. ムニエ/H. ローネルト/ P. ゾンメルラード/M. スタル |
訳 : | 金澤典子/水野貴之/桜井麻里/関富登志/千葉寛之 |
発行 : | トッパン |
ISBN : | 4-8101-9007-2 |
|
|
建築にたとえると、先に紹介したデザインパターンが間取りや壁、柱といったものの構造や役割を決めるものだとしたら、この本で紹介されるアーキテクチャパターンはツーバイフォーかログハウスか、あるいは合掌式かなどといった家の基本的な設計様式やそこでの生活の仕方などについて述べたものといえます。
さらにアーキテクチャパターンとは、デザインパターンのようにそこで決められたクラス構造ごと再利用してしまうことよりも、その問題に対する責任の分割の仕方や考え方自体をパターンとして共有化しようという、もう少しゆるやかな再利用の試みでもあります。
ですから、この本を読む場合は、ここに出てくるクラス図よりも、その背景となる問題や責任分担のさせ方などを理解すべきでしょう(責任を強調するため、クラスの仕様もCRCカードのような責務を強調した表記法で記述されています)。
この本では、アーキテクチャパターン以外に、デザインパターンやイディオムといった小粒度のパターンも扱っていますが、個人的にはやはりアーキテクチャパターンの部分が秀逸だと感じます。
なお、この本も実開発では非常に役立ちます。たとえば、パイプ&フィルタ、レイヤ、ブローカ、プレゼンテーション・アブストラクション・コントロール(PAC)などは割とよく出てくるパターンだと思います(私の場合ですが...)ので、ぜひおさえておきたいところです。
7.繰り返し型の開発プロセス
本格的かつ工業的にシステムを開発する以上、なくてはならないのが開発プロセスです。とはいえ、現在世の中に出ている製品すべてが開発プロセスに乗って作られたのかといえば、決してそうではないのが現実でしょう。その原因の一つには、いままで主流となっていた机上の検証を前提にして進めていくウォータフォール型の開発が、不確かなものが多いソフトウェアの開発現場にはうまく適用できなかったことがあげられます。
ようやく最近になって、もうそういったトップダウン的で現場に適応しないやり方は捨てて、もっと草の根的に実践的なやり方をボトムアップで決めていこうという流れが出てくるようになりました。いわゆるベストプラクティス(実践原則)といわれる考え方です。そして、開発プロセスに関していえば、不確かなものを少しずつ実際に動かして開発リスクを減らしていく繰り返し型の開発が、ベストプラクティスとして徐々に脚光を浴びるようになってきました。
繰り返し開発自体は、従来からあったものなので、みなさんも情報処理試験を勉強する際などに、一度は耳にしたことがある言葉でしょう。ただ、最近UMLといっしょに使われている繰り返し開発は、開発リスクという考え方を前面に押し出している点が大きな特徴となっており、繰り返すたびに「機能を増やす」だけでなく「リスクを下げる」ことが基本となっています。
ラショナル統一プロセス入門 |
著者 : | フィリップ・クルーシュテン |
監訳 : | 藤井 拓 |
訳 : | 日本ラショナルソフトウェア(株) |
発行 : | ピアソン・エデュケーション |
ISBN : | 4-89471-157-5 |
|
|
現在、オブジェクト指向とUMLを前提とした繰り返し型の開発プロセスとして、きちんと定義されたものに「Rational Unified Process(以降、RUPと呼ぶ)」と呼ばれるプロセスがあります。RUPの特徴は、繰り返し型開発にUMLを持ち込み、成果物としてどんなモデル図を作成すればよいかを定義したこと、そして繰り返し型であいまいになりがちな「何回目の繰り返しか」、「何を目的とする繰り返しか」といった、いわゆる繰り返しの進行度合いや成熟度についてフェーズという考えを持ち込んで定義したことでしょう。
この本は、そのRUPの提唱者自身によって書かれた公式ガイドといった位置づけです。しかし、残念ながら内容が抽象的なため、さらっと読んだだけではRUPの何たるかをつかむことが難しいかもしれません。また、RUP自体の正式なドキュメントがHTML化されてRational社から販売されているのですが、そちらはあまりにも詳細すぎるため、開発プロセス好き以外の人にはとてもおすすめできません。
ということで、何だかとっても難しそうに感じるRUPですが、そのエッセンスだけを知るのに最適な本を3冊、次に示します。
2冊目は『UML モデリングのエッセンス 第2版』です(書籍データは前項を参照してください)。すでにUMLのところで紹介した本ですが、この本の第2章ほど繰り返し開発を端的にうまくまとめた本はないでしょう。直接的なRUPの説明ではありませんが、その基本である繰り返し型開発のまさに「エッセンス」だけを学ぶことができます。
ソフトウェアプロジェクト管理 |
著者 : | ウォーカー・ロイス |
監訳 : | 日本ラショナルソフトウェア(株) |
発行 : | アジソン・ウェスレイ |
発売 : | 星雲社 |
ISBN : | 4-7952-9737-1 |
|
|
こちらは、おもに繰り返し型開発に焦点を当てて書かれた大作ですが、この本の第5章は、まさにRUPのエッセンスだけを絞り出したような内容となっています。この本は、前に紹介した『ラショナル統一プロセス入門』ほどRUPに限定せずに、繰り返し開発一般について書かれているのが特徴になりますが、私としては、むしろこちらの多少引き気味のスタンスのほうが、RUPの概観をつかむうえではわかりやすいような気がします。
開発プロセスは、考え方は良くても、きちんと定義すればするだけどんどんと形式化してしまう傾向があります。それはRUPに関しても同様で、ドキュメントに沿ってまじめに進めていけばいくほど、リスクドリブンならぬドキュメントドリブンになってしまう危険性を多分にはらんでいます。
そういう意味では、特に「UML モデリングのエッセンス」と「ソフトウェアプロジェクト管理」の2冊はまさにRUPの落としどころをきちんとついている優れモノです。個人的には、最初はこれだけを参考にして、繰り返し型開発プロセスを実践してみることをおすすめします。
UMLによる統一ソフトウェア開発プロセス |
著者 : | イヴァー・ヤコブソン/グラディ・ブーチ/ ジェームズ・ランボー |
監訳 : | 藤井 拓 |
訳 : | 日本ラショナルソフトウェア(株) |
発行 : | 翔泳社 |
ISBN : | 4-88135-836-7 |
|
|
スリーアミーゴのI. ヤコブソンによって書かれた本で、繰り返し開発についてはもちろんのこと、とくにシステム開発で行われる具体的な作業手順(ワークフローと呼ばれる)についての詳細な説明がなされているところが、前で紹介した3冊とは大きく異なる点です。なお、先に紹介した「RUP」とこの「統一プロセス」は厳密にはちょっとだけ違うらしいのですが、基本的には同じなのであまり気にする必要はないでしょう。
私がとくにお薦めする部分は、先に触れた作業手順についての記述部分です。コンサルタントが不要になるくらい詳細かつ具体的な内容となっており、UMLを使って繰り返し型の開発を進めていく場合、おそらく現時点でいちばん詳しいガイドブックといえるでしょう。そういう意味では、UMLとこの開発プロセスを合わせたものが、まさに最新の方法論と呼べるのかもしれません。
惜しむらくは、かなり分厚い(約500ページ)ことで、きちんと全体の流れを抑えながら自分の必要な部分だけを吸収していかないと、その膨大な情報量に圧倒されてしまうでしょう。まずは、先に紹介した方法論や『実践UML』などで、あらかじめ一通りの開発イメージをつかんでおくことをおすすめします。
なお、最近はRUPに対して、よりボトムアップ的なXP(Extreme Programing)というプロセスが台頭してきました。こちらはExtremeというだけあって、モデルよりも実装とテストを中心に据えた、いままでの方法論を超えたものです。こちらについては、翻訳本が出版されています(『XPプログラミング』、ISBN:4-89471-275-X)ので、興味のある方はそちらをご覧になるとよいでしょう。
8.組み込み向けオブジェクト指向
さて、最後は、組み込み・リアルタイムシステムを対象としたオブジェクト指向関連の本を紹介しましょう。
最近、ビジネス系ではすっかり根付いた感のあるオブジェクト指向ですが、組み込み分野に関してはまだまだ発展途上というのが正直なところです。効率重視、変わりやすい環境、少ないリソースなど、その浸透を阻害してきた要因は数々ありますが、もっとも大きな要因の一つは、この分野を題材としたオブジェクト指向関連の書籍の少なさがあげられます。
しかし、そういった声に応えるかのように、ここ最近になって、この分野を対象とした書籍が徐々に出版されるようになってきました。そこで今回は、最近出版された2冊の本を中心に紹介していくことにしましょう。
リアルタイムUML 第2版 オブジェクト指向による 組込みシステム開発入門 |
著者 : | ブルース・ダグラス |
監訳 : | 渡辺 博之 |
訳 : | (株)オージス総研 |
発行 : | 翔泳社 |
ISBN : | 4-88135-979-7 |
|
 |
この本は、組み込み・リアルタイムシステムの開発者を対象としたオブジェクト指向およびUMLに関する入門書です。扱っている内容も、組み込み・リアルタイムシステムとは何か、開発プロセス、UMLの記法一般、オブジェクト指向開発の手順など非常に幅広く、この本を読むにあたってはいっさいの予備知識を必要としません。UMLやオブジェクト指向を知らない初心者にも、組み込み・リアルタイム開発が初めての初心者にも、入門用としてはまさにうってつけの1冊です。
では、すでに経験を積んでいる人には役立たないのかといえばそうでもなく、自分の知識を整理したり改めて体系化するうえでは、一度目を通すとよい本です。とくに2章のユースケースに関するTIPSや3章のクラス抽出に関するノウハウ部分、5章のタスク分割の指針などは、これまではあまりまとまって語られることがなかった部分でもあり、経験者にも有用な指針として参考になるでしょう。
また、第4章では状態図をきわめて詳細に扱っていますが(正直、ちょっとくどいと感じるほどですが……)、UMLの状態図を詳細に扱った本は私の知るかぎりまったくないので、日頃から状態遷移を使い慣れている人や状態モデルが複雑になりがちな通信システムなどを開発している人などには、ぜひこの部分の一読をすすめます。
Designing Concurrent、 Distributed、 and Real-Time Application with UML |
著者 : | HASSAN GOMAA |
発行 : | ADDISON-WESLEY |
価格 : | $54.95(US) |
ISBN : | 0-201-65793-7 |
|
 |
〔本書は洋書で、日本語版はまだありません(現在、翻訳作業中とのことです)〕
組み込みシステムをオブジェクト指向で開発する際には、大きなポイントが二つあります。まず、きちんと適切なクラスを切り出すこと、次にシステムの特徴にフィットしたアーキテクチャを構築することです。そしてこの課題に対し、あらかじめ組み込みシステムで使われるクラスやアーキテクチャを分類しておき、システムの特徴に応じてそこから選び出し、はめ込んでいくというアプローチをとっているのがこの本です。
先に紹介した『リアルタイムUML』はどちらかといえば入門書に分類されますが、この本は組み込み・リアルタイムやオブジェクト指向・UMLなどについての一通りの知識をもった人向けの実践ガイドといった趣になります。一応、UMLや開発プロセスなどの解説はあるのですが、あくまでも確認程度なので、初心者は別の本で知識を習得してから読むべきでしょう。
冒頭でも述べたとおり、本書ではクラスやアーキテクチャの構成要素をあらかじめいくつかのカテゴリに分類します。クラスについていえば、ヤコブソンのOOSEで提唱されている3分類(エンティティ、バウンダリ、コントローラ)を中心に、コーディネータ、アルゴリズム、入力デバイス、出力デバイスなどが新たに追加されます。また、タスクに関しては、非同期I/Oタスク、周期I/Oタスク、パッシブI/Oタスク、リソース監視タスク、周期内部タスク、非同期内部タスク、コントロール内部タスク、ユーザーインターフェースタスクなどが分類され、定義されます。
この分類アプローチ(私の勝手な命名)は、設計の部分で紹介したパターンアプローチとも似ていますが、パターンのように要素の組み合わせ方まで言及していない分、より広範囲に利用できるというメリットがあります。この方法をシステム開発に持ち込めば、制約が少ない分、その分いちばん難しい、分析やアーキテクチャ設計などの上流工程に対し、アドホックな設計や経験・知識などの属人性を排除するという点で、非常に大きな効果が得られます。ちなみに、私も最近の開発では、この本の私と同じようなアプローチをとることが多く、ユースケースやクラスに関して分類を行っている最中です。
なお、これ以外にも本書では、タスク分割の詳細やスケジューリング可能性の分析などについて、かなり詳しい解説がなされており、その点でも価値のある1冊となっています。
オブジェクト・モデリング |
著者 : | レオン・スター |
訳 : | Shlaer-Mellor研究会 |
発行 : | プレンティスホール |
ISBN : | 4-89471-036-6 |
|
 |
組み込み・リアルタイムというと、どうしても状態遷移に基づいた制御中心のシステムを考えてしまいがちです。そして、これらの制御クラスがなんでもかんでも情報をもってしまうと、あっという間に巨大な状態遷移をもった制御クラスができてしまいます。しかし、これでは制御クラスの内部がとても複雑になってしまい、結局従来の開発と何ら変わりません。
このようなクラスができてしまう原因は、システムで扱う情報がきちんと分析されていないという点にあります。分析段階において、システムにはどんな情報があり、それらがどういった関係をもっているのかがきちんとクラス図でとらえられていれば、システムは適切な役割をもった多くのクラスに分割され、それほど巨大な制御クラスができるようなことはありません。
ところが、状態遷移を使って制御中心にシステムを作ってきた組み込みエンジニアにとって、この「情報を静的に分析する」ということは非常に苦手な作業の一つです(データベース中心にやってきたビジネス系の人たちと好対照です)。
これを何とかするためには、いわゆる組み込み分野を題材にし、クラス図を使った分析の仕方を懇切丁寧に説明した書籍が必要です。先に紹介した2冊とも、その点に関してはあまり示唆を与えてはくれず、どちらかといえばむしろ状態図やタスクといった動的な視点からの分析が中心になっています。
前置きが長くなってしまいましたが、ここで紹介する『オブジェクト・モデリング』は、まさにその期待に応えてくれる本で、あえて状態図やタスクにはいっさいふれずにクラス図のみを扱ったじつに渋い1冊となっています。
この本を読むと、従来ならコードでベタに記述していた制御手順や制御フラグのようなものでもクラスや属性として記述ができること、仕様クラスと実体クラスを分離するとモデルがとても簡素になること、欠陥・要求・位置・単位などといった概念をクラスにすると有効なことなど、クラス図に関する多くのノウハウを得ることができます。そして、それらは間違いなく実開発で役立つものばかりです。
また、汎化の考え方が集合であることや、そこから導かれる多重分類や動的分類など、オブジェクト指向の基本となる考え方についても大いに洞察を深めてくれます。
なおタイトルにもあるように、本書はシュレイアー・メラー法と呼ばれる方法論に基づいて書かれているため、モデルもUMLではなくシュレイアー・メラー法の表記法が使用されています。一見すると、とっつき難さを感じますが、約束事がUMLよりはるかに少ないので、読み進めていくうえではとくに問題にはならないでしょう。
クラス図はオブジェクト指向の基本中の基本であり、とくに制御中心の組み込みエンジニアにはいちばん不慣れな部分であるため、ぜひ一度は目を通しておきたい本です。とはいえ、モデリングにある程度慣れていないと面食らってしまうでしょうから、対象読者は初心者ではなく、ある程度の経験を積んだ中・上級者向けということになるでしょう。
Effective C++ |
著者 : | Scott Meyers |
訳 : | 吉川 邦夫 |
発行 : | アスキー |
ISBN : | 4-7561-1808-9 |
|
 |
More Effective C++ |
著者 : | Scott Meyers |
訳 : | 安村通晃/伊賀聡一郎/飯田朱美 |
発行 : | アジソン・ウェスレイ |
ISBN : | 4-7561-1853-4 |
|
 |
C++オブジェクトモデル 内部メカニズムの詳細 |
著者 : | S.B.リップマン |
訳 : | 三橋二彩子/佐治信之/原田曄 |
発行 : | アジソンウェスレイ・トッパン |
ISBN : | 4-8101-8101-4 |
|
 |
組み込みシステムでは通常のアプリケーションとは違って、極力少ないリソースで最大限の効率を発揮することが求められます。継承を使えば仮想関数テーブル分の領域が追加されることや、関連を追加するごとにアドレス幅分の領域が増えることを常にトレードオフとして考えながら設計・実装を行わなくてはなりません。
したがって、C++をひととおりマスタしても、実際の組み込みシステムを実装するためには、もう少々の修行が必要になります。そして、そんなときに最適なのが、ここにあげたC++に関する書籍群です。
Effective C++シリーズは、すでにひととおりのC++知識をもっている人を対象により高度なテクニックを、最後のC++オブジェクトモデルはC++の裏側でこっそり何が行われているかをそれぞれしっかりと教えてくれます(どちらも決してC++の入門書ではないので、お間違えのないように!)。
たとえば、組み込みシステムでも通信系やOA機器などのようなデータ処理の多いシステムでは、どうしても動的なオブジェクトの生成・削除が必要になってきます。そして、貧弱な環境下で効率を落とさずにそれらを実現するためには、new、deleteをカスタマイズし自分でメモリを管理する必要性が出てきます。『More Effective C++』の第8章には、まさにそんなケースに最適な、newやdeleteのオーバロードに関する話題を扱っていますし、『Effective C++』でも、効率を上げるために自分でオブジェクトのメモリ管理をするテクニックが載っています。
おわりに
以上、オブジェクト指向に関してこれだけは読んでおきたいという本を、私の独断と偏見を交えながら紹介してきました。改めてこうやってながめてみると、やはりスタンダードと呼ばれる本が並んでしまいました。でも、「これだけは……」というフィルタをかけてしまうと、どうしてもこのあたりが残ってしまうようです。
そして「これだけは」と言いながらも、なんだかんだとかなりの数の本を紹介してしまいました。ただ、レベルにあった本を選ばないと労多くして実り少ない……ということになってしまうので、まずは身の丈に合った本から読んでみるのが良いと思います。
それと、やっぱりオブジェクト関係の本は厚くて重くて高いものが多いですね。UML関係ではいくつか薄い本が出てきたとはいうものの、そういった本はまだまだ少数です。今回紹介した本も、価格の平均は大体4、000円前後ですし、依然として書籍選びのリスクはかなり高めです。そういった読者の書籍選びのリスク軽減に、本稿が少しでもお役に立てば、私としても嬉しい限りです。
わたなべ・ひろゆき (株)オージス総研 Watanabe@ogis-ri.co.jp