Un Enum può essere usato in tutti quegli scenari in cui è utile avere direttamente sul modello delle informazioni costanti, come un elenco di stati o classificazioni. Nel modello, le costanti definite negli Enum sono disponibili globalmente a tutte le altre classi, le quali possono avere associazioni verso una particolare classe Enum o referenziare i valori dei singoli letterali nelle espressioni math, nelle condizioni WHERE sulle query o su filtri a livello di Application schema.
Una classe Enum è distinguibile nel diagramma dallo stereotipo «enum»
, e per la presenza di due liste: attributi e literal objects.
Creare un Enum #
Fai click destro su un punto libero nell’area di lavoro (Canvas) per aprire il Database menu
; dal menu a tendina scegli New enum class
. In alternativa, clicca sul pulsante della palette(Create a new enum
).
L’attributo name
viene creato automaticamente.
Letterali #
Un letterale è un oggetto costante a visibilità globale; nella forma più semplice è una stringa, o più precisamente un oggetto con un singolo attributo name
di tipo string
, con un valore uppercase univoco nel contesto della classe Enum. L’attributo name
è obbligatorio, in quanto identifica il letterale stesso nella lista dei literal objects, ed è sempre Object title.
Aggiungere un letterale #
Fai click destro su una classe Enum per aprire il suo Class menu
e seleziona New literal
; una volta aggiunto il letterale, il conteggio degli oggetti totali presenti nella classe aumenterà di un’unità .
Letterali con più attributi #
Attraverso i letterali è possibile rappresentare informazioni strutturate, definendo altri attributi sulla classe Enum (oltre a name
).
Sono consentiti tutti gli attributi platform e tutti gli attributi nativi ad eccezione di Serial
e File
, mentre gli attributi derivati sono disabilitati. Per costruzione, non è possibile dichiarare vincoli di unicità , restrizioni sul dominio o indici sugli attributi degli Enum, né impostarli required; l’unico attributo required è name
.
Ordinamento dei letterali #
Nonostante sia possibile disporre liberamente i letterali all’interno della classe come avviene per gli attributi (tramite drag and drop), ogni modifica fatta in questo contesto impatta semplicemente la leggibilità dell’engine model, ma non ha nessun effetto sulla sulla disposizione degli oggetti al di fuori dal Designer.
Esistono però scenari nei quali può essere desiderabile modificare l’ordine dei letterali a livello applicativo; ad esempio, per migliorare l’esperienza degli utenti, si potrebbe voler far comparire le scelte più comuni in cima alla lista di un menu a tendina. Per fare ciò è necessario aggiungere almeno un altro attributo alla classe Enum (oltre all’attributo name
), e usare tale attributo come parametro per ordinare o filtrare i risultati. Maggiori informazioni sono disponibili nella sezione seguente.
Modificare i letterali #
I campi dei letterali possono essere compilati attraverso un editor dedicato. Per aprirlo è necessario aprire il Class menu
dell’Enum cliccando col tasto destro su di esso, e selezionare l’opzione Edit literal objects
.
Nell’esempio mostrato in figura abbiamo aggiunto l’attributo discount_percentage
all’Enum Discount_code. I valori di questo attributo per i due letterali presenti nella classe sono stati modificati compilando i campi della tabella visibile a destra.
Referenziare un Enum #
Un primo modo di utilizzare un Enum nel modello è creare associazioni verso di esso, così da poter associare un oggetto a uno dei letterali dichiarati. Le uniche relazioni consentite con classi Enum sono associazioni unidirezionali, con l’Enum come target; dunque solo i ruoli verso l’Enum sono navigabili, con cardinalità Exactly one (1
) o Zero or one (01
).
È inoltre possibile fare riferimento ai letterali degli Enum nelle espressioni con la seguente sintassi: <EnumClassName>[LITERAL_NAME].name
. Il pulsante (Enum constants
) nell’Expression editor mostra la lista di tutti gli Enum del modello e per ciascuno di essi, la lista dei letterali; per ogni letterale è poi possibile selezionare gli attributi dichiarati sull’Enum, oltre a tutti i suoi attributi di piattaforma. Questo consente di eliminare valori cablati dalle espressioni e fare invece riferimento a informazioni direttamente disponibili nel modello.
Enum nell’applicazione generata #
Esempi #
Enum con un singolo attributo #
Vediamo un esempio di classe Enum: abbiamo modellato una spedizione (Shipping) e vogliamo avere modo di controllarne lo stato di avanzamento. Per rappresentare i possibili stati della spedizione avremmo potuto utilizzare attributo nativo; tuttavia, poiché si tratta di informazioni statiche (che quindi non verranno modificate a livello database) è più efficace vincolare queste informazioni al modello tramite un Enum. Abbiamo quindi creato la classe Enum Shipping_status con i letterali DELIVERED
, IN_TRANSIT
, OUT_FOR_DELIVERY
, PENDING
, SHIPPED
e CANCELED
.
La query status
punta l’attributo name
, che ha come valori i nomi dei letterali.
L’attributo math/completed: boolean
indica semplicemente se la spedizione è stata completata oppure no, referenziando tramite parentesi quadre un letterale nella propria espressione: Shipment_state[DELIVERED].name= state.
. In questo modo, quando /status
ha come valore DELIVERED
vale TRUE
, e dunque la spedizione risulta completata.
Nella figura successiva è stato selezionato /completed
; il Designer mostra gli attributi e il letterale utilizzati per calcolarlo cerchiati in rosso.
Enum con più attributi #
Vediamo ora l’esempio di un Enum leggermente più complesso. Abbiamo modellato un insieme di codici sconto (Discount_code) che possono essere applicati al valore di una vendita (Sale).
L’attributo /total_price
è calcolato sommando i valori trovati dalla query che punta il prezzo (price
) dei prodotti (Product). L’attributo discount_percentage
, aggiunto all’Enum Discount_code, indica la percentuale di sconto applicata. Abbiamo creato su Sale una query che punta a questo attributo, in modo da poterlo utilizzare per calcolare il prezzo finale. L’associazione verso Discount_code è Zero or one (01
) perché il codice sconto può anche non essere applicato.
Per ottenere il prezzo finale scontato, abbiamo infine creato un attributo math, total_discounted_price
, che moltiplica il prezzo totale della vendita per la percentuale di sconto applicata, attraverso l’espressione total_price * discount_percentage
.