先日、チームの先輩からPlantUMLというUML図作成用プラグインを教えていただきました。
これまでかなりの時間をかけてDraw.ioで作成していましたが、このプラグインを使いだしてから圧倒的に作業時間が少なくなって感動。
テキストで書いたものがリアルタイムで反映されるため、いちいちクラス図の枠線を整えたり、ボックスの幅を幅を調整する時間が無くなったのが大きいと思っています。(特に抜け漏れを見つけたときいちいち手で修正するのが面倒だった)。
ただ、もっとUML図の作成時間を短縮し、より良いドキュメントを作成していくには、もっとドキュメントやプログラミング概念のことを知らないといけないなぁと感じるようになりました。
たとえば、現在作成しているUML図(現在担当しているのがクラス図なのでクラス図に限定するが)を書くには、継承や依存などのいくつかの概念を理解しておかなければなりません。
これらを理解していないと見当違いの図を作成してしまい、結局のところ開発効率を下げてしまう可能性があるからです。
しかし自分自身、ドキュメント作成のことは全くの無知、その上、プログラミング概念の理解は曖昧。
なので、これを機にしっかり理解して作れるようになりたいと思うようになったのです。
そのためにドキュメントに関わるプログラミングの概念やドキュメントごとの作成方法などを学びながら、自分自身の不足を埋め、開発効率を上げられるドキュメントを生み出したいと思っています。
また、自分と同じような状況に置かれている新米エンジニアの役に立つものになればと思っています。
対象読者
- はじめてドキュメント作成を担当することになった新米エンジニア
- ドキュメント作成について改めて学びたい人
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3030043768514154" crossorigin="anonymous"></script> <ins class="adsbygoogle" style="display:block; text-align:center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-3030043768514154" data-ad-slot="5084894696"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script>
基本事項
クラス図とは?
まず、クラス図がどのような図なのかを把握しておきます。
東大大学院の機械系演習課題の「実践的シミュレーションソフトウェア開発演習」自習用教材の説明がわかりやすかったのでそちらを引用します。
クラス図では、検討対象のプログラム中に、どんなクラスが存在するのか、 また、クラスとクラスの間にどんな関係があるのかを図示します。 —東京大学大学院 機械系演習課題「実践的シミュレーションソフトウェア開発演習」自習用教材 リファレンス 3.1.2 クラス図/ class diagramsより
クラス図の構成
クラス図の例を見るとわかるように、クラス図は3つのセクションに分かれています。
一番上にクラス名、真ん中に属性(プロパティ)、一番下にメソッドを記載します(それぞれのセクションを名前区間、属性区間、操作区間と呼びます)。
こんな感じ。
+----------------+ | クラス名 | +----------------+ | 属性 | +----------------+ | メソッド | +----------------+
クラスの関係性
クラスはそれ単体で作用するものもあれば、他のクラスとの関わりあって作用するものもあります。
一般的な関係性は下記です。
名称 | 意味 | 例 |
---|---|---|
関連 | お互いに関連付けられている。 | 学生は1つの学級に関連する |
双方向関連 | お互いが関連しており、どちらのクラスも相手への参照を持っている。 | |
単方向関連 | 片方のクラスがもう一方への参照を持っている。 | |
集約 | 部分と全体の関係を示す。部分は全体に属するが、全体とは独立して存在できる。 | 学級は複数の学生を持っているが、学生は学級が消滅しても存在できる。 |
合成 | 集約よりも強い関連性を示す。全体が消えると部分も消える。 | 学級は学年の一部であり、学年が消滅すると学級も消滅する |
依存 | あるクラスが別のクラスの変更の影響を受けること。 | 学年は学校の決定に依存する |
継承 / 汎化 | あるクラスが別のクラスから属性やメソッドを引き継ぐこと。 | 学年や学級は学校から特性を引き継ぐ |
実装 | インターフェースが定めた機能をクラスがどう扱うかという関係のこと。 | 学生が参加する部活動を決める |
このような関係性をクラス図では記号で表します。
PlantUMLでは下記のように記述します。
関係性 | 記述方法 |
---|---|
関連 | Student -------- Course |
双方向関連 | Student -------- Teacher |
単方向関連 | Student -------> Library |
集約 | Classroom o----- Student |
合成 | Grade ◆----- Classroom |
依存 | School <.. Grade |
継承 / 汎化 | School <|--- Grade |
実装 | Club <|.. Student |
クラスの可視性
可視性とは、そのクラスがどこからアクセスできる範囲を示すことです。
つまり、public
や private
、 static
などのアクセス修飾子を表現することです。
可視性は下記のように表現します。
記号 | アクセス修飾子 | PlantUML |
---|---|---|
- | private | □ |
+ | public | 〇 |
# | protected | ◇ |
~ | package-private | △ |
{ static } | static | underline |
さまざま属性やメソッドを持ったStudent
クラスを作成してみます。
@startuml Students class Student { id: int name: string age: int grade: int classroom: int club: string secretCode: string schoolName: string findSecretCode(): string greeting(friendName): string playClub(): void getSchoolName(): string } @enduml
まだ可視性を付けていないのでアクセスできる範囲がわかりません。
なので、この Student
クラスに可視性を加えてみます。
@startuml Students class Student { - id: int + name: string + age: int + grade: int + classroom: int ~ club: string # secretCode: string {static} schoolName: string # findSecretCode(): string + greeting(friendName): string ~ playClub(): void {static} getSchoolName(): string } @enduml
可視性が表示されてより分かりやすい図になりました。
まとめ
これでひとまずクラス図を書くために必要な事項は網羅できたかなと思います。
これからはより概念を理解できるような内容にしていきます。
ドキュメント作成は書いてみることが一番難しいので、とりあえず書いてみてフィードバックをもらってブラッシュアップしていくのがベストだと考えています。
参照ドキュメント
- 東京大学大学院 機械系演習課題「実践的シミュレーションソフトウェア開発演習」自習用教材 リファレンス 3.1.2 クラス図/ class diagrams
- クラス図の書き方とは。初心者にもわかりやすく解説
- https://cacoo.com/ja/blog/how-to-write-class-diagram/