UML のステレオタイプの使い方について

最近に PlantUML で ER 図を書く機会がありまして。
その際にステレオタイプの使い方がわかっていなかったので調べてみました。

(なお、本記事では UML については言及しません)

## UML のステレオタイプとは？

```plantuml
hide circle
entity class <<interface>> {}
```

UML のステレオタイプといいますと、上記図の `<<interface>>` と二重山括弧になっている箇所ですね。

## ３行でまとめると

自分の言葉で UML のステレオタイプを３行でまとめると次のとおりです。

* 表現を補足するための拡張表現​
* なにを書いてもいい​
* なにを書いてもいいけどオレオレ目線で書くと混乱の元になるのでチームやプロジェクトの共通表現で書く

## 調査をするに至った経緯

最初に書いたとおり、PlantUML で ER 図を書く機会がありました。
その際に [公式サイト](https://plantuml.com/ja/) を参考にしたのですが、次のようなサンプルがありました。

```plantuml
@startuml

' hide the spot
hide circle

' avoid problems with angled crows feet
skinparam linetype ortho

entity "Entity01" as e01 {
  *e1_id : number <<generated>>
  --
  *name : text
  description : text
}

entity "Entity02" as e02 {
  *e2_id : number <<generated>>
  --
  *e1_id : number <<FK>>
  other_details : text
}

entity "Entity03" as e03 {
  *e3_id : number <<generated>>
  --
  e1_id : number <<FK>>
  other_details : text
}

e01 ||..o{ e02
e01 |o..o{ e03

@enduml
```

(https://plantuml.com/ja/ie-diagram 参照)

ここに `<<generated>>` という記載があります。
`<<interface>>` といった記載はよくみかけるのですが、 `<<generated>>` という記載ははじめて見たので「何か深い意味があるのかな？」と思ったのがことの発端です。

## とりあえず google 先生に相談だ

なにはともあれ google 先生に「uml ステレオタイプ generated」で検索してみたところ、ズバリな回答がトップにあがってきませんでした。
一覧の中に IBM のモデリングソフトウェアのマニュアルがあり、そこにステレオタイプの一覧があったのですが generated といったキーワードはありませんでした。
(https://www.ibm.com/docs/ja/rsm/7.5.0?topic=elements-uml-model-element-stereotypes 参照)

このときに思ったのですが、自分はステレオタイプの記載方法や規約、記載してよい用語や単語などについてわかっていないことに気が付きました。

## そもそもステレオタイプとは？

ということで、ひとまず語源から調べて見るためにステレオタイプについて wikipedia 先生に相談してみたところ、次の通り記載がありました。

> ステレオタイプ（英: Stereotype、仏: Stéréotype）とは、多くの人に浸透している先入観、思い込み、認識、固定観念、レッテル、偏見、差別などの類型化された観念を指す用語である。

(https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%86%E3%83%AC%E3%82%AA%E3%82%BF%E3%82%A4%E3%83%97 参照)

概念を指す用語。。。少しフワッとした表現ですね。「んー。なるほど？」という感想です。個人の強い思い、という感じでしょうか。

その他にも [IT用語辞典 e-Words](https://e-words.jp/) や [わわわIT用語辞典](https://twitter.com/wa3_pcs) などにて検索してみましたが、ズバリな記載はありませんでした。

## UML のステレオタイプとは？

次に UML のステレオタイプについて調べたところ、日経 XTECH さまの記事に次の通り記載がありました。

> ステレオ・タイプ名には，任意の文字列を記述してかまいませんが

(https://xtech.nikkei.com/it/members/ITPro/ITBASIC/20010330/2/ 参照)

何を書いてもいいと書いてありますね。。
ただ、こちらの記事は一次ソースではありませんので鵜呑みにするわけにはいきません。

もう少し調べてみましょう。

再び戻って PlantUML の公式サイトですが、シーケンス図のページのステレオタイプの章に次のようなサンプルがあります。

```plantuml
@startuml

participant "Famous Bob" as Bob <<Generated>>
participant Alice <<(C,#ADD1B2) Testable>>

Bob->Alice: First message

@enduml
```

(https://plantuml.com/ja/sequence-diagram#94190c2f242a5df2 参照)

`<<Generated>>` や `<<Testable>>` といった記載が見受けられますね。

次に @tasaki-i3 さまの [UMLでRailsモデリング](https://qiita.com/tasaki-i3/items/3e891190390d13ebe9ca) という記事です。
こちらの記事では `<<scope>>` や `<<STI>>` といった記述をされています。
(自分は Rails を使ったことがないので scope や STI の意味がわかりませんでしたが。。)


本当に何を書いても良さそうな気がしてきましたね。

## ということで、ことの発端に戻ります

ことの発端は次の図の `<<generated>>` が何を意味しているのかわからなかったことです。

```plantuml
' hide the spot
hide circle

entity "Entity01" as e01 {
  *e1_id : number <<generated>>
  --
  *name : text
  description : text
}
```

ステレオタイプについて調べたところでは次のとおりです。

* ステレオタイプとは、個人の先入観や固定観念といった強い思い
* UML のステレオタイプには任意の文字列を記述して良い

自由に記載できると、なるほど、 google 先生に相談してもズバリな回答があがってこないのも頷けますね。

このことから第三者は「設計者の思想や考えを読み取り、なぜステレオタイプに generated と記載したのか考える」必要があるかと思います。

順当にいけば「`e1_id` がプライマリキーで値が自動的に生成される」ということで Auto Increment が付与されている、というところでしょうか。

......個人的な思いを書くと、それなら `<<auto increment>>` と書いた方がわかりやすいのでは？と考えてしまいました。

いやいや ID に UUID を使うケースもあるから generated という表現は適切かもしれません。でもそれなら `<<generated UUID>>` と書けばもっとわかりやすいですね。そもそも ID だからって連番を付与するとは限りませんし。 Increment しないでランダム生成した番号を付与するケースだってあるかもしれません。ではやはり generated が抽象的で適切な感じもします。いや、やはり抽象的すぎかもしれません。それが混乱のもとになってる感じもありますので。いやでも(以下略)

自由に記載できるとなると、逆に言葉を選ぶのが難しくなりますね。。。


## まとめ

ということで自分の言葉でまとめますと、 UML のステレオタイプは次の通りです。

* 表現を補足するための拡張表現​
* なにを書いてもいい​
* なにを書いてもいいけどオレオレ目線で書くと混乱の元になるのでチームやプロジェクトの共通表現で書く

これらをふまえて、今回 ER 図を書くにあたっては次のような記載をしてみました。

```plantuml
@startuml

' hide the spot
hide circle

' avoid problems with angled crows feet
skinparam linetype ortho

entity "user" as user <<master>>
entity "order" as order <<transaction>>

user ||--o{ order

@enduml
```

マスタ系のテーブルとトランザクション系のテーブルを明示するのにステレオタイプを使っています。
これが正しい使い方かはなんともですが、自分としてはわかりやすいかなと思った次第です。

## 最後に一次ソースにあたる

では、最後に一次ソースを確認してみましょう。(最初にやるのが正しい流れですね。すいません)
UML は [OMG(Object Management Group)](https://www.omg.org/) が仕様を策定しています。
UML の 仕様は [こちら](https://www.omg.org/spec/UML) です。

その中から、こちらの記載、、、でしょうか。

> 12.4.9 Stereotype [Class]
> 12.4.9.1 Description
> A stereotype defines how an existing metaclass may be extended, and enables the use of platform or domain specific terminology or notation in place of, or in addition to, the ones used for the extended metaclass.

(https://www.omg.org/spec/UML/2.5.1/PDF 参照)

DeepL 先生に翻訳していただきましょう。

> 12.4.9 ステレオタイプ [Class] (クラス)
> 12.4.9.1 説明
> ステレオタイプは、既存のメタクラスをどのように拡張するかを定義し、拡張されたメタクラスに使用されるものの代わりに、またはそれに加えて、プラット フォームまたはドメイン固有の用語や表記法を使用できるようにします。

(https://www.deepl.com/translator による翻訳)

お固めの言葉ですが「プラット フォームまたはドメイン固有の用語や表記法を使用できるようにします」というところを見ると、自分の考えからあまり外れてはいないかなと思いました。