プロが教えるわが家の防犯対策術!

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) (単行本)
井上 樹 (著)

A 回答 (1件)

その本は持っていないため、読み方の問題なのか、本の記述の問題かはわかりませんが、


「必ず必要か」というのは、おそらく「定義の依存関係」についての説明のつもりではないでしょうか。

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>>は開いていると思ってます。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A