• 締切済み

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

みんなの回答

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.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>>は開いていると思ってます。

関連するQ&A

  • ユースケース図における依存、拡張、包含について

    UMLでユースケース図を作成していますが、依存、拡張、包含が今一つピンと来ません。 簡単な例で言うと、 ユースケースA:社員情報を登録する。 ユースケースB:社員情報を修正する。 という2つのユースケースがあった場合、AとBにはいずれかの関係が成り立つのでしょうか? ユースケースBで提供されるサービスは、ユースケースAというサービスが提供されてはじめて意味のあるサービスになると思います。 社員情報を登録できなければ修正なんて発生し得ないわけですから。 依存、拡張、包含について上手く自分の中でイメージができません。 それぞれについてどう考えればいいのでしょうか?

  • 誤解したくないので、伺います。

    ユースケース図(http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:UML_Use_Case_diagram.svg)の読み方を教えて下さい。

  • オブジェクトの中の関数を共通化したい

    こんにちは、今PHP5を使用しています。 例えば、 class A extend B{ : function C(){} function D(){} } class E extend F{ : function C(){} function D(){} } というようにオブジェクトAとオブジェクトEにそれぞれ 同じCとDという関数が存在する場合、共通化するにはどうすればいいですか? ちなみにAとEにはそれぞれデータベース連携の処理があり、 そのデータベース連携の処理がCとDに書かれています。 include()などでうまくいくものなのでしょうか?

    • ベストアンサー
    • PHP
  • PHPのclassで兄弟同士で相互利用する方法

    以下、「INDEX.php」から A~Iの クラスファイル を インクルード new することで 親子関係になり、「INDEX.php」から自由に使用することができます A B C D E F G H I |  | | | | | | | | |  | | | | | | | | ---------------------------- INDEX.php では、兄弟同士、AのクラスファイルからBのクラスファイルのファンクションを使用したい場合は extend をするか AからBのクラスファイル を インクルード new することで 「A」から「B」を自由に使用することができます。 ここで質問なのですが A~Iの兄弟同士で相互利用したい時は量が量なのでextendするわけにはいかず AはB~I、BはAとC~I。。。。といちいちクラスファイル を インクルード new しなければ使う方法はないのでしょうか? 例えば、Aからparent::$B->hoge();(親のBのhogeを発動)のような使い方が出来たら便利だと思うのですが 親を経由して兄弟同士で自由にアクセス クラスにはこのような機能は存在しないのでしょうか? ベテランの方ご教授下さいませ

    • ベストアンサー
    • PHP
  • 嵐コンサート2011-2012申込について

    本人A(会員),娘B(会員),友達C,友達D,友達E 代表者 本人A(会員) 同行者 友達C,友達D 第一希望 01041A 第二希望 01071A 第三希望 07241A 代表者 娘B(会員) 同行者 本人A(会員),友達E 第一希望 07241A 第二希望 01081A 第三希望 09031A と申し込んでしまいました。 無効になるのはどの申込でしょうか?

  • 貸し出し時間の計算するプログラムを教えてください!

    JAVAについて教えてくださいっ!! 下のプログラムは貸出リストの貸出時間総計を出力するプログラムです! これをどう修正すればよいのか教えてほしいです! ~~~~~~~~ import java.util.Scanner; import java.io.File; import java.io.FileNotFoundException; public class Test { public static void main(String[] args) { try{ Scanner file = new Scanner(new File(args[0])); int tm = 0; while (file.hasNext()) { char b = file.next().charAt(0); char io = file.next().charAt(0); int h = file.nextInt(); int m = file.nextInt(); switch (io) { case 'I': tm += 60*h+m; break; case 'O': tm -= 60*h+m; break; } } System.out.printf("%d:%02d\n", tm/60, tm%60); file.close(); } catch(FileNotFoundException e) { System.out.println(e); } } } ~~~~~~~~ このプログラムを修正して、貸出リスト各貸出物の貸出時間合計を出力しつつ、全貸出物の貸出時間の合計を計算し、それらの結果を標準出力に出力するプログラムを作成したいです! それにはどうやって修正すればよいでしょうか???? ~~~~~~~~ ☆貸出リスト(list1.txt) ACD→貸出物の名前、O→貸出時間、I→返却時間 A O 09 10 C O 09 25 A I 09 50 C I 10 05 D O 10 15 D I 10 55 A O 11 30 C O 12 00 A I 12 45 C I 13 15 D O 13 20 A O 13 30 D I 14 05 A I 14 15 D O 14 55 D I 15 40 ~~~~~~~~ 【実行例】 ↓のように出力させたいです ☆コマンドライン入力 list1.txt ☆標準出力 A 2:40 C 1:55 D 2:10 6:45 よろしくお願いいたします!(^^)!

  • C++ 多態とstlのコンテナについて

    以下のように、継承関係を作ります。 --------------------------------------- #include <iostream> #include <list> #include <vector> using namespace std; struct Base { virtual ~Base() = 0; }; Base::~Base() {} struct Sub1 : Base { int v; Sub1(int i) { v = i; } }; struct Sub2 : Base { double v; Sub2(double d) { v = d; } }; --------------------------------------- この場合、 Sub1, Sub2 のインスタンスをなにかコンテナに入れたい場合は、一般的には以下のように書けばいいのでしょうか? ---------------------- list<Base*> l; vector<Base*> v; Sub1 s1(3); Sub2 s2(4.4); l.push_back(&s1); l.push_back(&s2); v.push_back(&s1); v.push_back(&s2); ---------------------- list<Base>, vector<Base>も試しましたが list<Base> は宣言したところで vector<Base> は push_back() したところで コンパイルエラーになりました。 これは、こういうものなのでしょうか? むしろ、struct(もしくはclass)の書き方を変えたりすれば、問題なくなったりするのでしょうか? 全体としては、C++は参照などあって、どいう場合にポインタ使うべきなのかそういう部分に混乱しているような気もします。 いろいろ質問してしまって、申し分けないですがなにか ひとつでも答えられるものがあれば回答してもらえると ありがたいです。

  • UMLにおけるクラス図で困っています。

    javaでの統一モデリング言語 (UML)におけるクラス図の質問です。 既に「ラジオ」「カセットレコーダ」「CDプレーヤ」「テレビ」「MDレコーダ」の各クラスが定義してあるとする。 この後、「ラジカセ」(ラジオとカセットレコーダの機能を合わせ持つ)、「ラテカセ」(同じく、ラジオ、テレビ、カセットレコーダ)、「ラジオカセットMD CD」(同、ラジオ、カセットレコーダ、MDレコーダ、CDプレーヤ) を設計したいのですがどのように設計したらよいかクラス図を用いて説明をお願いします。

    • ベストアンサー
    • Java
  • UML、クラス図について

    くだらない質問かもしれません。 列車に、 1:普通車・グリーン車・寝台 2:喫煙・禁煙 という種類がある場合、これはクラス図でどう表現すればいいのでしょう。列車というクラスの属性値に、種類1、種類2というものを入れるにしても、種類1(普通車・グリーン車・寝台)といった要素の限定はどうやって記述すればいいのでしょうか。 また、列車を継承したクラスとして、普通車クラス・グリーン車クラス・寝台クラスをつくる等も考えたのですが、こういう書き方もありでしょうか? うまく説明できないのですが、UML初心者です。

  • UML アクティビティ図の書き方で困っています、、

    UML初心者です。 業務フローを、アクティビティ図の手法を使って書いていますが、 以下のような場合、どう記述してよいのか悩んでいます。 ---------------------------------------------- ※レーンは「A部門担当者」と「B部門担当者」の2つがあります。 0.初期状態 1.A部門担当者とB部門担当者が打合せをして、価格の条件を決める。 2.1.で決めた条件を、B部門担当者が、販売システムに入力。 ---------------------------------------------- この後の業務フローは完成したのですが、 フローのスタート部分がこのような形で悩んでいます。 例えば、1は、 「A部門担当者」レーンと「B部門担当者」レーンにまたがって 「価格の条件を決める」という1つのアクティビティを記述する という方法でよいのか?など、が特に悩んでいるポイントです。 初歩の質問で大変申し訳ありませんが、このような場合の 記述方法について、どなたか教えていただけませんでしょうか? よろしくお願いいたします。

専門家に質問してみよう