Схемы использования UML-кода позволяют использовать два, казалось бы, эквивалентных способа показать, что данный вариант использования может быть реализован несколькими различными способами, а именно использовать обобщения case, в отличие от использовать расширения для расширений. Я видел следующий основной пример, смоделированный с использованием любого подхода с равной частотой, иногда в пределах одного источника.
На мой взгляд, расширение является более слабым отношением, чем обобщение, поскольку прямая подстановка специализированного варианта использования для базового случая должна быть возможной в обобщении, но не обязательно в расширениях.
Мне кажется, что обобщение подразумевает, что полиморфная реализация желательна, в то время как расширение подразумевает использование некоторой ветвящейся структуры.
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. Есть ли жесткое и быстрое правило относительно того, какой из двух использовать, и если да, то что это?