【问题标题】:Specification of extending use case扩展用例规范
【发布时间】:2019-08-31 13:53:29
【问题描述】:

我正在尝试弄清楚如何指定扩展用例。

例如,假设我有一个用例Pay按正常流程来描述:

1. User select the product
2. User make the payment
3. System validates the payment

此流程包含在规格表中(包括参与者、前置条件、后置条件等)

现在我想在 PayWithCreditCard 之类的扩展使用案例规范中引用此用户案例,而无需重复所有相同的步骤;我该怎么做?

在这种情况下,我需要扩展的唯一步骤是第 2 步。 它以某种方式扩展,例如:

 2.1 User choose payament with credit card
 2.2 User insert credit card
 2.3 User insert Pin 

但是我怎样才能在不重复第 1 步和第 3 步的情况下将其放入规范中呢?

或者还有其他方法可以解决这个问题?

【问题讨论】:

    标签: uml extend use-case


    【解决方案1】:

    如果用例PayWithCreditCardextends 用例Pay,则Pay 应明确标识extension-points 扩展将插入其行为的位置。

    对于用例的表格规范也是如此(或者尤其是?):规范应列出潜在的扩展点并在事件流中识别这些点。例如,Spence & Bittner 建议使用大括号来标识扩展点(参见他们的书用例建模,第 7 章)。

    在你的情况下,这看起来像这样:

    Use-Case:           Pay
    Actors:             Buyer
    Extension-points:   Provide payment details
                        Validate payment
    Basic flow: 
                        1. Buyer selects the product
                        2. Buyer makes payment 
                           2.1. Buyer selects the payment method
                           2.2. { Provide payment details }
                        3. System validates payment 
                           3.1. { Validate payment }
                           3.2. Inform buyer that the payment was accepted
    Pre-conditions:     ...
    

    扩展点将在扩展中定义。根据所选的付款方式,{ validate payment } 扩展点可以例如触发与银行的即时信用卡交易,或等待会计师延迟手动确认已收到电汇。

    为了识别备用流程,您可以使用:

    At { Validate payment }, if rejection or time-out:  ....
    

    重要的是要知道扩展用例可能需要了解它扩展的用例的扩展点。这与包含关系不同,其中包含的 UC 被理解为独立于包含它的用例。

    【讨论】:

    • 我不同意“支付”是一个用例。无论是在措辞上还是在语义上。
    • @qwerty_so 这确实可以讨论 Killian。但我不是来评判内容的,我明白这只是一个例子。我只是尝试回答这个问题,即如何在其描述中链接扩展用例及其扩展。但是,如果 OP 有兴趣,我已经推荐了一本书,它可以进一步发展您的有趣评论。
    • 是的,我看到了,这也是我的建议 :-)
    【解决方案2】:

    基本上,用例应仅显示所考虑的系统向其参与者之一提供的附加值。人们通常倾向于通过滥用扩展/包含来开始功能分解。但是,有时在添加不同的支付方式以扩展支付流程时,显示像此处这样的变化是很有用的。

    首先,“支付”没有用例(它只是动词)。甚至“付费产品”也不是一个用例。我怀疑演员是否会将其视为附加值——情况恰恰相反。用例(我猜)是“购买产品”,这是一个很大的区别。演员想要拥有产品,很明显需要一些交换来获得产品(在几乎所有情况下,这只是金钱)。现在你有了这个用例,你想显示你放入气泡的选项(!)。这些基本上没有用例本身。他们只是扩展现有的用例。 “按信用卡支付”和“支付现金”就是这样的扩展。 (不幸的是,UML 对真实和此类伪用例的图形没有影响。)

    现在,在您的文字描述中,您可以决定付款的地点以及相应的分支。例如。

    1. 选择支付方式

      2.1 如果使用信用卡:执行用例“使用信用卡付款”

      2.2 Else if cash:执行用例“用现金支付”

    在这里处理异常被证明是棘手的(在图形和文本符号中)。所以你可能需要继续

    1. 如果付款被拒绝,请继续...

    或类似的。

    UC 图表如下所示

    【讨论】:

    • 感谢您的回答,是的,对不起,我现在意识到“支付”不是一个用例。我想举一个简单的例子。但是假设用例是“PurchaseProduct”,我的问题不是关于扩展用例(purchaseProduct)的规范,而是扩展用例的规范(例如,使用信用卡购买产品)。他们不需要自己的规格表作为 purcaseProduct 吗?对于扩展案例来说,“泡沫”就足够了吗?
    • 见我上面的补充。
    • 好吧,也许我自己解释得不好,我说的是扩展用例的“规范”,因此是扩展用例的“支持表”,而不是用例图本身。例如,在 2.1 点中,您编写了“执行用例 PayWithCreditCard”,但是在哪里指定了该用例的场景?现在的问题是:扩展用例是否不需要像扩展用例那样的支持表,因为在逻辑上是隐含的?
    • 嗯,“支撑台”是什么意思?扩展用例的描述方式与普通用例相同。 “支付现金”将从 1. 数钱开始; 2. 不足则索取更多;等等。这只是一个嵌入在气泡中的活动,而不是一个用例。 (我对扩展/包含不满意并避免它并不困难)
    • 请注意,依赖关系箭头指向从扩展用例到扩展用例。这意味着扩展用例不应该对扩展用例有任何引用。像If credit card: Perform use case "Pay with credit card" 这样的句子违反了这个原则。
    猜你喜欢
    • 1970-01-01
    • 2016-07-07
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多