リゼロで学ぶUML

# はじめに
[株式会社いい生活 Webアプリケーションチーム](https://jobs.qiita.com/employers/e-seikatsu/development_teams/26) のエンジニア 杉本です。
普段は主にサーバサイドの設計・実装をしております。

UML、便利ですよね。
共通の記法でモデリングができるので、チームメンバーに設計の意図を共有する際には愛用しております。  

そんなUML大好きっ子の僕が、今年度はUMLを新卒に教える機会を頂いたので、「具体的なUMLの例をわかりやすく提示したいな」と考え、「Re:ゼロから始める異世界生活(通称:リゼロ)」をネタに代表的なUMLを書いてみました。
（ リゼロを選んだのは、単純に好きだからです )



**【注意】** この記事は、主に1話~3話の第1章の内容で記載しております。
ネタバレ注意です。
※このアニメですが、 2019/06/20時点では、[Amazon Prime](https://www.amazon.co.jp/dp/B01KZSGOCY) でプライム会員は無料で見れます！

また、この記事のUMLは、[PlantUML](http://plantuml.com/ja/activity-diagram-beta)で記載しております。
記事で記法の解説はしませんが、テキスト形式でUMLを記述できる非常に素晴らしいものですので、是非使ってみてほしいです。

## アクターの整理

この記事で使う登場人物について、簡単に紹介します。

* スバル  
主人公。異世界召喚をされた。  
死んだらタイムリープ(死に戻り)する能力持ち。
* エミリア  
ヒロイン。銀髪ハーフエルフ。かわいい。    
所持している徽章というものが盗まれ、事件に巻き込まれる。
* エルザ  
殺し屋。  
エミリアが所持する徽章というアイテムを手に入れることが目的。  
* ラインハルト  
剣聖(騎士)。チンピラに絡まれたりしたときに助けを呼んだら来てくれた。  
スバルの友人を自称する。


上記のキャラクター以外にも魅力的なキャラクターがたくさんおりますが、この記事では使わないので割愛します！

詳細、及び画像は、[公式のキャラ紹介](http://re-zero.com/character/)をご覧になってください。


## アクティビティ図

アクティビティ図とは、フローチャートのUML版です。
手続き的な流れや、プログラムの制御フローを表現するのに使うと、良いです。

歴史や、詳細な概要は、[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%93%E3%83%86%E3%82%A3%E5%9B%B3)を参照してください。

この章では、アクティビティ図を使って、第1章のストーリーを表現してみようと思います。

まず、第一章のストーリーをすごいざっくり書くとこんな感じになります。


![リゼロで学ぶUML.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119311/d9a48782-3a2c-d94c-fcd4-b677e136e5de.png)

<details><summary>plantuml</summary><div> 

```plantuml

start
:スバルが異世界召喚される;
:リンゴ屋の亭主と話す;
repeat 
:スバルが異世界で活動をする;
repeat while (スバルが死んでない?)
end
```
</div></details>
フローの要点をまとめると、以下のようになります。。

* 「スバルが死ぬ」という条件を満たすと死に戻りが発生し、ループの開始点となるリンゴ屋の亭主との話している最中に戻る
* 「スバルが死なない」という条件を満たすまで、このループは続く。
* 「スバルが死なない」と、ループが終わり、第1章が終わる


これだけではだいぶ味気ないので、「スバルが異世界で活動をする」と記載をごまかしている箇所について拡充します。  
具体的には、以下のフローを追加してみます。

* エミリアは、0回目のループのみ、スバルがチンピラに襲われているところを助ける。
* 3回目のループでは、エルザを撃退でき、エミリアを助けることができる。  
スバルも(瀕死になるが)死なない。

![リゼロで学ぶUML-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119311/f5df6d08-cd4e-7c56-b2e6-35f20c1261a2.png)


<details><summary>plantuml</summary><div> 

```plantuml

start
:スバルが異世界召喚される;
:リンゴ屋の亭主と話す;
  repeat
  :リンゴ屋の亭主と分かれる;
  if (ループが0回目?) then (yes)
    :エミリアがスバルをチンピラから助ける;
  else (no)
  endif
  if (ループが3回目?) then (yes)
    :スバルがエルザを撃退する;
    :スバルが瀕死になる;
  else (no)
    :スバルが殺される;
  endif
repeat while (スバルが死んでいる?)
end
```
</div></details>

ここまでで、ループ・if分岐について、アクティビティ図で表現しました。

さて、スバルは死ぬまでに都度3回のループをします。
(4回同じ時間を過ごしている）
ループということは、時間軸的にいうと、並列で存在していたということも言えます。
これをアクティビティ図で示すと、以下のようになります。

![リゼロで学ぶUML-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119311/a15f63d0-b602-a64a-8518-29921020b494.png)


<details><summary>plantuml</summary><div> 

```plantuml

start
:スバルが異世界召喚される;
:リンゴ屋の亭主と話す;
:リンゴ屋の亭主と分かれる;
fork
    :エミリアが\nスバルをチンピラから助ける;
    :スバルが\nエルザに殺される;
stop
fork again
    :スバルが\nチンピラに殺される;
stop
fork again
    :スバルが\nエルザに殺される;
stop
fork again
    :エルザを\n撃退する;
    :スバルが\n瀕死になる;
endfork
end
```
</div></details>

最後に、「スバルが」とか「エミリアが」という主語があると冗長なので、わかりやすくするために、パーティションをわけてみます。

![リゼロで学ぶUML-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119311/39ae56b4-64fd-b93a-c6e8-d8f16af14a7f.png)


<details><summary>plantuml</summary><div> 

```plantuml

|スバル|
start
:異世界召喚される;
:リンゴ屋の亭主と話す;
:リンゴ屋の亭主と分かれる;
fork
    :エルザを\n撃退する;
    :スバルが\n瀕死になる;
fork again
    :チンピラに殺される;
stop
fork again
    :エルザに殺される;
stop
fork again
    |#AntiqueWhite|エミリア|
    :スバルをチンピラから助ける;
    |スバル|
    :エルザに殺される;
stop
end fork

end
```
</div></details>


## ユースケース図
ユースケース図は、利用者のユースケースを分析したことを書くのに長けた図です。

歴史や、詳細な概要は、[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E5%9B%B3)を参照してください。

この章では、第1章のスバルがループを抜けるために成し遂げなければならないことを、ユースケースで表現してみます。

スバルがやらなければいけないことは、以下の2つである。

* 自分が死ぬ運命を覆す
* 徽章が盗まれて困っているエミリアを助ける

![リゼロで学ぶUML-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119311/f8388bb4-eb7f-1f3e-ad52-acf337e3a4be.png)


<details><summary>plantuml</summary><div> 

```plantuml

left to right direction
skinparam packageStyle rectangle
actor スバル
rectangle 第1章のスバルが成し遂げなければならないこと{
  スバル -- (死ぬ運命を覆す)
  スバル -- (エミリアを助ける)
}

```
</div></details>

さて、スバルが「エミリアを助ける」には、「エミリアは助けられるような状況 」= 「徽章が盗まれる」  状況に陥る必要があります。

そして、「盗まれた徽章をエミリアに返す」ためには、敵である「エルザを撃退して、徽章を手に入れる」必要があります。

![リゼロで学ぶUML-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119311/82b0a6df-267a-467e-5b15-bee1313705b9.png)


<details><summary>plantuml</summary><div> 

```plantuml

left to right direction
skinparam packageStyle rectangle
actor エミリア
actor スバル
rectangle  第1章のスバルが成し遂げなければならないこと{
  スバル -- (死ぬ運命を覆す)
  スバル -- (エミリアを助ける)
  (エミリアを助ける) -- (徽章をエミリアに返す)
  (徽章をエミリアに返す) -- (徽章を手に入れる)
  (徽章を手に入れる) <. (エルザを撃退する):include
  (徽章をエミリアに返す)  <.. (徽章が盗まれる):include
  (徽章が盗まれる) -- エミリア
}
```
</div></details>

また、「スバルが死ぬ一因」には、殺し屋のエルザに殺される以外にも、チンピラに殺されてしまうこともあります・・・

![リゼロで学ぶUML-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119311/c2fd5b9d-ec01-ecdb-f1f1-1eba58c39869.png)


<details><summary>plantuml</summary><div> 

```plantuml

left to right direction
skinparam packageStyle rectangle
actor エミリア
actor スバル
rectangle  第1章のスバルがやり遂げたこと{
  スバル -- (死ぬ運命を覆す)
  スバル -- (エミリアを助ける)
  (エミリアを助ける) -- (徽章をエミリアに返す)
  (徽章をエミリアに返す)  <.. (徽章が盗まれる):include
  (徽章が盗まれる) -- エミリア
  (徽章をエミリアに返す) -- (徽章を手に入れる)
  (徽章を手に入れる) <. (エルザを撃退する):include
  (死ぬ運命を覆す) <-- (チンピラに殺される運命を覆す)
  (死ぬ運命を覆す) <-- (エルザに殺される運命を覆す)
}
```
</div></details>

殺される運命を覆す方法ですが、「エルザに殺される運命」については、「エルザの撃退」を行えば達成することができますが、「チンピラに殺される運命」を覆すには、以下のどちらかを行う必要があります。

* 偶然通りがかったエミリアに助けてもらう
* 助けを呼び、ラインハルトに助けてもらう

![リゼロで学ぶUML-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119311/68f99738-2db6-446d-647e-57941403a82d.png)

<details><summary>plantuml</summary><div> 

```plantuml

left to right direction
skinparam packageStyle rectangle
actor エミリア
actor スバル
actor ラインハルト
rectangle  第1章のスバルがやり遂げたこと{
  スバル -- (死ぬ運命を覆す)
  スバル -- (エミリアを助ける)
  (エミリアを助ける) -- (徽章をエミリアに返す)
  (徽章をエミリアに返す)  <. (徽章が盗まれる):include

  (徽章をエミリアに返す) -- (徽章を手に入れる)
  (徽章を手に入れる) <. (エルザを撃退する):include
  (死ぬ運命を覆す) <-- (チンピラに殺される運命を覆す)
  (死ぬ運命を覆す) <-- (エルザに殺される運命を覆す)
  (エルザに殺される運命を覆す) <-- (エルザを撃退する):include
  (チンピラに殺される運命を覆す) -- (エミリアに助けてもらう) 
  (チンピラに殺される運命を覆す) -- (ラインハルトに助けてもらう)
  (ラインハルトに助けてもらう) <.. (助けを呼ぶ) :include
  (エミリアに助けてもらう) <.down.. (偶然チンピラにぼこられてるスバルを見かける):include
  (助けを呼ぶ) <.down. (スバルの元にかけつける):exclude
  (徽章が盗まれる) - エミリア
  (偶然チンピラにぼこられてるスバルを見かける) -- エミリア
  (スバルの元にかけつける) -- (ラインハルト)
}
```
</div></details>

図が結構複雑になってきたので、ここからまだ深掘りをすることがいっぱいできる(エルザの撃退には、ラインハルトの協力が必要とか)のだが、今回はここまでにします。

ちなみに、アクティビティ図の線に、`include` とか `exclude` とついているものは理由があります。

* 汎化( <---- ) は、 プログラミングでいう継承。 (A is Bの関係)
* include( <--include--  )は、 AをするにはBが必要である。という場合( A has B の関係)
* exclude( <--excludee--  )は、 Aをしたら、Bが起きる。という場合
* それ以外は、ただ線でつなぐ

## シーケンス図

シーケンス図は、それぞれのオブジェクト間のメッセージの流れを時系列的に表現するのに長けた図です。

前章までと同様、詳細は[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9%E5%9B%B3)を参照してください。

この章では、登場人物同士のやりとりを、シーケンス図で表現してみます。

まず、スバルとエミリアが最初に会い、エミリアがスバルを助けるところまでを書くと、以下のようになります。

![リゼロで学ぶUML-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119311/7a5f28b2-1d40-721f-0730-8cca7e6d1206.png)


<details><summary>plantuml</summary><div> 

```plantuml

actor スバル
actor りんご屋
actor チンピラ
actor エミリア
activate スバル
スバル -> りんご屋:話しかける
activate りんご屋
return 分かれる
スバル -> チンピラ:遭遇する
activate チンピラ
チンピラ -> スバル: ぼこる
activate スバル

エミリア -> チンピラ: 魔法で威嚇する
activate エミリア
activate チンピラ
return 降参する
deactivate スバル
チンピラ -> チンピラ: 逃げる

```
</div></details>

上記の邂逅のあと、結構いろいろなイベントがあるのですが、そこは割愛し、0週目のエルザに殺されるところを書いてみると、以下のようになります。

![リゼロで学ぶUML-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119311/50ca53eb-52f6-be1c-acda-af6b12cd317c.png)

<details><summary>plantuml</summary><div> 

```plantuml

actor スバル
actor りんご屋
actor チンピラ
actor エミリア
activate スバル
スバル -> りんご屋:話しかける
activate りんご屋
return 分かれる
スバル -> チンピラ:遭遇する
activate チンピラ
チンピラ -> スバル: ぼこる
activate スバル

エミリア -> チンピラ: 魔法で威嚇する
activate エミリア
activate チンピラ
return 降参する
deactivate スバル
チンピラ -> チンピラ: 逃げる
deactivate チンピラ
...
actor エルザ

エルザ -> スバル: ナイフでズブリ
activate エルザ
エルザ -> エミリア: ナイフでばさり
スバル -> エミリア:倒れるエミリアを見る
activate エミリア
エミリア --> スバル: 瀕死に見える
deactivate エミリア
スバル -> スバル: エミリアを助けると誓う
スバル -> スバル: 死ぬ
destroy スバル
destroy エミリア
```
</div></details>

さて、スバルがエルザに殺されてしまったのだが、その場合には死に戻りが発生します。

![リゼロで学ぶUML-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119311/a2c45cb1-e060-b541-33f8-8f41e56bdcc7.png)


<details><summary>plantuml</summary><div> 

```plantuml

actor スバル
actor りんご屋
actor チンピラ
actor エミリア
activate スバル
スバル -> りんご屋:話しかける
activate りんご屋
==0週目==
return 分かれる
スバル -> チンピラ:遭遇する
activate チンピラ
チンピラ -> スバル: ぼこる
activate スバル

エミリア -> チンピラ: 魔法で威嚇する
activate エミリア
activate チンピラ
return 降参する
deactivate スバル
チンピラ -> チンピラ: 逃げる
deactivate チンピラ
...
actor エルザ

エルザ -> スバル: ナイフでズブリ
activate エルザ
エルザ -> エミリア: ナイフでばさり
スバル -> エミリア:倒れるエミリアを見る
activate エミリア
エミリア --> スバル: 瀕死に見える
deactivate エミリア
スバル -> スバル: エミリアを助けると誓う
スバル -> スバル: 死ぬ
destroy スバル
destroy エミリア
スバル --> スバル : 死に戻り
deactivate エルザ
==1週目==
activate スバル
...
```
</div></details>

さて、エミリアに助けられるイベントは0週目のみなので、2回目以降は詳細の記載を省略したいと思います。

![リゼロで学ぶUML-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119311/69231e61-b8a3-1919-02db-63c7d47d738b.png)


<details><summary>plantuml</summary><div> 

```plantuml

actor スバル
actor りんご屋
actor チンピラ
actor エミリア
activate スバル
スバル -> りんご屋:話しかける
activate りんご屋
==0週目==
return 分かれる

ref over スバル,チンピラ,エミリア: エミリアがスバルを助ける
...
actor エルザ

エルザ -> スバル: ナイフでズブリ
activate エルザ
エルザ -> エミリア: ナイフでばさり
スバル -> エミリア:倒れるエミリアを見る
activate エミリア
エミリア --> スバル: 瀕死に見える
deactivate エミリア
スバル -> スバル: エミリアを助けると誓う
スバル -> スバル: 死ぬ
destroy スバル
destroy エミリア
スバル --> スバル : 死に戻り
deactivate エルザ
==1週目==
activate スバル
```
</div></details>

2週目、3週目、4週目についても同様に記載していっても良いのですが、少し記事が長くなってしまうので、記載を省き、死に戻りを抜け出すまでの流れをざっくりとループと分岐で表現してみると、以下のようになります。

![リゼロで学ぶUML-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119311/005a79ef-9e45-6e19-739c-22cd149de67e.png)


<details><summary>plantuml</summary><div> 

```plantuml

actor スバル
actor りんご屋
actor チンピラ
actor エミリア

activate スバル
スバル -> りんご屋:話しかける
activate りんご屋


loop 0,3
    return 分かれる


    ref over スバル,チンピラ,エミリア: エミリアがスバルを助ける
    actor エルザ

    ...

    
    alt 0回目のループ or 2回目のループ
        ref over スバル,エルザ: エルザがスバルに致命傷を追わせる
        
    else 1回目のループ
        ref over スバル,チンピラ: チンピラがスバルに致命傷を追わせる
    else 3回目のループ
        break 
            ref over スバル,エルザ: スバルがエルザを撃退する
        end
    end

    スバル -> スバル:死ぬ
    destroy スバル

    スバル -> スバル:死に戻り
    activate スバル
end


```
</div></details>

ちなみに、ループ回数が0~3となっているが、3回目のループでスバルが死んでいた場合、死に戻りをするであることを考えるとループの回数は、 0..n でも良いかもしれませんね。

# クラス図
クラス図は、モデルの構造・関係性を表現するのに長けた図です。
詳細については、[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%A9%E3%82%B9%E5%9B%B3)等で参照してください。


この章では、ヒロインであるエミリアの特徴を、クラス図で表現してみます。

まず、エミリアは以下の特徴があります。

* 銀髪のハーフエルフ
* 徽章を持っている  
(徽章自体は複数存在し、いろんな人が持っているようである。)

![リゼロで学ぶUML-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119311/af24de92-e477-f280-16fe-c3e5241d59d8.png)


<details><summary>plantuml</summary><div> 

```plantuml

class ハーフエルフ {
}

class エミリア {
    # 徽章
}

class 銀髪{

}

ハーフエルフ <|-- エミリア

エミリア "1"*-right- 銀髪

エミリア "*"--"1" 徽章
```
</div></details>


上述するアクター整理では出てきておりませんが、リゼロの世界では、「銀髪のハーフエルフ」は、400年前にいた「サテラ」という存在と同じ特徴を持つらしいです。

![リゼロで学ぶUML-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119311/7413f210-ae31-d197-8f2e-13adcd573b5e.png)


<details><summary>plantuml</summary><div> 

```plantuml


package 生物{
    class ハーフエルフ {
    }
    class 銀髪{
    }
    class 銀髪のハーフエルフ{
    }
    class エミリア {
    # 徽章
    }
    class サテラ{
        +世界を滅ぼしかける()
    }
}


ハーフエルフ <|-- 銀髪のハーフエルフ

銀髪のハーフエルフ <|-- エミリア
銀髪のハーフエルフ <|-- サテラ

銀髪のハーフエルフ "1"*-right- 銀髪

エミリア "*"--"1" 徽章
```
</div></details>


また、エミリアは精霊術士といって、魔法を使うことができる。
魔法を使うときにはマナというものを使うそうです。
精霊術士は、精霊と契約して魔法を使うらしいです。

劇中では、精霊には大精霊と微精霊の二種類が出てきました。
※エミリアは大精霊パックと契約している。

![リゼロで学ぶUML-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119311/6168f3dd-2408-26a0-36d2-947de8bb30e6.png)


<details><summary>plantuml</summary><div> 

```plantuml

interface 精霊術士 {
    +魔法を使う(マナ)
}

class マナ {

}
精霊術士 .right.> マナ:使う
package 生物{
    class ハーフエルフ {
    }
    class 銀髪{
    }
    class 銀髪のハーフエルフ{
    }
    class エミリア {
        # 徽章
    }
    class サテラ{
        +世界を滅ぼしかける()
    }
}
ハーフエルフ <|-- 銀髪のハーフエルフ
銀髪のハーフエルフ <|-- エミリア
銀髪のハーフエルフ <|-- サテラ
銀髪のハーフエルフ "1"*-right- 銀髪
エミリア "*"--"1" 徽章

interface 精霊 {
}

class パック {
}

精霊術士 <|.. エミリア

精霊術士 "0..?" o-- "1..?" 精霊
精霊 <|.. 大精霊
大精霊 <|-- パック
精霊 <|.. 微精霊

エミリア .> パック:契約する

```
</div></details>

また、精霊術士しか魔法を使えないというわけではない。  
どうやら、精霊術士以外にも、普通の魔法使いというものがいるらしい。
(ロム爺というキャラクターが「普通の魔法使いならまだしも、精霊術士との相手は分が悪い」的なことを言っていた。)

精霊術士と魔法使いの違いは、精霊術士は、大気中のマナを使って魔法を使うが、魔法使いは自分のマナ(オド)を使って魔法を使うらしい。  
大気中のマナを使う分、精霊術士のほうが強いみたいだ。

![リゼロで学ぶUML-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119311/3fb6b471-27ed-3ffb-7156-c24955d58055.png)


<details><summary>plantuml</summary><div> 

```plantuml


package マナ{
    class マナ{

    }
}


package JOB{
    interface 魔法を使うJOB<T extends マナ>{
        +魔法を使う(T)
    }
    interface 精霊術士<大気中のマナ>
    interface 魔法使い<オド>
    魔法を使うJOB <.. 精霊術士
    魔法を使うJOB <.. 魔法使い

}
魔法を使うJOB -up-> マナ

package 生物{
    class ハーフエルフ {
    }
    class 銀髪{
    }
    class 銀髪のハーフエルフ{
    }
    class エミリア {
        # 徽章
    }
    class サテラ{
        +世界を滅ぼしかける()
    }
}
ハーフエルフ <|-- 銀髪のハーフエルフ
銀髪のハーフエルフ <|-- エミリア
銀髪のハーフエルフ <|-- サテラ
銀髪のハーフエルフ "1"*-right- 銀髪
エミリア "*"--"1" 徽章

package 精霊 {
    interface 精霊 {
    }

    class パック {
    }
    精霊 <|.. 大精霊
    大精霊 <|-- パック
    精霊 <|.. 微精霊
}

精霊術士 <|.. エミリア

精霊術士 "0..?" o-down- "1..?" 精霊


エミリア .> パック:契約する
```
</div></details>

さて、魔法使いが使うオドだが、基本的に生きているものにはあると思われる。
(というのも、ハーフエルフのエミリアも、地球人のスバルもオドは持っていて、練習すれば魔法は使えるらしい)

ここは正確にアニメで言及されたわけではないが、第2章でスバルや、魔獣が使っていたので、この想定に大きな間違いはないと思われる。

![リゼロで学ぶUML-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119311/6f208ff3-8cd0-4974-6594-6972e923193d.png)


<details><summary>plantuml</summary><div> 

```plantuml


package マナ{
    class マナ
    class オド
    マナ <|-right- オド
}


package JOB{
    interface 魔法を使うJOB<T extends マナ>{
        +魔法を使う(T)
    }
    interface 精霊術士<大気中のマナ>
    interface 魔法使い<オド>
    魔法を使うJOB <.. 精霊術士
    魔法を使うJOB <.. 魔法使い

}
魔法を使うJOB -up-> マナ

package 生物{
    class 生物{

    }
    class ハーフエルフ {
    }
    class 銀髪{
    }
    class 銀髪のハーフエルフ{
    }
    class エミリア {
        # 徽章
    }
    class サテラ{
        +世界を滅ぼしかける()
    }
    生物 <-- 魔獣
    生物 <-- ハーフエルフ

    ハーフエルフ <|-- 銀髪のハーフエルフ
    銀髪のハーフエルフ <|-- エミリア
    銀髪のハーフエルフ <|-- サテラ
    銀髪のハーフエルフ "1"*-right- 銀髪
}

生物 *-right- オド
エミリア "*"--"1" 徽章

package 精霊 {
    interface 精霊 {
    }

    class パック {
    }
    精霊 <|.. 大精霊
    大精霊 <|-- パック
    精霊 <|.. 微精霊
}

精霊術士 <|.. エミリア

精霊術士 "0..?" o-down- "1..?" 精霊


エミリア .> パック:契約する
```
</div></details>

ここまでで、一応エミリアがどんな子なのががなんとなく把握できるような図になったと思います！
（サテラ魔女だから魔法使いでは? という点等があるが、あくまでもエミリアを中心に書いてるので、ご容赦いただきたい）



## 最後に
僕はフェルトとロム爺が大好きなのに、この二人がこの記事上に出せなかったことが非常に残念です！

この記事の題材で使ったリゼロですが、2期が決まっております。
もし、「まだ見たことがないけど、この記事で興味が持てた！」という方がおりましたら、ファン冥利につきます。
（この記事ですが、なぜか新卒よりもシニア間で盛り上がりました）

[株式会社いい生活](https://www.e-seikatsu.info/)は、アニメ・漫画が好きなエンジニアを募集しております。

## 参考
* [クラス図のコンポジションと集約の違い](http://tezlog.blogspot.com/2011/02/blog-post.html)
* [IT専科](http://www.itsenka.com/)