UML che estende le assenzioni di classe con generalizzazioni

1

Ho un concetto semplice come nell'immagine qui sotto. Fondamentalmente c'è un oggetto che può essere di 1 tipo su 3 e un personaggio che può essere di 1 su 2 tipi. Tutte le generalizzazioni sono disgiunte.

Quello che sto cercando di fare è in qualche modo dipingere con notazione UML che un Personaggio può in qualsiasi momento portare solo un oggetto, ma il Mistico può portare solo un libro o un bastone, mentre Paladino può portare qualsiasi tipo di oggetto (Libro , Spada o bastone).

Non riesco a capire come associare queste classi in questo modo per preservare i vincoli di cui sopra. È persino possibile con questa composizione UML?

    
posta Regs 04.11.2018 - 02:28
fonte

1 risposta

2

Prima correzione (consigliata):

In primo luogo, UML non è Java. La relazione tra Book , Sword o Stuff classi su un lato e Item classe sull'altro è mostrata con un generalization , e non c'è bisogno di etichettare la freccia con Extends . Non c'è alcuna confusione possibile in questo diagramma UML con una relazione di realizzazione (cioè "implementazioni"), poiché quest'ultimo sarebbe mostrato con una linea tratteggiata .

Seconda correzione (richiesta):

La tua narrazione è incoerente con il tuo diagramma. Nella tua domanda hai menzionato un Character che può essere un Monk o un Palladin , ma il tuo diagramma suggerisce che Palladin in un tipo di Monk (in base alla relazione di generalizzazione visualizzata, Monk sarebbe il concetto più generale e Palladin sarebbe un tipo di Mistico più specializzato). Questo è confusionario.

Punto di partenza

Quindi il diagramma di partenza potrebbe essere simile a:

Relazione che vuoi mostrare:

Vuoi mostrare che un Character può avere in qualsiasi momento solo un Item . Quindi, in pratica, questo significa che hai una relazione tra Character e zero o uno ( 0..1 ) Items che può essere letto come "proprietario" (il personaggio possiede un oggetto). Viceversa, un Item può essere posseduto da zero o un Character .

Questo sarebbe mostrato come segue:

Sfortunatamente, questo permetterebbe a qualsiasi personaggio di possedere qualsiasi tipo di oggetto. Se vuoi limitare questo, devi utilizzare un vincolo UML . Questo viene fatto usando una casella di commento e inserisci un vincolo tra parentesi graffe {...} . Il modo formale di fare sarebbe usare il linguaggio OCL. Ma un approccio più pratico è quello di documentare la contraint in lettere semplici:

Qui, il contraint è mostrato sull'associazione. È pratico, dal momento che è possibile aggiungere altri vincoli per altri tipi di personaggi. Tuttavia, potresti anche scegliere di mostrare il vincolo per la classe Monk (e altre classi che hanno le loro associazioni vincolate).

    
risposta data 04.11.2018 - 16:35
fonte

Leggi altre domande sui tag