Диаграммы вариантов использования 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-диаграммы. Есть ли жесткое и быстрое правило относительно того, какой из двух использовать, и если да, то какой?