Uml 用例泛化与扩展

Uml 用例泛化与扩展,uml,use-case,Uml,Use Case,UML用例图允许两种看似等价的方式来显示给定用例可能以几种不同的方式实现,即相反的方式。我已经看到下面的示例基本上是使用两种方法建模的,频率相同,有时在单个源中 在我看来,扩展是一种弱于泛化的关系,因为在泛化中必须能够直接替换基本用例,但在扩展中不一定能够 在我看来,泛化意味着需要多态实现,而扩展意味着需要使用一些分支结构 void makePayment(const PaymentDetails* pd) { pd->pay(); } 相对于 void makePayment

UML用例图允许两种看似等价的方式来显示给定用例可能以几种不同的方式实现,即相反的方式。我已经看到下面的示例基本上是使用两种方法建模的,频率相同,有时在单个源中

在我看来,扩展是一种弱于泛化的关系,因为在泛化中必须能够直接替换基本用例,但在扩展中不一定能够

在我看来,泛化意味着需要多态实现,而扩展意味着需要使用一些分支结构

void makePayment(const PaymentDetails* pd)
{
   pd->pay();
}
相对于

void makePayment(const PaymentDetails* pd)
{
   switch(pd->type)
   {
       case EFT:
                payViaEFT(pd); 
                break;
       case PAYPAL:
                payViaPayPal(pd); 
                break;
       case CREDITCARD:
                payViaCreditCard(pd); 
                break;
   }
}
对于这种特定于实现的关注点进行建模,用例阶段不是太早了吗?对于这一点,有更合适的UML图。关于这两种方法中的哪一种,是否有硬性规定?如果有,是什么规定

在我看来,扩展比泛化弱 作为专用用例对基本用例的直接替代 必须可以概括,但不一定可以扩展

这是真的

在我看来,泛化意味着多态性 需要实现,而扩展意味着一些分支 结构将被使用

该图不指示任何实现。 不过,您可以自己解释图表中的提示。UML仍然独立于语言和解决方案

对于这样的实现来说,用例阶段不是太早了吗 要建模的具体问题

正如上面所指出的,UML不强制执行任何特定类型的实现。 然而,您正在收集一些重要的功能需求,这些需求可能会极大地影响您的时间安排和工作负载。(“用信用卡支付”比“银行转账预付款”要复杂得多)。因此,您应该努力抓住这一点,但要对不同的解决方案方法保持开放态度

还有更合适的UML 这方面的图表

你真的可以并行使用它们:)因为它们是关于同一主题的不同观点

关于下列哪一项有严格的规定 要使用的两种方法,如果是,是什么


我更喜欢这种情况下的泛化,因为事实上,扩展错误地表明有一种支付方式可以不使用三个指定选项中的任何一个。正如您自己指出的。

当使用扩展关系建模时,如果扩展关系的条件成立(例如“通过Paypal支付”),则当扩展用例(支付)位于精确位置(由扩展点、支付类型给出)时,执行扩展用例(通过xxx支付),条件为付款(类型=贝宝)。在此模型中,“通过Paypal支付”仅处理使用Paypal完成支付交易的细节,而“支付”指定了与支付方式无关的所有行为(例如计算总金额,并在执行交易后保存交易结果)

另一方面,泛化(不仅为用例定义,而且为任何分类器定义)是一个更广泛的概念,因为它不详细说明(在图表级别)何时以及如何执行专门行为的细节。如果“通过Paypal支付”是“支付”的一种专门化,它将重新定义“支付”的行为,这可能与“通过信用卡支付”的行为有本质上的不同


作为一个扩展用例并不意味着必须对备选方案进行硬编码。实际上,您的第一个示例也是扩展关系的有效实现,因为
pd->pay(pd)
将根据所选的支付类型调用不同的行为。实际上,用例图模拟了系统应该做什么,而低级别的实现细节最好在活动图中指定。

扩展的一个例子是“输入折扣代码”用例。输入折扣代码与付款有关,但付款时不必输入折扣代码


您可以查看“is a”关系来决定使用哪种关系。PayPal支付是一种支付方式,是一种特定的支付方式。输入折扣代码不是。这是付款时可以做的额外事情。

我明白你的意思。付款本身并不完整,所以最自然的关系应该是泛化(这是我最喜欢的)。然而,使用概括似乎意味着不可能同时使用多种支付形式。比如说,添加在include关系上放置条件的功能将有助于避免这些问题。你的想法?我已经看到了作者在你的链接中提到的问题。有一个简单的解决办法。如果你想一想,用两种方法“一次”支付实际上是两次支付。作者被这样一个想法所困扰,即多个支付方法必须是通过makepayment用例的单一过程。您可以通过每个付款方式。如果您想将多个支付交易链接到一个逻辑支付中,那么可以扩展“支付”用例,添加一个“处理多个支付方法”用例或类似的用例,将多个支付过程链接起来。另外,虽然我现在看到了可能使用扩展来处理多个支付的要点,我仍然认为使用泛化模型更准确。使用extends并不能清楚地区分单一和多个支付方式。感谢@BobRodes,我同意推广是一条道路,我所寻找的是一条规则(经验法则),它指出了一种方法何时比另一种更合适。两种实现都模拟了相同的问题。他们不是阿索