- 締切済み
UMLのユースケース図における「include」と「extend」の意味について
UMLに関する本(注)を読んでいるのですが、ユースケース図におけるincludeとextendについて疑問点がありましたので質問させてください。 本の説明では、includeとは「ベースとなるユースケースがincludeするユースケースを処理の上でサブルーチン様に必ず必要とする」ことを表し、extendとは「ベースとなるユースケースの機能拡張を意味し、extendされるユースケースはベースとなるユースケースの処理上必ずしも必要ではない」ことを表すとのこと。 例として、「レンタルビデオ店におけるビデオ貸出システム」において、「ビデオの貸出を行うユースケース(以下、ユースケースA)」は「貸出申込人が会員かどうかを確認するユースケース(以下、ユースケースB)」をincludeし、「カードでレンタル料金を支払うユースケース(以下、ユースケースC)」はユースケースAをextendしたものであるとのこと。一方、ユースケースAは「会員を新規登録するユースケース(以下、ユースケースD)」をincludeしているとのこと。 以下、疑問点です。 貸出申込人がすでに会員であった場合にはユースケースDは不要であるため、ユースケースDはユースケースAを行うにあたって「必ず必要」とは考えられないのですが、「ユースケースAはユースケースDをincludeする」というのは正しいのでしょうか。 また、貸出申込人が「現金を持ち合わせていない。カードでなら払える。」と申し出た場合にはユースケースCはユースケースA上必ず必要であるのですが、これはextendで正しいのでしょうか。(現金を持ち合わせている場合は必ず必要ではないためextendであるような気はしています。しかし、そう考えるならユースケースDもextendであるように思えるのです。) 宜しくお願い致します。 (注) ダイアグラム別 UML徹底活用 (DB Magazine SELECTION) (単行本) 井上 樹 (著)
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- MrBan
- ベストアンサー率53% (331/615)
その本は持っていないため、読み方の問題なのか、本の記述の問題かはわかりませんが、 「必ず必要か」というのは、おそらく「定義の依存関係」についての説明のつもりではないでしょうか。 use caseの定義が別のuse caseに依存している=「定義上で必要」であることと、「実行時に動く」ことは違うかと。 仕様上、<<inclute>>は、base use case(含む側)がincluded use case(含まれる側)に依存していて、 特定の場所で(部品として)included use caseの処理を含むものという定義です。 (主に共通利用を目的としているため、実行が無条件でも条件付でも無関係です) 一方、<<extend>>の定義では、base use caseは、特定のextension point(拡張点)により extension use caseが挿入されるとなっていて、extension use caseに依存せず、base use caseが独立しています。 ※参照:"UML 2.0 Infrastructure Specification"/"UML 2.0 Superstructure Specification" (OMGの仕様書) つまり、base use caseがincluded use caseを<<include>>した場合、 base use caseはincluded use caseの処理(結果)に依存します。 逆に、extension use caseがbase use caseを<<extend>>する場合、 extension use caseが、base use case(の拡張点)に依存します。 言い換えると、base use caseは、<<include>>においては依存する側ですが、 <<extend>>においては依存される側で、これが根本の違いです。 しかし、規定にあるのはここまでで、あらわすところは「定義の依存性」であり、 「実際に呼ばれるか否か」という問題はUMLの表記から外れた固有の用法だと思います。 で、この例に立ち返ると、私自身は本を持っていないため、 筆者の考えるシステム自体については回答できませんが (設計上の選択肢なので正解はないと思います) 一般論で、<<extend>は「追加フローへの分岐」などに使うとされます。 この観点で見れば、おそらく現金支払いがAとすると、 カード支払いがDというのは、教科書的な代替フローの例かと思います。 # 現金の持ち合わせ云々は、特に規定がなければここでは無関係です。 そして、<<include>>は「関数呼び出し」と表されることがあります。 もしも、AがDを<<include>>する場合、AがDに依存します。 逆にAがDに<<extend>>されるとすると、DがAに依存します。 そのシステムにおいて、A(貸し出し)とD(新規会員登録)の依存関係はどうなっていますか。 繰り返しになりますが、extendでもincludeでも設計次第という関係はありえます。 しかし、依存の方向が逆になるため両立はしません。 システムではどちらか相応しい方を決めて、それをUML等を用いて規定します。 依存の方向性から捕らえてみるとどうでしょうか。 # 私見ですが、選択基準として、<<include>>は閉じていて、<<extend>>は開いていると思ってます。