サポンテ 勉強ノート

サポンテの勉強ノート・読書メモなどを晒します。

PlantUML で白黒のクラス図を描く

はじめに

テキストベースで気軽に UML を描くことができる PlantUML ですが、デフォルトでは微妙な色が付いています。ついでに__言いにくいけれど__美しいとは言えない配色です。デフォルトは白黒が良かったな...、とは誰もが思うところではないでしょうか。

この配色には「この図は PlantUML を使って描かれています」と一目で分かるメリットがあります。しかし公的な書類に使用する上では、やはり白黒で作図したいという要求も多いでしょう。

この記事では PlantUML を使って、色をコントロールしたクラス図を描くことを目指します。

デフォルトを確認

まずは何もコントロールせず、基本の要素だけで描いてみましょう。

@startuml

SuperClass <|-- SubClass

@enduml

このようになります。

PlantUML で描いたクラス図1

白黒にしてみる

コードの先頭に「skinparam monochrome true」と書くと、その図全体をモノクロにするという効果があります。

最初の例は、以下のような描画結果になります。

@startuml

' 全体をグレースケールにする
skinparam monochrome true

SuperClass <|-- SubClass

@enduml

PlantUML で描いたクラス図2

skinparam monochrome true の弊害

この「skinparam monochrome true」は、描画結果をグレースケールにします。つまり一旦カラーで描画したあとで全てをモノクロ変換しているのです。

しかし、基本は白黒で、目立たせたい箇所を強調する意味で部分的にカラーにしたいという要求もあるでしょう。

「skinparam monochrome true」を使うと、カラーにしたい部分も最後にモノクロ変換されてしまいます。これは望むところではありません。

skinparam monochrome true を使わずに白黒にしてみる

では「skinparam monochrome true」を使わずに白黒表現にしてみましょう。それには構成要素の種類ごとに色を設定する必要があります。

@startuml

skinparam class {
    ' 枠線を Black にする
    BorderColor Black
    
    ' 背景色を White にする
    BackgroundColor White
    
    ' 矢印を Black にする
    ArrowColor Black
}

' (C) マークの背景色を White にする
skinparam stereotypeCBackgroundColor White

SuperClass <|-- SubClass

@enduml

結果は次のようになります。

PlantUML で描いたクラス図3

影を取り除く

よく見ると影が付いています。要りません。なくしましょう。「skinparam shadowing false」を指定します。

@startuml

skinparam class {
    ' 枠線を Black にする
    BorderColor Black
    
    ' 背景色を White にする
    BackgroundColor White
    
    ' 矢印を Black にする
    ArrowColor Black
}

' (C) マークの背景色を White にする
skinparam stereotypeCBackgroundColor White

' 影をなくす
skinparam shadowing false

SuperClass <|-- SubClass

@enduml

PlantUML で描いたクラス図4

(C) マークを取り除く

クラス名の左側には「クラス」を表す(C)というマークが付いています。UML を学習した時に、こんなものはありませんでした。取り除きましょう。

「hide circle」を用います。

@startuml

skinparam class {
    ' 枠線を Black にする
    BorderColor Black
    
    ' 背景色を White にする
    BackgroundColor White
    
    ' 矢印を Black にする
    ArrowColor Black
}

' 影をなくす
skinparam shadowing false

' クラス名の左側にある丸囲み文字を取り除く
hide circle

SuperClass <|-- SubClass

@enduml

PlantUML で描いたクラス図5

メンバーの可視性を普通に(記号に)する

そろそろメソッドやフィールドを追加してみましょう。

@startuml

skinparam class {
    ' 枠線を Black にする
    BorderColor Black
    
    ' 背景色を White にする
    BackgroundColor White
    
    ' 矢印を Black にする
    ArrowColor Black
}

' 影をなくす
skinparam shadowing false

' クラス名の左側にある丸囲み文字を取り除く
hide circle

class SuperClass {
    +field1
    ~field2
    #field3
    -field4
}

class SubClass {
    +method1()
    ~method2()
    #method3()
    -method4()
}

SuperClass <|-- SubClass

@enduml

PlantUML で描いたクラス図6

おや?可視性を示す記号がアイコンになっていますね。かわいいですが、普通に記号にしてくれた方が分りやすいという人も多いでしょう。「skinparam classAttributeIconSize 0」でアイコン表示を記号表示に替えることができます。

@startuml

skinparam class {
    ' 枠線を Black にする
    BorderColor Black
    
    ' 背景色を White にする
    BackgroundColor White
    
    ' 矢印を Black にする
    ArrowColor Black
}

' 影をなくす
skinparam shadowing false

' クラス名の左側にある丸囲み文字を取り除く
hide circle

' メンバーの可視性を記号にする
skinparam classAttributeIconSize 0

class SuperClass {
    +field1
    ~field2
    #field3
    -field4
}

class SubClass {
    +method1()
    ~method2()
    #method3()
    -method4()
}

SuperClass <|-- SubClass

@enduml

PlantUML で描いたクラス図7

空の部屋を非表示にする

最初の例に戻ります。

@startuml

SuperClass <|-- SubClass

@enduml

再掲:PlantUML で描いたクラス図1

