UML 用例图允许使用两种看似等效的方式来显示给定的用例可以通过多种不同的方式实现,即 use case generalizations与 use case extensions 相反。我已经看到以下基本示例使用相同频率的任一方法建模,有时在单个源内。
在我看来,扩展是比泛化更弱的关系,因为在泛化中必须可以直接替换基本用例的专用用例,但在扩展中则不一定。
在我看来,泛化意味着需要多态实现,而扩展意味着要使用一些分支结构。
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 图。对于使用两者中的哪一个是否有一个硬性规定?如果是的话,它是什么?
最佳答案
To my mind an extension is a weaker relationship than generalization as a direct substitution of the specialised use case for the base case must be possible in generalization but not necessarily in extensions.
确实如此。
It seems to me that generalisation implies a polymorphic implementation is desired while extension implies some branching structure is to be used.
该图不指示任何实现。 不过,您可以自己解释图表中的提示。 UML 仍然独立于那里的语言和解决方案。
Isn't the Use Case stage far too early for such implementation specific concerns to be modelled?
嗯,如上所述,UML 不强制执行任何特定类型的实现。 但是,您在这里收集了一些重要的功能需求,这些需求可能会极大地影响您的时间安排和工作量。 (“用信用卡支付”比“通过银行转账预付”处理起来要复杂得多)。因此,您会努力捕获这一点,但对不同的解决方案保持开放的态度。
There are much more appropriate UML diagrams for that.
您确实可以并行使用它们:),因为它们是对同一主题的不同观点。
Is there a hard and fast rule regarding which of the two to use and if so what is it?
我更喜欢这种情况下的概括,因为扩展错误地表明可能存在一种不使用这三个指定选项中任何一个的支付方式。正如您自己所指出的。
附录(根据评论):示例图的主要目的是概述预期的付款方式方式。一次付款至少需要一种手段(除非付款被取消),就像“打印”太模糊,没有明确“什么”和“哪里”等。因此,尽管“付款”本身就是一个有效的用例,但我还是倾向于使用概括。
关于uml - 用例泛化与扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15133595/