vai al contenuto principale

Classi Enum

La classe Enum consente di rappresentare informazioni statiche nel modello, i cui valori restano inalterati a runtime.

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.

Una classe Enum

Una classe Enum

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.

Creare un Enum

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à.

Aggiungere un letterale

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.

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.

Modificare un letterale

Modificare un letterale2

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 #

Nel client web, la rappresentazione di default per i letterali dotati del solo attributo name è un Dropdown menu con i nomi dei letterali come label; se all’Enum vengono aggiunti nuovi attributi, la rappresentazione cambia automaticamente in una Single-row table.

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.

Esempio di classe Enum

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.

L'attributo /completed selezionato

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).

Secondo esempio di Enum

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.

la math /total_discounted_price