クラス図におけるクラス関の関係の決め方のベストプラクティスはなにか?
クラス図を書く練習をしています。
クラス間の関係は下記6種類あると思うのですが、どれを選ぶかがあまり慣れていなく、どのような思考フローで決めていけば知りたいです。もし一般的にはこうやってやるものだ、というものや、個人的にこうやってるという内容でも構いませんのでアドバイスをいただきたいです。具体的に知りたいことは後述したのでそこを見ていただければと。
(参考)クラス間の関係の6種類
- コンポジション
- 集約
- 依存
- 関連
- 汎化
- 実現
(例)図書館マネジメントシステム
たまたま発見した解説です。英語ですみません。ページをスクロールさせるとクラス図があります。
これを題材にして話してもらえると助かりますが、一番下に書いた知りたいことに答えてくださることが私の希望ですので僕にこの題材にこだわらずとも大丈夫です
https://www.educative.io/courses/grokking-the-object-oriented-design-interview/RMlM3NgjAyR
私の認識
- クラスの間になにか関係がありそうな2クラスを探す
- 汎化、実現、コンポジション、集約、依存、関連の順番に該当するかどうか判断
- 汎化、実現は特徴的なのですぐわかる
- なるべく関連は使わないほうがよいと思っている(なんとなく)、そのため、無理矢理にでもコンポジション、集約、依存のどれかにあてはまらないか考えてしまう
- コンポジション、集約、依存の使い分けは特に問題ない
- 「関連にしてよい基準がわからない」
- 今注目しているクラスのどちらか片方から他に関係があるクラスがないか探す(1に戻る)
先述の題材で気になったこと
- BookLendingとFineの間は単に関連でよいのか? BookLendingによってFineが発生するという考えから依存なのかなと思いました
- AuthorとBookの間は単に関連でよいのか?Authourが作った本がBookだと思うので、依存関係があって、createという感じかなと思いました
- AccountとBookLendingの間は単に関連で良いのか?AccountとBookReservationの間同様でmakeの依存関係かなと思いました。
知りたいこと
- 各クラス間の関係を前述6関係のどれかにあてはめるときに、6関係のどれにあてはまるか考えると思うのですが、どのように考えているかを知りたい(定義自体は補足していただかなくても良い気がします)
- 関連を使うのはどういうときか?(前述のようになるべくコンポジション、集約、依存)にしたほうがよいのかなーと思っていまして、関連を安易に使うことは思考停止してるような気がしてます(先述の題材で気になったことは全て、「ここで関連にしてよいのかな?依存じゃないのかな?」という疑問です