UML ユース ケース図では、特定のユース ケースがいくつかの異なる方法、つまりユースケースの拡張ではなく、ユース ケースの一般化で実現される可能性があることを示す、一見同等に見える 2 つの方法を使用できます。次の基本的な例は、同じ頻度で、場合によっては単一のソース内でいずれかのアプローチを使用してモデル化されたものを見てきました。
私の考えでは、拡張は一般化よりも弱い関係です。基本ケースの特殊なユースケースの直接置換は、一般化では可能である必要がありますが、拡張では必ずしも可能ではないからです。
一般化はポリモーフィックな実装が望まれることを意味し、拡張は何らかの分岐構造が使用されることを意味するように私には思えます。
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 ダイアグラムがあります。2 つのうちどちらを使用するかについて厳格なルールはありますか? もしそうなら、それは何ですか?