PlantUMLのアクティビティ図の新記法と旧記法の違いを確認する
前回の記事ではAndroidStudioにPlantUMLのプラグインを追加してFizzBuzzをアクティビティ図で表現してみました。
そこでアクティビティ図の作成には2つの記法があるということにさらっと触れましたが、今回はそれぞれの記法で同じ図を作成してそれぞれの違いを見てみましょう。
PlantUMLの新記法とは
PlantUMLのアクティビティ図には2つの記法があります。新しい記法は2013年2月からベータ版として定義されており、旧記法より簡潔に記述することを目的に開発されているようです。
また新記法では旧記法に比べて、デフォルトでかなり綺麗に図を描画してくれます。それぞれの記法での図の出力結果は後述しますが、新記法が導入されたことにより見た目の調整に必要な時間がかなり短縮できるようになったので、積極的に導入していきたい記法です。
旧記法でFizzBuzzのアクティビティ図を書く
旧記法では各アクティビティは-->
で記述します。「開始」→「アクティビティA」→「アクティビティB」→「終了」は以下のように表現します。
@startuml (*) --> "アクティビティA" as A --> アクティビティB --> (*) @enduml
各アクティビティはas
で別名を付けることができます。ダブルクォーテーションはあってもなくてもいいですが、別名を付ける際には必要です。
矢印の方向を指定する場合は-right->
、-down->
のように書きます。矢印の前に識別子を指定することで、指定したアクティビティから線を引くことができます。アクティビティ名にas
で別名をつけた場合はその文字列が、ダブルクォーテーションで囲まなければその文字列が自動的に識別子として使用できるようになります。
各アクティビティ名の前に[]
でコメントを追加することができます。
以上を踏まえて旧記法で素朴にFizzBuzzを作成してみると以下のようになります。
@startuml (*) --> "ループ開始(1〜100)" if "i <= 100" as judge then [true] if "i % 3 == 0 && i % 5 == 0" then --> [true] FizzBuzz --> judge else [false] if "i % 3 == 0" then --> [true] Fizz --> judge else [false] if "i % 5 == 0" then --> [true] Buzz --> judge else --> [false] print : i --> judge endif else judge --> [false] ループ終了 --> (*) @enduml
このコードで出力される図は以下のようになります。
一応丁寧に追っていけば正しい処理の流れになっていることが確認できるかと思いますが、あらぬ方向に線が描画されて非常にわかりづらいですね。
この状態で「アクティビティ図書いたで!」とか言って持ってこられても自分なら「訳わかんないんで作り直してください」と突き返すでしょう。
PlantUMLはテキストでUMLが記述できるのは非常にいいんですが、肝心の図の描画に関しては処理が入り組んでくると上図のように非常に見づらくなってしまいます。
この辺りは今後の改善に期待するしかないですが、それでもある程度は見た目を調整する指定もできます。先ほどの図に見た目の調整をすると以下のようになります。
上記のコードで以下のような図が描画されます。
まだまだ線が交錯しており見にくさはありますが、先ほどよりはだいぶマシになったかと思います。旧記法ではループの指定ができないため各アクティビティの遷移先を、as
で別名をつけた条件判定文に飛ばすことでループを表現しています。
一応、多少なりとも見れる図になったかと思いますが、この図は見た目の調整のために矢印の方向を個別に指定するなど、本来のUMLの意図から外れた処理を考慮して試行錯誤する必要がありました。おそらくこれを解消するために開発されたのが新記法なのだと思います。
新記法でFizzBuzzのアクティビティ図を書く
新記法では各アクティビティは:aaa;
のように記述します。ただし旧記法のようにas
で別名をつけることはできないため、任意のアクティビティから線を引いたり任意のアクティビティに遷移したりという処理は(恐らく)できません。また遷移先の方向を指定することもできなくなっています。これは、遷移先を制限することで描画パターンを制限し、簡潔な図で表現できるようにするためなんじゃないかと思います*1。
この制限によって基本的に「下から上」への遷移はできなくなり、図の上の方から下まで流れるように描画されます。ループはrepeat
などの専用のキーワードが追加され、簡潔な描画で表現されるようになりました。
新記法でFizzBuzzを作成すると以下のようになります*2。
新記法では各アクティビティの遷移が直線で表現されるようになったため、旧記法に比べて非常に見やすくなっています。また、基本的にループ部分以外では処理が上から下に描画されるため、処理の流れを見失うこともありません。
さらに重要なのは、新記法は見た目に関する調整を何も指定しなくてもデフォルトでこのような図を描画してくれます。見た目を気にせずにロジックにだけ集中できるというのは非常に助かります。
PlantUMLの課題
さて旧記法と新記法の比較を見てみると、今後は新記法一択と思われると思いますが、新記法では旧記法からできなくなったこともいくつかあります。
例えば以下の様なものです。
as
で別名を付けることができない- 各アクティビティで任意の遷移元/遷移先が指定できない
- ループ以外の繰り返し処理が表現できない
単純な遷移であれば上から下に一直線に書き下しても表現しきれるかもしれませんが、「特定の処理を実行してその処理が成功したら、前の条件判定に戻りたい」というような処理を表現する場合、「上から下」だけではなく「下から上」への遷移が必要になります。
しかし現在のアクティビティ図の新記法では、ループ(repeat
キーワード)以外の処理で、アクティビティ図上の「下から上」へ遷移することはできません*3。
とはいえアクティビティ図の新記法はまだベータ版ということなので、将来的にその辺が改善されるとよいなぁ。
参考