質問: クラス図を書く練習をしています。 クラス間の関係は下記6種類あると思うのですが、どれを選ぶかがあまり慣れていなく、どのような思考フローで決めていけば知りたいです。もし一般的にはこうやってやるものだ、というものや、個人的にこうやってるという内容でも構いませんのでアドバイスをいただきたいです。具体的に知りたいことは後述したのでそこを見ていただければと。 (参考)クラス間の関係の6種類 - コンポジション - 集約 - 依存 - 関連 - 汎化 - 実現 (例)図書館マネジメントシステム ---------------- たまたま発見した解説です。英語ですみません。ページをスクロールさせるとクラス図があります。 これを題材にして話してもらえると助かりますが、一番下に書いた知りたいことに答えてくださることが私の希望ですので僕にこの題材にこだわらずとも大丈夫です 私の認識 ---- 1. クラスの間になにか関係がありそうな2クラスを探す 2. 汎化、実現、コンポジション、集約、依存、関連の順番に該当するかどうか判断 * 汎化、実現は特徴的なのですぐわかる * なるべく関連は使わないほうがよいと思っている(なんとなく)、そのため、無理矢理にでもコンポジション、集約、依存のどれかにあてはまらないか考えてしまう * コンポジション、集約、依存の使い分けは特に問題ない * 「関連にしてよい基準がわからない」 3. 今注目しているクラスのどちらか片方から他に関係があるクラスがないか探す(1に戻る) 先述の題材で気になったこと ------------- * BookLendingとFineの間は単に関連でよいのか? BookLendingによってFineが発生するという考えから依存なのかなと思いました * AuthorとBookの間は単に関連でよいのか?Authourが作った本がBookだと思うので、依存関係があって、createという感じかなと思いました * AccountとBookLendingの間は単に関連で良いのか?AccountとBookReservationの間同様でmakeの依存関係かなと思いました。 知りたいこと ------ 1. 各クラス間の関係を前述6関係のどれかにあてはめるときに、6関係のどれにあてはまるか考えると思うのですが、どのように考えているかを知りたい(定義自体は補足していただかなくても良い気がします) 2. 関連を使うのはどういうときか?(前述のようになるべくコンポジション、集約、依存)にしたほうがよいのかなーと思っていまして、関連を安易に使うことは思考停止してるような気がしてます(先述の題材で気になったことは全て、「ここで関連にしてよいのかな?依存じゃないのかな?」という疑問です
回答: 「なるべく関連は使わないほうがよい」という思い込みは止めましょう。 本には、それを書いた著者がいる。 執筆家には、自分が書いた著作(本)がある。 だから、ある「本」とその「著者」には関連がある。 こういう単純な関連まで、片っ端から「汎化、実現、コンポジション、集約、依存」なのではないかと疑っていては、疲れてしまいますよ。 ・汎化、実現には、親子関係(クラスの継承、インターフェースの共有)がある。 ・集約、コンポジションには、"全体-部分"関係がある。 ・依存には、"主-従"関係がある(主が変わると、それによって従も変わる必要がある)。 クラス間の関係について、上記3つの性質のどれが成立しそうか(どの性質が一番妥当そうか)を考えれば、それほど悩まないで済むのではないでしょうか。 そして、「汎化、実現、コンポジション、集約、依存」のいずれにも分類できないものは"関連"とする。 上記のルールで、題材のクラス図を見直してみてください。 腑に落ちるところがあるかと思います。