![]() |
[2003 年 2 月号] |
[技術講座]
「 UML ってなんだろう?」
このことに答えるために書かれた解説本や雑誌記事が、巷 ( ちまた ) には溢れてきました。この記事をご覧になっている読者も、少なくとも UML というキーワードについてはご存知の方も多いでしょう。
この連載もご多分に漏れず、UML を理解していただくことが目的ですが、その中でも Java プログラマの方が開発現場で即役立つような UML 入門 を目指しています。
そのため、実際に動作する Java プログラムを例題にとり、実際の開発の過程を追いながら話を進めていきたいと思います。
連載第一回目である今回は、UML についての簡単な予備知識と、今後の進め方について解説していきます。
この連載を通して UML を理解していただくためには、ある程度 Java プログラミングの知識が必要です。そうはいっても、あまり難しいテクニックを使うわけではないので、一通りの Java のシンタックスを理解していただいている方であれば、問題なく読み進めていけるでしょう。
UML といえばまた、「オブジェクト指向」についての前提知識を問われることが多いのですが、ここではあえてそれについては必須とはしません。当連載を通して、オブジェクト指向開発について、なんとなくエッセンスを学びとっていただければと考えています。
本連載は「 UML を理解する」ことが目的ですが、この理解の到達レベルに目標を設定してみたいと思います。
筆者が籍をおく ( 株 ) オージス総研では、 「 UML 技術者認定制度」( *1 ) というものを行っています。現在、「ブロンズ」「シルバー」「ゴールド」という 3 つのレベルの試験が設定されており、インターネットを通して Web ブラウザ上で受験し、その場で合否判定を受けることができます。 ( 無料 )
2002 年 4 月時点で認定試験の受験者 ( ブロンズ ) は、のべ 123,000 人にものぼり、そのうち約 21,000 人が「ブロンズ」の試験に合格されています。
今回の連載を通して、読者にはこの「ブロンズ」の試験に合格することを目標にしていただきたいと思います。どんどんチャレンジしてみてください。
UML ( Unified Modeling Language ) は OMG ( Object Management Group ) (*2) という標準化団体で規定されているソフトウエア開発におけるモデリング言語です。「統一 ( Unified ) 」というキーワードが冠についているのは、もともと色々な方法論者が提唱し、百花絢爛だったモデル表記法を、 3 名の著名な方法論者 ( *3 ) が手を組み統一したことによります。
1997 年に登場した UML 1.0 は、OMG に提案され、改良された UML 1.1 が標準化認定を受けました。その後、何度かの改定が行われ、 現在 UML 1.4 が最新のバージョンとなっています。 UML を ISO ( International Organization for Standardization ) ( *4 ) 標準に提案する動きもあり、そうなれば確固たる業界標準の位置付けを確保することになるでしょう。
*2 ) オブジェクト技術の標準化、普及を進めるために 1989 年に設立された業界団体。世界各国の情報システムベンダ及びユーザ企業を含む 800 以上の会員企業から構成される。
*4 ) 各国の代表的標準化機関から成る国際標準化機関。「民間自身が民間のために民間規格を作る機関」として 1947 年に設立された。現在、本部はスイスのジュネーブにある。
UML はよく 開発方法論 ( *5 ) と混同されるのですが、あくまでも表記法とそのセマンティクス ( 意味 ) を定義したものであって、開発の手順などを規定した開発方法論からは独立したものです。
UML はまた、その名称 ( Unified Modeling Language ) から、Java や C++ のようなプログラミング言語と同一視されやすいのですが、実際にはソフトウエア開発において、主に利用されるタイミングが異なってきます。
オブジェクト指向によるソフトウエアの開発は、いくつかの工程に分けられ、異なった目的での作業 ( モデリング ) が行われます。そして各作業の目的に応じた成果物 ( モデル ) が作成されます。これらは、数多くある開発方法論によっては分け方や呼び方は異なってはきますが、大枠では表 1 のようになります。
工程 | 作業内容 ( 成果物 ) |
---|---|
要求定義 | 利用者がシステムに何をしてもらいたいかを決める ( 要求モデル ) |
分析 | システムに対する要求を理解しやすい形式に分割・構造化して設計に備える ( 分析モデル ) |
設計 | 分析で定義された要求をどのような方法で実現するかを決める ( 設計モデル ) |
実装 | プログラミングをして実際に動作するものを作成する ( 実装モデル ) |
Java や C++ は、主に「実装」の工程で利用されますが、UML は「要求定義」〜「設計」工程での利用が中心になります。しかしながら、最近、UML でモデリングすることにより実行可能なモジュールまで作成してしまうという、 executable UML ( *6 ) という方法論やMDA ( Model Driven Architecture ) ( *7 ) という仕組みが考えられてきて、設計と実装の境界があいまいになりつつあります。
オブジェクト指向のコミュニティでは、プログラミングは設計作業であると主張する人もいます。
UML を利用することによる一番のメリットは、開発に携わる人たちが共通の言葉を持ち、コミュニケーションができるということです。そんなこと日本語や英語などの自然言語でも同じじゃないかと言われてしまいそうですが、自然言語がもつ万能の表現力は、逆にソフトウエアという限られた領域の中では、あいまいさや冗長性を生んでしまいます。「餅は餅屋」ではないですが、ある目的のために特化された道具は、他の汎用的なものより優れているものです。
いったん作成した成果物 ( またはその一部 ) を、別の機会に再利用したいという要求は、どの世界でもあります。例えば、建築の世界でいえばデザインや構造。これらは設計図という形で残されます。同じ設計で作成された部品 ( たとえばドアや窓、ユニットバス ) などはいろいろな異なった建物に利用されます。すべての家ごとにそれらをいちいちデザインしてカスタムメイドで作成していたら、それころ大変なコストがかかってしまいます。 ( お金と時間に余裕のあるかたは、この自分だけのカスタムメイドに価値を見出すのですけど、なかなか庶民には・・・ )
この「設計図」と「部品」という形での資産の残し方は、ソフトウエアの世界でも行われています。「部品」にあたるソースコードや実行モジュールという形での再利用はこれまでにも、それなりに行われてきました。しかし、利用するプログラミング言語や環境 ( OS やミドルウエア ) が異なってしまうと再利用は難しく、また同じプログラミング言語や環境を利用していても、進歩が早いこの世界では頻繁に機能向上・バージョンアップが行われ、バージョンが異なるため利用できなくなるといった問題を抱えています。
「設計図」という形での再利用もこれまでに行われてきてはいますが、建築の世界のような標準の「設計図」の書き方のルールがなかったため、会社や組織ごとに書き方のルールがバラバラで、結局は有効に資産が活用されていないのが実情でした。
その点 UML の登場によって、「設計」の再利用が非常にやりやすくなりました。UML はまた環境に非依存なモデリング言語のため、いったん作成した設計モデルは、いろいろな言語や環境で利用することができます。
これは、モデルとして蓄積したノウハウが陳腐化しにくいということを意味します。
オブジェクト指向の世界においては、とても頭のいい先人達が、いろいろなシチュエーションでのノウハウを「パターン」という形式で残してくれています。
代表的なパターンとして、 デザインパターン ( *8 ) 、アナリシスパターン ( *9 ) があげられます。前者は設計、後者は分析におけるノウハウをいくつかのパターンという形で提供してくれています。これらは、もともと UML で記述されたものではありませんでしたが、よりスタンダードな UML 標記によって多くの書籍や Web ページで紹介されることにより、認知度も高まりつつあります。
UML の大きな利点のひとつとして、その拡張性があげられます。もともと UML で定義されている基本語彙 ( 表記とセマンティクス ) のほかに、利用者が新たにそれらを拡張できる「ステレオタイプ」や「タグつき値」というメカニズムをもっています。これらの使い方については次回以降に回しますが、具体的な例として以下のような拡張例があげられます。
拡張の例として特定の分野や目的に特化した UML での利用例があげられます。
" eUML "
これは、組み込みシステムと呼ばれる一般のコンピュータとは異なった環境で動作するソフトウエアを構築するのに適した手順やノウハウをまとめた方法論です。現在、筆者の所属する ( 株 ) オージス総研や、その他組み込みシステムに強いベンダーのエンジニアが集まって策定を進めています。このなかでは、組み込みシステム特有の UML 拡張を定義しています。
" UML Extension for Web Application "
これはWebに特有なアーキテクチャの要素を他の部分と同じようにモデル化できるようにするために、セマンティクスと制約を追加した UML 拡張です。この内容は 「 UML による Web アプリケーション開発」 という書籍のなかで紹介されています。 ( 参考文献 1 )
UML の利用範囲は、ソフトウエア開発の範囲だけには留まりません。
昨今の厳しいビジネス環境のなか、経営判断の迅速化や経営資源の適正配分、それを実行する手段としての BPR ( *10 ) のためにも、UML が注目されています。そもそも多くの組織や人間とその利害関係が複雑にからみあっているビジネス自体がおおきなシステムであると考えれば、当然のことかもしれません。
これらを整理するための UML 拡張を紹介したものとして、以下のようなものがあげられます。
" Business Modeling with UML " ( 参考文献 2 )
" Enterprise Modeling with UML " ( 参考文献 3 )
もう、これからは UML はソフトウエアエンジニアだけのもではなくなるでしょう。
実例をともなった詳細な説明は次回以降にして、ここでは簡単に UML で利用する各ダイアグラム ( 図 ) について紹介していきます。
UML で定義されているダイアグラムは大きく分けて、以下のように分類されます。
それぞれの分類毎のダイアグラム一覧を表 2 に示します。
分類 | ダイアグラム名 | 表現する内容 | 図の例 |
---|---|---|---|
機能 | ユースケース図 |
|
![]() |
論理構造 | クラス図 |
|
![]() |
パッケージ図 |
|
![]() |
|
オブジェクト図 |
|
![]() |
|
振る舞い | シーケンス図 [ 相互作用図 ] |
|
![]() |
コラボレーション図 [ 相互作用図 ] |
|
![]() |
|
ステートチャート図 |
|
![]() |
|
アクティビティ図 |
|
![]() |
|
物理構造 | コンポーネント図 |
|
![]() |
配置図 |
|
![]() |
それぞれについて簡単な概要を説明していきます。
これに分類されるのは「ユースケース図」です。ユースケース図は、利用者の視点でみたシステムの機能群を表現します。もちろんシステムに対する要求をこの図だけで表現できるわけではなく、あくまでも一覧的に見るためのもので、実際の要求定義工程においては、その他いろいろな 補足ドキュメント ( *11 ) を作成します。
UML での代表格がこのクラス図でしょう。クラス図はシステムを構成する論理要素の構造を示すものです。クラス図という名が示すとおり、代表的な構成要素がクラスになるわけですが、このクラスの説明についてはここでは省略します。とりあえず、Java のプログラムを組んだことがあるかたであれば、クラスという概念についてはご存知でしょう。
実際の開発では、何をこのクラスとして定義するかがポイントになってくるわけですが、次回以降のケーススタディを通してご説明していきます。
パッケージという要素は、その言葉のとおり、いくつかの要素を含んでひとまとめにしたものです。上述したクラスもこのパッケージに含めることができます。また、このパッケージもそのもう一つ上のパッケージに包含させることもできます。
パッケージ図は、このように要素をグルーピングしたり、グループ間の依存関係を定義するために使用します。なお、正式にはパッケージ図という言葉は OMG における UML 仕様では定義されていません。パッケージはあくまでもクラス図で扱う一要素として定義されています。しかし、このパッケージとその関係だけを定義した図は実際の開発でよく利用され、パッケージ図という名称で広く普及しています。
クラス図とよく似ているのですが、オブジェクト図はある時点でのクラスから生成されたオブジェクト間の関係を示したものです。例えば Java 言語で言えば、クラス図がソースコード上のクラス構造を表現しているとしたら、オブジェクト図はその Java プログラムが実行されたある一時点でのメモリ上のオブジェクト ( インスタンス ) の関係を表します。
これらはどちらも、ある機能を実現するために、システムの構成要素 ( オブジェクト ) がどのように協調動作する必要があるかを表現したものです。これら二つの図をまとめて相互作用図と言います。
これら二つの図は、好みにもよりますが、その図で明確にしたい点がなにかによって使い分ければよいでしょう。例をあげれば、シーケンス図は相互作用の順番を明確に表現することを得意とします。それに対し、コラボレーション図は、協調動作 ( コラボレーション ) における各オブジェクトの役割が見やすいという利点があります。筆者は、より上流段階の作業においてコラボレーション図を多用します。
あるオブジェクトの状態が、外部からのイベントなどにより、どのように変化するかを示した図です。実際の開発においては、オブジェクトの状態だけではなく、システム全体や、ユースケースの実行状態など、状態やその変化を表現する目的全般に使われます。
処理や業務の流れ ( ワークフロー ) を表現するのに利用されます。前者の目的で利用した場合はいわゆるフローチャート、後者の目的で利用する場合は業務フローとして以前から広く利用されていたものとほぼ同様なものです。
システムの物理的な構成を表現するのがコンポーネント図と配置図です。コンポーネント図は、システムを構成する物理的要素 ( コンポーネント ) や、それら要素間の依存関係などを表現します。
配置図は、コンポーネント図で定義されているコンポーネントが、実際にどの機器 ( コンピュータやその他の装置 ) に配置され、稼働するかを示すものです。
さて、次回以降はケーススタディを使って解説していきますが、今回はその予告編です。
中堅ソフトウエア会社に勤める Chen 君は、ある日の午後、Jun 先輩に呼び出された。Chen 君は今回転勤した Mika さんの後任として、Jun 先輩のチームに配属されたばかりなのだが・・・
![]() |
Chen 君。Mika が転勤したのは知ってるよね。 |
---|---|
![]() |
はい。 ( いやな予感・・・ ) |
![]() |
そこで君にお願いなんだけど、うちのグループで標準にしているスケジューラソフトあるでしょ。あれ、彼女が片手間に Java で作ったんだけど、なんてったってタダだし結構便利なんだよね。でも、ちょっと機能が足りないので追加して欲しいんだけど、いいかな。 |
![]() |
今、仕事もひと段落ついていることだし、いいですよ。で、当然ドキュメントとかあるんですよね? |
![]() |
いや〜、それがないんだよね ( キッパリ ) 。君も UML については結構勉強しているようだし、ついでにドキュメントの作成もしてみないか。君のためになると思うよ。 |
![]() |
( ・・・・・ ) |
![]() |
じゃあ、追加してほしい機能とソースコードの場所をメモに書いておいたので後はよろしく。一週間もあればできるよね。それじゃ。 |
Jun 先輩は一枚のメモ用紙を残して去っていくのであった。
Jun 先輩から渡されたメモ用紙には、次のような機能の追加要望が書いてあった。
「予定の時間になったら何らかの方法で知らせてくれる、アラーム機能の追加」
「まずは、現状のプログラムの調査から初めてみるか。」
Chen 君は、指定された場所に置いてあったソースコードを自分の PC のディレクトリにコピーしてコンパイル後、早速実行してみた。その結果、次のような画面が表示された。これがメインの画面らしい。
日付の部分をクリックしてみると、予定を入力する画面がポップアップ表示された。この画面からスケジュールを入力するようだ。
試しに予定入力をしてみると、予定を入力した日付が黄色くマークされた。
再度、マークされた日付をクリックしてみると、今度は先ほどとは違う画面が表示された。どうやら、すでにその日にスケジュールが入力されている場合はこのような画面が表示されるようだ。
この画面では、さらに予定の追加や編集・削除ができるようだ。Chen 君はこれらの機能を整理してメモにまとめてみた。
「さて、機能や画面の使い方もわかったし、早速ソースコードを解析しながらUMLでのドキュメント作成を始めるかな。 ( ワクワク ) 」
全 6 回の連載の内訳は大体以下のような内容を想定しています。
UML を学びながら Java プログラムの構造をUMLでモデル化していく
新たに追加される要求を UML を使ってモデル化してみる
要求定義 -> 分析 -> 設計 -> 実装という形式で進めていくのが一般的な UML 解説記事のセオリーなのかもしれませんが、実際の開発においては既存のシステムが存在することが大半です。
そういう意味でも、今回は既存のシステムの解析から進めていきます。要求定義から順番に進めるのは、新たな変更要求 ( 今回の場合アラーム機能の追加 ) を反映する2回目の繰り返しでの作業として説明します。このような過程を踏むことによって、オブジェクト指向開発で推奨される 繰り返し型開発 ( *12 ) の雰囲気を学んでいただける手助けになるかもしれません。
次回はまず、具体的なソースコードと UML の各ダイアグラムを使いながら既存のプログラムの解析をしていきます。
乞う、ご期待ください。
今回から連載をスタートしましたが、初回の内容はいかがでしたか。内容についてはなるべく難しい技術用語やアカデミックな用語を避け、初心者の方でも読みやいよう努めたのですが、その分ある程度経験がある方にとっては物足りなかったかもしれません。
冒頭でも書きましたが、昨今の UML の盛り上がりは確かに一過性のブームであるかもしれません。しかし UML はこの盛り上がりの後、すたれてしまうのではなく、あえて取り上げる必要の無いほど、エンジニアにとって基本的な要素として定着するのではないでしょうか。
当連載を通して、ぜひとも UML のエッセンスを感じとっていただけたらと思います。
連載記事一覧
© 2002 - 2003 OGIS-RI Co., Ltd. |
|