I diagrammi caso d'uso UML consentono due modi apparentemente equivalenti per dimostrare che un dato caso d'uso potrebbe essere realizzato in diversi modi, ovvero use case generalizations in contrasto con use case extensions. Ho visto il seguente esempio di base modellato usando entrambi gli approcci con uguale frequenza, a volte all'interno di un'unica sorgente.Generalizzazione del caso d'uso rispetto all'estensione
Secondo me un'estensione un rapporto più debole di generalizzazione come una sostituzione diretta del caso dell'uso specializzato per il caso base dev'essere possibile generalizzazione ma non necessariamente nelle estensioni.
Mi sembra che la generalizzazione implichi una implementazione polimorfica, mentre l'estensione implica che si debba utilizzare una struttura di ramificazione.
void makePayment(const PaymentDetails* pd)
{
pd->pay();
}
al contrario di
void makePayment(const PaymentDetails* pd)
{
switch(pd->type)
{
case EFT:
payViaEFT(pd);
break;
case PAYPAL:
payViaPayPal(pd);
break;
case CREDITCARD:
payViaCreditCard(pd);
break;
}
}
non è la fase Use Case troppo presto per problemi specifici, quali implementazione da modellare? Ci sono diagrammi UML molto più appropriati per questo. Esiste una regola ferrea su quale dei due usare e, in caso affermativo, di cosa si tratta?
Entrambe le implementazioni modellano lo stesso problema. Non sono associati a un diagramma UC o altro. Quello polimorfico è molto più desiderabile, in quanto è più semplice, più facile da estendere e meno soggetto all'errore umano. –