あるETロボコン参加チームの進捗報告をちらちらと拝見させていただいているのですが、最近の進捗報告の中に「モデルとは基本的に図のことである」という記載をみつけたので、ちょっと放っておくことができずにマサカリを投げてみることにしました。 😉
上の図は「Mindstorms NXTの光センサー」と「Mindstorms EV3のカラーセンサー」をモデリングしたクラス図です。
実はこの図は astah や Enterprise Architect, Microsoft Visio といったGUIツールは使わずに描いています。マウスもスタイラスペンも使っていません。キータイピングだけで生成しています。
class.dot
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
digraph G { node [ shape = "record"; ] Generic_LightSensor [ label = "{LightSensor|- port : char|+ on() : void\n+ off() : void\n}"; ] LightSensor_for_NXT [ label = "{LightSensor for NXT||+ getLight() : unsigned char\n}" ] ColorSensor_for_EV3 [ label = "{ColorSensor for EV3||+ getRed() : unsigned char\n+ getGreen() : unsigned char\n+ getBlue() : unsigned char\n}" ] LightSensor_for_NXT -> Generic_LightSensor ColorSensor_for_EV3 -> Generic_LightSensor } |
はじめて見るかたも多いと思いますが『DOT言語』というデータ記述言語でコーディングしています。
このDOT言語で記述した class.dot を dotコマンド(Graphviz)を使って以下のように変換すると最初のクラス図(画像ファイル)が生成されます。
1 |
$ dot -T png -o class.png class.dot |
最初に示したクラス図(Class Diagram)と次に示したDOT言語コード(Source code)は相互に自動変換可能です。今回は説明のためにDOT言語の記述を簡略化しているため、クラスの関連線が継承関係なのか依存関係なのか定義していませんし、プロパティーの区切りも改行文字使っています。実際のところは見た目だけクラス図らしきものを生成するなんちゃってDOTコードではあるのですが、「モデルは基本的に図である」を否定する傍証にはなるのではないかと思い例示しました。
クラス図を書くためにいちいちDOT言語で記述するメリットはありませんが、JavaやC++のソースコードからクラス図を自動生成(リバースエンジニアリング)する目的で、しばしばこのDOT言語が利用されています。
モデルは図(Diagram)で記述することもできるけれどもコード(Code)で記述することもできる。(共通のルールにしたがって記述した)図とコードは互いに等価で相互にプログラムで変換することもできるし、Javaで記述するコードもC++で記述するコードもモデルの記述方法の一つであるから(原理的には)相互に自動変換(コード自動生成)が可能である、ということが、たとえばモデル駆動開発(MDD:Model Driven Development)の重要な概念になっています。
では最初の進捗報告「モデルとは基本的に図のことである」は、どう書き直せばよいでしょうか? 私であれば「モデルは図で記述されることが多い」と書き直します。みなさんならどう書き直すでしょうか?
2015年6月5日 追記
saltheadsさんから、PlantUMLというソフトウェアを教えていただきました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@startuml class LightSensor { - port : char + on() : void + off() : void } class ColorSensor_for_EV3 { + getRed() : unsigned char + getGreen() : unsigned char + getBlue() : unsigned char } class LightSensor_for_NXT { + getLight() : unsigned char } LightSensor_for_NXT --> LightSensor ColorSensor_for_EV3 --> LightSensor @enduml |
1 |
$ java -jar plantuml.jar class.txt |
PlantUMLを使うと上記のコードが下記のクラス図に変換されます。
PlantUMLもgraphvizを使っているので似たようなクラス図が出力されるのですが、コードも出力されたクラス図も、よりUMLのセマンティクスに厳密ですね。saltheadsさん、ありがとうございます。 😀