クラスを示す矩形に、フィールドやメソッドを記述するための「部屋」が描画されています。記述がないので空っぽのままです。

UML の規格では、空の場合は描画しなくても良いことになっています。好みにもよりますが、これを隠してしまいましょう。

「hide empty member」を使います。また、フィールドだけを隠したい場合「hide empty field」を、メソッドを隠したい場合は「hide empty method」を使います。

@startuml

' 空の部屋を非表示にする
hide empty member

' 空のフィールドを非表示にする
'hide empty field

' 空のメソッドの部屋を非表示にする
'hide empty method

SuperClass <|-- SubClass

@enduml

PlantUML で描いたクラス図8

空ではない部屋を強制的に隠すこともできます。「hide member」「hide field」「hide method」を使います。

一部のクラスに強調色を用いる

特定のクラスだけを目立たせたい場合、色をつける場所によって方法が異なります。

まず、特定のクラスに背景色を付ける場合は、クラス定義の後ろにカラーコードを又は色の名前を指定します。

@startuml

skinparam class {
    ' 枠線を Black にする
    BorderColor Black
    
    ' 背景色を White にする
    BackgroundColor White
    
    ' 矢印を Black にする
    ArrowColor Black
}

' 影をなくす
skinparam shadowing false

' クラス名の左側にある丸囲み文字を取り除く
hide circle

' 特定のクラスの背景色を変更する
class SuperClass #ffccff {
}

SuperClass <|-- SubClass

@enduml

PlantUML で描いたクラス図10

ちなみに、ここで色指定を「#white-ffccff」などとするとグラデーションを表現できます。

クラスの枠線やフォントに色をつけたい

特定のクラスの枠線やフォントに対してだけ色をつけたい場合は一手間必要です。キーワード(ステレオタイプ)を指定して、そのキーワード(ステレオタイプ)に対して「skinparam」で色をつけるのです。

そのままだとキーワード(ステレオタイプ)も表示されてしまうので「hide stereotype」を指定して非表示にしています。特定のキーワード(ステレオタイプ)だけを指定することで狙って隠すことができます。以下の例を参照してください。

@startuml

skinparam class {
    ' 枠線を Black にする
    BorderColor Black
    
    ' 背景色を White にする
    BackgroundColor White
    
    ' 矢印を Black にする
    ArrowColor Black
    
    ' <<Foo>> のクラスの枠線を Red にする
    BorderColor<<Foo>> Red
    
    ' <<Foo>> のクラスのフォント色を Blue にする
    FontColor<<Foo>> Blue
}

' 影をなくす
skinparam shadowing false

' クラス名の左側にある丸囲み文字を取り除く
hide circle

' Foo キーワード(ステレオタイプ)を隠す
hide <<Foo>> stereotype

class SuperClass <<Foo>> {
}

class SubClass <<Bar>> {
}

SuperClass <|-- SubClass

@enduml

PlantUML で描いたクラス図12

特定の矢印だけ色をつける

特定の矢印に色をつけるには、矢に直接記述します。

@startuml

skinparam class {
    ' 枠線を Black にする
    BorderColor Black
    
    ' 背景色を White にする
    BackgroundColor White
    
    ' 矢印を Black にする
    ArrowColor Black
}

' 影をなくす
skinparam shadowing false

' クラス名の左側にある丸囲み文字を取り除く
hide circle

' この矢印だけ red にする
SuperClass <|-[#red]- SubClass

' この矢印は skinparam で指定した Black
SubClass <|-- BarObject

@enduml

PlantUML で描いたクラス図11

注釈を白黒にする

注釈も白黒にできます。簡単な例を示します。

@startuml

' 注釈の枠線を Black にする
skinparam noteBorderColor Black

' 注釈の背景色を White にする
skinparam noteBackgroundColor White

' 注釈。
note left of SuperClass
    This is
    note.
end note

' 影をなくす
skinparam shadowing false

class SuperClass

@enduml

PlantUML で描いたクラス図9

特定の注釈だけ色をつける

では注釈も特定のものだけ色をつけてみましょう。クラスの背景色を設定するのと同様に、注釈の定義に直接カラーコードや色名で背景色を設定できます。

グラデーションにしてみました。

@startuml

' 注釈の枠線を Black にする
skinparam noteBorderColor Black

' 注釈の背景色を White にする
skinparam noteBackgroundColor White

skinparam class {
    ' 枠線を Black にする
    BorderColor Black
    
    ' 背景色を White にする
    BackgroundColor White
    
    ' 矢印を Black にする
    ArrowColor Black
}

' 影をなくす
skinparam shadowing false

' クラス名の左側にある丸囲み文字を取り除く
hide circle

' 注釈1。skinparam で指定した既定色が使われる。
note left of SuperClass
    This is
    note-1.
end note

' 注釈2。色を指定する。
note right of SuperClass #white-ffccff
    This is
    note-2.
end note

class SuperClass

@enduml

PlantUML で描いたクラス図13

さいごに

いかがでしたでしょうか。今回は PlantUML で描くクラス図の「色」をシンプルにする方法についてまとめてみました。微妙な既定色に惑わされず、PlantUML を華麗に使いこなしてみてください。