Informazioni su modelli, classi e relazioni
Un linguaggio specifico del dominio (DSL) viene definito dal relativo file di definizione DSL, insieme a qualsiasi codice programma personalizzato che è possibile scrivere. La maggior parte del codice del programma nella soluzione DSL viene generata da questo file.
Questo argomento illustra le funzionalità centrali della definizione DSL.
Definizione DSL
Quando si apre Dsl\DslDefinition.dsl
, la finestra di Visual Studio è simile all'immagine seguente.
Le informazioni più importanti nella definizione DSL sono visualizzate nel diagramma delle definizioni DSL. Altre informazioni, che fanno anche parte di DslDefinition.dsl, vengono visualizzate in Dsl Explorer, che in genere viene visualizzato sul lato del diagramma. Si lavora con il diagramma per le attività più frequenti e con DSL Explorer per personalizzazioni più avanzate.
Il diagramma di definizione DSL mostra le classi di dominio che definiscono gli elementi del modello e le relazioni che definiscono i collegamenti tra gli elementi del modello. Mostra anche le forme e i connettori usati per visualizzare gli elementi del modello all'utente.
Quando si seleziona un elemento nella definizione DSL, nel diagramma o in Esplora DSL, le informazioni su di esso vengono visualizzate nel Finestra Proprietà. È possibile visualizzare informazioni aggiuntive nella finestra Dettagli DSL.
I modelli sono istanze di DSLS
Un modello è un'istanza del linguaggio DSL creato da un utente. Un modello contiene elementi del modello, ovvero istanze delle classi di dominio definite dall'utente e collegamenti tra gli elementi, ovvero istanze delle relazioni di dominio definite dall'utente. Un modello può anche avere forme e connettori, che visualizzano gli elementi e i collegamenti del modello in un diagramma. La definizione DSL include le classi shape, le classi del connettore e una classe per il diagramma.
Una definizione DSL è nota anche come modello di dominio. Una definizione DSL o un modello di dominio è la rappresentazione in fase di progettazione del linguaggio specifico del dominio, mentre il modello è l'istanza in fase di esecuzione del linguaggio specifico del dominio.
Le classi di dominio definiscono gli elementi del modello
Le classi di dominio vengono usate per creare i vari elementi nel dominio e le relazioni di dominio sono i collegamenti tra gli elementi. Sono la rappresentazione in fase di progettazione degli elementi e dei collegamenti di cui verrà creata un'istanza dagli utenti del linguaggio specifico della progettazione quando creano i propri modelli.
Questa figura mostra un modello creato dall'utente di un linguaggio DSL della libreria musicale. Musica album sono rappresentati da caselle che contengono elenchi di canzoni. Gli artisti sono rappresentati da scatole rotonde e sono collegati agli album a cui hanno contribuito.
La definizione DSL separa due aspetti. L'aspetto degli elementi del modello nel diagramma del modello viene definito usando classi di forma e classi del connettore. Le informazioni contenute nel modello vengono definite usando classi di dominio e relazioni di dominio.
La figura seguente mostra le classi di dominio e le relazioni nella definizione DSL della libreria Musica.
La figura mostra quattro classi di dominio: Musica, Album, Artista e Canzone. Le classi di dominio definiscono proprietà di dominio, ad esempio Name, Title e così via. Nel modello di istanza i valori di alcune di queste proprietà vengono visualizzati nel diagramma.
Tra le classi sono presenti relazioni di dominio: Musica HasAlbums, Musica HasArtists, AlbumbHasSongs e ArtistAppearedOnAlbums. Le relazioni hanno molteplicità, ad esempio 1..1, 0..*. Ad esempio, ogni brano deve essere correlato esattamente a un album tramite la relazione AlbumHasSongs. Ogni album può avere un numero qualsiasi di canzoni.
Ridisporre il diagramma delle definizioni DSL
Si noti che una classe di dominio può essere visualizzata più volte nel diagramma di definizione DSL, come in questa immagine. Esiste sempre una vista principale e possono essere presenti alcune visualizzazioni di riferimento .
Per riorganizzare il diagramma di definizione DSL, è possibile:
Scambiare le visualizzazioni principali e di riferimento usando i comandi Bring Tree Here e Split Tree . Fare clic con il pulsante destro del mouse su una singola classe di dominio per visualizzare questi comandi.
Riordinare le classi di dominio e le classi di forme premendo CTRL+SU e CTRL+GIÙ.
Comprimere o espandere le classi usando l'icona in alto a destra di ogni forma.
Comprimere parti dell'albero facendo clic sul segno meno (-) nella parte inferiore di una classe di dominio.
Ereditarietà
Le classi di dominio possono essere definite usando l'ereditarietà. Per creare una derivazione di ereditarietà, fare clic sullo strumento Ereditarietà, fare clic sulla classe derivata e quindi sulla classe di base. Un elemento del modello ha tutte le proprietà definite nella propria classe di dominio, insieme a tutte le proprietà ereditate dalla classe base. Eredita anche i ruoli nelle relazioni.
L'ereditarietà può essere usata anche tra relazioni, forme e Connessione or. L'ereditarietà deve essere inclusa nello stesso gruppo. Una forma non può ereditare da una classe di dominio.
Relazioni di dominio
Gli elementi del modello possono essere collegati da relazioni. I collegamenti sono sempre binari; collegano esattamente due elementi. Tuttavia, qualsiasi elemento può avere molti collegamenti ad altri oggetti e può essere presente anche più di un collegamento tra la stessa coppia di elementi.
Proprio come è possibile definire classi diverse di elementi, è possibile definire classi diverse di collegamenti. La classe di un collegamento è detta relazione di dominio. Una relazione di dominio specifica le classi dell'elemento che le istanze possono connettersi. Ogni fine di una relazione viene chiamata ruolo e la relazione di dominio definisce i nomi per i due ruoli, nonché per la relazione stessa.
Esistono due tipi di relazioni di dominio: incorporamento di relazioni e relazioni di riferimento. Nel diagramma di definizione DSL le relazioni di incorporamento hanno linee solide in ogni ruolo e le relazioni di riferimento hanno linee tratteggiate.
Incorporamento di relazioni
Ogni elemento di un modello, ad eccezione della radice, è la destinazione di un collegamento di incorporamento. Di conseguenza, l'intero modello costituisce un singolo albero di collegamenti di incorporamento. Una relazione di incorporamento rappresenta il contenimento o la proprietà. Due elementi del modello correlati in questo modo sono noti anche come padre e figlio. L'elemento figlio viene detto essere incorporato nell'elemento padre.
I collegamenti di incorporamento non vengono in genere visualizzati in modo esplicito come connettori in un diagramma. Invece, sono in genere rappresentati dal contenimento. La radice del modello è rappresentata dal diagramma e gli elementi incorporati in esso vengono visualizzati come forme nel diagramma.
Nell'esempio la classe radice Musica ha una relazione di incorporamento Musica HasAlbums all'album, che include un oggetto AlbumHasSongs incorporato in Song. I brani vengono visualizzati come elementi in un elenco all'interno di ogni album. Musica include anche un Musica HasArtists di incorporamento alla classe Artist, le cui istanze vengono visualizzate anche come forme nel diagramma.
Per impostazione predefinita, gli elementi incorporati vengono eliminati automaticamente quando vengono eliminati i relativi elementi padre.
Quando un modello viene salvato in un file in formato XML, gli elementi incorporati vengono annidati all'interno dei rispettivi elementi padre, a meno che non sia stata personalizzata la serializzazione.
Nota
L'incorporamento è diverso dall'ereditarietà. Gli elementi figlio in una relazione di incorporamento non ereditano le proprietà dell'elemento padre. Un incorporamento è un tipo di collegamento tra gli elementi del modello. L'ereditarietà è una relazione tra classi e non crea collegamenti tra gli elementi del modello.
Regole di incorporamento
Ogni elemento in un modello di istanza deve essere la destinazione di un solo collegamento di incorporamento, ad eccezione della radice del modello.
Pertanto, ogni classe di dominio non astratta, ad eccezione della classe radice, deve essere la destinazione di almeno una relazione di incorporamento oppure deve ereditare un incorporamento da una classe di base. Una classe può essere la destinazione di due o più incorporamenti, ma i relativi elementi del modello di istanza possono avere un solo elemento padre alla volta. La molteplicità dalla destinazione all'origine deve essere 0...1 o 1..1.
In Esplora risorse viene visualizzato l'albero di incorporamento
La definizione DSL crea anche uno strumento di esplorazione, che gli utenti vedono insieme al diagramma del modello.
Lo strumento di esplorazione mostra tutti gli elementi del modello, anche quelli per i quali non sono state definite forme. Mostra elementi e relazioni di incorporamento, ma non relazioni di riferimento.
Per visualizzare i valori delle proprietà di dominio di un elemento, l'utente seleziona un elemento, nel diagramma del modello o in Esplora modelli e apre il Finestra Proprietà. Vengono visualizzate tutte le proprietà del dominio, incluse quelle non visualizzate nel diagramma. Nell'esempio ogni canzone ha sia un Titolo che un Genere, ma solo il valore del titolo viene visualizzato nel diagramma.
Relazioni di riferimento
Una relazione di riferimento rappresenta qualsiasi tipo di relazione che non viene incorporata.
Le relazioni di riferimento vengono in genere visualizzate in un diagramma come connettori tra forme.
Nella rappresentazione XML del modello, un collegamento di riferimento tra due elementi viene rappresentato tramite moniker. Ovvero, i moniker sono nomi che identificano in modo univoco ogni elemento nel modello. Il nodo XML per ogni elemento del modello contiene un nodo che specifica il nome della relazione e il moniker dell'altro elemento.
Ruoli
Ogni relazione di dominio ha due ruoli, un ruolo di origine e un ruolo di destinazione.
Nell'immagine seguente la riga tra la classe di dominio publisher e la relazione di dominio PublisherCatalog è il ruolo di origine. La riga tra la relazione di dominio e la classe di dominio Album è il ruolo di destinazione.
I nomi associati a una relazione sono particolarmente importanti quando si scrive codice di programma che attraversa il modello. Ad esempio, quando si compila la soluzione DSL, la classe generata Publisher dispone di una proprietà Catalog che è una raccolta di Album. La classe Album ha una proprietà Publisher che è una singola istanza della classe Publisher.
Quando si crea una relazione in una definizione DSL, ai nomi delle proprietà e delle relazioni vengono assegnati valori predefiniti. Tuttavia, è possibile modificarli.
Molteplicità
Le moltiplicazioni specificano il numero di elementi che possono avere lo stesso ruolo in una relazione di dominio. Nell'esempio, l'impostazione di molteplicità zero-a-molti (0..*) nel ruolo Catalogo specifica che qualsiasi istanza della classe di dominio del server di pubblicazione può avere il numero di collegamenti di relazione PublisherCatalog che si desidera assegnare.
Configurare la molteplicità di un ruolo digitando nel diagramma o modificando la Multiplicity
proprietà nella finestra Proprietà . Nella tabella seguente vengono descritte le impostazioni per questa proprietà.
Tipo di molteplicità | Descrizione |
---|---|
0..* (da zero a molti) | Ogni istanza della classe di dominio può avere più istanze della relazione o nessuna istanza della relazione. |
0..1 (da zero a uno) | Ogni istanza della classe di dominio non può avere più di un'istanza della relazione o nessuna istanza della relazione. |
1..1 (uno) | Ogni istanza della classe di dominio può avere un'istanza della relazione. Non è possibile creare più di un'istanza di questa relazione da qualsiasi istanza della classe del ruolo. Se la convalida è abilitata, viene visualizzato un errore di convalida quando un'istanza della classe del ruolo non ha alcuna istanza della relazione. |
1..* (uno a molti) | Ogni istanza della classe nel ruolo con questa molteplicità può avere più istanze della relazione e ogni istanza deve avere almeno un'istanza della relazione. Se la convalida è abilitata, viene visualizzato un errore di convalida quando un'istanza della classe del ruolo non ha alcuna istanza della relazione. |
Relazioni di dominio come classi
Un collegamento viene rappresentato nello Store come istanza di LinkElement, che è una classe derivata di ModelElement. È possibile definire queste proprietà nel diagramma del modello di dominio sulle relazioni tra domini.
È anche possibile creare una relazione come origine o destinazione di altre relazioni. Nel diagramma del modello di dominio fare clic con il pulsante destro del mouse sulla relazione di dominio e quindi scegliere Mostra come classe. Verrà visualizzata una casella di classe aggiuntiva. È quindi possibile connettersi alle relazioni.
È possibile definire una relazione in parte in base all'ereditarietà, proprio come è possibile con le classi di dominio. Selezionare la relazione derivata e impostare Relazione di base nel Finestra Proprietà.
Una relazione derivata è specializzata nella relazione di base. Le classi di dominio da cui è collegato devono essere derivate o uguali alle classi collegate dalla relazione di base. Quando viene creato un collegamento della relazione derivata in un modello, si tratta di un'istanza delle relazioni derivate e di base. Nel codice del programma è possibile passare alla fine opposta del collegamento usando le proprietà generate dalla base o dalla classe derivata.