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 图。关于使用两者中的哪一个,是否有硬性规定?如果是,那是什么?