わすれっぽいきみえ

みらいのじぶんにやさしくしてやる

8日目: PlantUMLを触ってみる(その2)

PlantUMLについての記事2つ目。
正直これだけ書けてもどこで使うねんって感じではあるが、誰かに「こんな設計にしたいんですよね」って見せるときにホワイトボードや紙だといつか消しちゃうけども、まぁPlantUMLを使って一度テキストに落としておくと使い回ししやすいし、画像よりテキストはバージョン管理しやすいので便利かもなーとは思う。*1

というわけで予告通り結城先生のデザインパターン入門に出てきたクラス図をPlantUMLを使って書いてみよう。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

まずは簡単なクラス図から

デザパタ入門の本にはUMLとは何ぞやという説明から入る。で、その説明は本またはUnified Modeling Language (UML)を直接読んでもらうこととして、クラス図を書いてみたい。
クラスにはフィールド*2メソッドが生えている。クラス自体も抽象クラスと普通のクラス、あとインターフェースとある。
これらを表現するのにPlantUMLでは例えばデザパタ本のFig0-1ならこんな風に書く。

@startuml
hide circle
abstract class ParentClass {
    field1
    {static} field2
    {abstract} methodA()
    methodB()
}
class ChildClass {
    methodA()
    {static} methodC()
}

ParentClass <|-- ChildClass
@enduml

f:id:kimikimi714:20141208004253p:plain

クラス図の書き方はPlantUMLのクラス図の書き方を見ると載ってるが、ざっくり書くと

  • クラスが抽象クラスならabstract classと書けば良い。抽象クラスでない普通のクラスなら単にclassを書く
  • フィールドやメソッドが抽象だったり静的だったりするときには{abstract}{static}を前につけると良い
  • クラスの中身を記述した後で、クラス同士の関係を<|--(継承)や<|..(実装)、o--(集約)でひもづける。線の引き方はPlantUMLがうまいこと解決してくれる。
  • PlantUMLを利用するとデフォルトで出て来る図にはCマークなどが付いたりするが、それらは隠すことが出来る(要素を隠すを参考)

シーケンス図を書いてみる

クラス同士の関係は何も継承や集約だけではなく、どのメソッドが呼ばれると何が動いてレスポンスがあるのかを示すシーケンス図も関係性を表す一つだ。なのでシーケンス図も書いてみよう。
例えばFig0-6は以下のように書ける。

@startuml
participant User

User -> Client:work
activate Client

Client -> Server: open
activate Server
Server --> Client
deactivate Server

Client -> Server: print
activate Server

Server -> Device: write
activate Device

Device --> Server
deactivate Device
deactivate Server

Client -> Server: close
activate Server
Server --> Client
deactivate Server

Client --> User
deactivate Client

@enduml

f:id:kimikimi714:20141208011734p:plain

実際に本にあるコロンや下線、Userという登場人物はないけども書こうと思えばこんな感じになる。
ざっくり書き方を書いておくと

  • シーケンス図とクラス図を書く際に特別に「これはシーケンス図ですよー」「クラス図ですよー」という宣言はいらない。
  • 基本的に上から順番に処理が進んでいくものとして書かれるので、PlantUMLのコードもそのつもりで書くことになる
  • 矢印は->または<-で書ける。--><--は点線になる。
  • クラスのライフラインを表すにはactivatedeactivateで表現し、その間を縦に長い長方形でPlantUMLがよしなに書いてくれる。

その他シーケンス図の書き方についてはPlantUMLのシーケンス図の書き方を見るといい。


明日も技術ネタを何か書く。

*1:ていうか直近で会社の先輩に説明する資料にクラス図とか載せようかなって思ってるので練習したい気持ちもあった

*2:Javaでフィールドと呼ぶものはPHPだとメンバ変数と呼ぶ。言語によって呼び方が代わるのがややこしいが適宜読み替えてほしい。