Freigeben über


Grundlagen von Modellen, Klassen und Beziehungen

Eine domänenspezifische Sprache (DSL) wird durch ihre DSL-Definitionsdatei sowie beliebigen benutzerdefinierten Programmcode definiert, den Sie möglicherweise schreiben. Der Großteil des Programmcodes in der DSL-Projektmappe wird aus dieser Datei generiert.

In diesem Thema werden die zentralen Features der DSL-Definition erläutert.

DSL-Definition

Wenn Sie die Datei Dsl\DslDefinition.dsl öffnen, sieht Ihr Visual Studio-Fenster in etwa wie in der folgenden Abbildung dargestellt aus.

dsl designer

Die wichtigsten Informationen in der DSL-Definition werden im DSL-Definitionsdiagramm angezeigt. Zusätzliche Informationen, die ebenfalls Teil der Datei „DslDefinition.dsl“ sind, werden im DSL-Explorer angezeigt, der normalerweise neben dem Diagramm angeordnet ist. Die häufigsten Aufgaben führen Sie mithilfe des Diagramms aus, und im DSL-Explorer können Sie erweiterte Anpassungen vornehmen.

Das DSL-Definitionsdiagramm zeigt die Domänenklassen, durch die Modellelemente definiert werden, und die Beziehungen, die Links bzw. Verknüpfungen zwischen Modellelementen definieren. Außerdem zeigt es die Formen und Verbinder, mit denen die Modellelemente für den Benutzer angezeigt werden.

dsl designer with swimlane

Wenn Sie im Diagramm oder im DSL-Explorer ein Element in der DSL-Definition auswählen, werden im Eigenschaftenfenster Informationen zu diesem Element angezeigt. Weitere Informationen können im Fenster „DSL-Details“ angezeigt werden.

Modelle sind Instanzen von DSLs.

Ein Modell ist eine von einem Benutzer erstellte Instanz Ihrer DSL. Ein Modell enthält Modellelemente, die Instanzen der von Ihnen definierten Domänenklassen sind, und Links zwischen den Elementen, bei denen es sich um Instanzen der von Ihnen definierten Domänenbeziehungen handelt. Ein Modell kann auch Formen und Verbinder enthalten, die die Modellelemente und Links in einem Diagramm darstellen. Die DSL-Definition enthält die Formklassen, Verbinderklassen und eine Klasse für das Diagramm.

Eine DSL-Definition wird auch als Domänenmodell bezeichnet. Eine DSL-Definition bzw. ein Domänenmodell ist die Entwurfszeitdarstellung der domänenspezifischen Sprache, während das Modell die Laufzeitinstanziierung der domänenspezifischen Sprache ist.

Domänenklassen definieren Modellelemente

Domänenklassen werden verwendet, um die verschiedenen Elemente in der Domäne zu erstellen, und Domänenbeziehungen sind die Links zwischen den Elementen. Sie sind die Entwurfszeitdarstellung der Elemente und Links, die von den Benutzern der domänenspezifischen Sprache instanziiert wird, wenn sie ihre Modelle erstellen.

Die folgende Abbildung zeigt ein Modell, das vom Benutzer einer Musikbibliotheks-DSL erstellt wurde. Musikalben werden durch Felder dargestellt, die Listen mit Songs enthalten. Künstler werden durch Felder mit abgerundeten Ecken dargestellt und sind mit den Alben verbunden, an denen sie mitgewirkt haben.

Instance model of generated DSL

Die DSL-Definition trennt zwei Aspekte. Die Darstellung der Modellelemente im Modelldiagramm wird mithilfe von Formklassen und Verbinderklassen definiert. Die im Modell enthaltenen Informationen werden mithilfe von Domänenklassen und Domänenbeziehungen definiert.

Die folgende Abbildung zeigt die Domänenklassen und -beziehungen in der DSL-Definition der Musikbibliothek.

Embedding and Reference relationships

Die Abbildung zeigt vier Domänenklassen: „Music“, „Album“, „Artist“ und „Song“. Die Domänenklassen definieren Domäneneigenschaften wie „Name“, „Title“ usw. Im Instanzmodell werden die Werte einiger dieser Eigenschaften im Diagramm angezeigt.

Zwischen den Klassen befinden sich Domänenbeziehungen: MusicHasAlbums, MusicHasArtists, AlbumbHasSongs und ArtistAppearedOnAlbums. Die Beziehungen weisen Multiplizitäten wie 1..1 oder 0..* auf. Beispielsweise muss jeder Song über die Beziehung AlbumHasSongs mit genau einem Album verknüpft sein. Jedes Album kann eine beliebige Anzahl von Songs enthalten.

Neuanordnen des DSL-Definitionsdiagramms

Beachten Sie, dass eine Domänenklasse mehrmals im DSL-Definitionsdiagramm erscheinen kann (wie in dieser Abbildung die Klasse „Album“). Es gibt immer eine Hauptansicht, und es können mehrere Referenzansichten vorhanden sein.

Sie können das DSL-Definitionsdiagramm wie folgt neu anordnen:

  • Tauschen Sie Haupt- und Referenzansichten mithilfe der Befehle Baum hier einfügen und Baum teilen. Klicken Sie mit der rechten Maustaste auf eine einzelne Domänenklasse, um diese Befehle anzuzeigen.

  • Ordnen Sie die Domänen- und Formklassen neu an, indem Sie STRG+NACH-OBEN und STRG+NACH-UNTEN drücken.

  • Reduzieren oder erweitern Sie Klassen mithilfe des Symbols oben rechts in jeder Form.

  • Reduzieren Sie Teile des Baums, indem Sie auf das Minuszeichen (-) unten in einer Domänenklasse klicken.

Vererbung

Domänenklassen können mithilfe der Vererbung definiert werden. Wählen Sie zum Erstellen einer Vererbungsableitung das Tool „Vererbung“ aus, klicken Sie auf die abgeleitete Klasse und dann auf die Basisklasse. Ein Modellelement verfügt über alle Eigenschaften, die für seine eigene Domänenklasse definiert sind, sowie alle von der Basisklasse geerbten Eigenschaften. Es erbt auch seine Rollen in Beziehungen.

Die Vererbung kann auch zwischen Beziehungen, Formen und Verbindern verwendet werden. Sie ist nur innerhalb derselben Gruppe möglich. Eine Form kann nicht von einer Domänenklasse erben.

Domänenbeziehungen

Modellelemente können durch Beziehungen verknüpft werden. Links sind immer binär, d. h. sie verknüpfen genau zwei Elemente. Jedes Element kann jedoch viele Links zu anderen Objekten aufweisen, und es kann sogar mehrere Links zwischen demselben Elementpaar geben.

Ebenso wie Sie verschiedene Klassen von Elementen definieren können, können Sie auch verschiedene Klassen von Links definieren. Die Klasse eines Links wird als Domänenbeziehung bezeichnet. Eine Domänenbeziehung gibt an, welche Elementklassen ihre Instanzen verbinden können. Die Enden einer Beziehung werden als Rollen bezeichnet, und die Domänenbeziehung definiert Namen für die beiden Rollen sowie für die Beziehung selbst.

Es gibt zwei Arten von Domänenbeziehungen: Embedding Relationships und Verweisbeziehungen. Im DSL-Definitionsdiagramm werden Embedding Relationships durch durchgehende Linien für jede Rolle dargestellt und Verweisbeziehungen durch gestrichelte Linien.

Embedding Relationships

Mit Ausnahme des Modellstamms ist jedes Element in einem Modell das Ziel eines Einbettungslinks. Daher bildet das gesamte Modell einen einzelnen Baum von Einbettungslinks. Eine Embedding Relationship stellt eine Einschluss- oder Besitzbeziehung dar. Zwei Modellelemente, die auf diese Weise verknüpft sind, werden auch als übergeordnete und untergeordnete Elemente bezeichnet. Das untergeordnete Element ist in das übergeordnete Element eingebettet.

Einbettungslinks werden in der Regel nicht explizit als Verbinder in einem Diagramm angezeigt. Stattdessen werden sie meist durch Einschluss bzw. Kapselung dargestellt. Der Stamm des Modells wird durch das Diagramm dargestellt, und darin eingebettete Elemente werden als Formen im Diagramm angezeigt.

Im Beispiel verfügt die Stammklasse „Music“ über eine Embedding Relationship „MusicHasAlbums“ mit der Domänenklasse „Album“, die eine Embedding Relationship „AlbumHasSongs“ mit der Domänenklasse „Song“ aufweist. Songs werden als Elemente in einer Liste innerhalb jedes Albums angezeigt. „Music“ verfügt zudem über eine Embedding Relationship „MusicHasArtists“ mit der Klasse „Artist“, deren Instanzen auch als Formen im Diagramm angezeigt werden.

Standardmäßig werden eingebettete Elemente automatisch gelöscht, wenn ihre übergeordneten Elemente gelöscht werden.

Wenn ein Modell in einer Datei im XML-Format gespeichert wird, werden eingebettete Elemente in ihren übergeordneten Elementen geschachtelt, sofern Sie die Serialisierung nicht angepasst haben.

Hinweis

Einbettung ist nicht identisch mit Vererbung. Untergeordnete Elemente in einer Embedding Relationship erben nicht die Eigenschaften des übergeordneten Elements. Eine Einbettung ist eine Art von Link zwischen Modellelementen. Vererbung ist eine Beziehung zwischen Klassen. Sie erzeugt keine Links zwischen Modellelementen.

Einbettungsregeln

Mit Ausnahme des Modellstamms muss jedes Element in einem Instanzmodell das Ziel von genau einem Einbettungslink sein.

Daher muss jede nicht abstrakte Domänenklasse mit Ausnahme der Stammklasse das Ziel von mindestens einer Embedding Relationship sein oder eine Einbettung von einer Basisklasse erben. Eine Klasse kann das Ziel von zwei oder mehr Embedding Relationships sein, aber ihre Instanzmodellelemente können jeweils nur ein übergeordnetes Element haben. Die Multiplizität zwischen Ziel und Quelle muss 0..1 oder 1..1 sein.

Einbettungsstruktur im Explorer

Durch Ihre DSL-Definition wird auch ein Explorer erstellt, den Benutzer neben ihrem Modelldiagramm sehen.

Generated explorer of DSL

Der Explorer zeigt alle Elemente im Modell, auch diejenigen, für die Sie keine Formen definiert haben. Er zeigt Elemente und Embedding Relationships, aber keine Verweisbeziehungen.

Zum Anzeigen der Werte der Domäneneigenschaften eines Elements wählt der Benutzer im Modelldiagramm oder Modell-Explorer ein Element aus und öffnet das Eigenschaftenfenster. In diesem Fenster werden alle Domäneneigenschaften angezeigt, auch diejenigen, die nicht im Diagramm dargestellt werden. Im Beispiel verfügt jeder Song über die Eigenschaften „Title“ und „Genre“, im Diagramm wird aber nur der Wert von „Title“ angezeigt.

Verweisbeziehungen

Eine Verweisbeziehung stellt jede Art von Beziehung dar, bei der es sich nicht um eine Einbettung handelt.

Verweisbeziehungen werden in einem Diagramm üblicherweise als Verbinder zwischen Formen angezeigt.

In der XML-Darstellung des Modells wird ein Verweislink zwischen zwei Elementen mithilfe von Monikern dargestellt. Moniker sind also Namen, die die einzelnen Elemente im Modell eindeutig identifizieren. Der XML-Knoten für jedes Modellelement enthält einen Knoten, der den Namen der Beziehung und den Moniker des anderen Elements angibt.

Rollen

Jede Domänenbeziehung verfügt über zwei Rollen – eine Quellrolle und eine Zielrolle.

In der folgenden Abbildung ist die Linie zwischen der Domänenklasse Publisher und der Domänenbeziehung PublisherCatalog die Quellrolle. Die Linie zwischen der Domänenbeziehung und der Domänenklasse Album ist die Zielrolle.

Roles and properties.

Die einer Beziehung zugeordneten Namen sind besonders dann wichtig, wenn Sie Programmcode schreiben, der das Modell durchläuft. Wenn Sie die DSL-Projektmappe erstellen, verfügt die generierte Klasse „Publisher“ beispielsweise über eine Eigenschaft „Catalog“, bei der es sich um eine Auflistung von Alben handelt. Die Klasse „Album“ verfügt über eine Eigenschaft „Publisher“, die eine einzelne Instanz der Klasse „Publisher“ ist.

Wenn Sie in einer DSL-Definition eine Beziehung erstellen, werden den Eigenschafts- und Beziehungsnamen Standardwerte zugewiesen. Sie können diese Standardwerte jedoch ändern.

Multiplizitäten

Multiplizitäten geben an, wie viele Elemente in einer Domänenbeziehung die gleiche Rolle haben können. Im Beispiel gibt die Multiplizitätseinstellung „null bis n“ (0..*) der Rolle Catalog an, dass jede Instanz der Domänenklasse Publisher über beliebig viele Beziehungslinks PublisherCatalog verfügen kann.

Konfigurieren Sie die Multiplizität einer Rolle, indem Sie sie im Diagramm eingeben oder die Multiplicity-Eigenschaft im Fenster Eigenschaften ändern. In der folgenden Tabelle werden die Einstellungen für diese Eigenschaft beschrieben.

Multiplizitätstyp BESCHREIBUNG
0..* (null bis n) Jede Instanz der Domänenklasse kann mehrere Instanzen der Beziehung oder keine Instanzen der Beziehung aufweisen.
0..1 (null bis eins) Jede Instanz der Domänenklasse kann höchstens eine Instanz der Beziehung oder keine Instanzen der Beziehung aufweisen.
1..1 (eins) Jede Instanz der Domänenklasse kann eine Instanz der Beziehung aufweisen. Sie können für jede Instanz der Rollenklasse nur eine Instanz dieser Beziehung erstellen. Wenn die Validierung aktiviert ist, wird ein Validierungsfehler angezeigt, wenn eine Instanz der Rollenklasse keine Instanz der Beziehung aufweist.
1..* (eins bis n) Jede Instanz der Rollenklasse mit dieser Multiplizität kann mehrere Instanzen der Beziehung aufweisen, und jede Instanz muss über mindestens eine Instanz der Beziehung verfügen. Wenn die Validierung aktiviert ist, wird ein Validierungsfehler angezeigt, wenn eine Instanz der Rollenklasse keine Instanz der Beziehung aufweist.

Domänenbeziehungen als Klassen

Ein Link wird im Speicher als Instanz von LinkElement dargestellt, einer abgeleiteten Klasse von ModelElement. Sie können diese Eigenschaften im Domänenmodelldiagramm für Domänenbeziehungen definieren.

Sie können eine Beziehung auch als Quelle oder Ziel anderer Beziehungen festlegen. Klicken Sie im Domänenmodelldiagramm mit der rechten Maustaste auf die Domänenbeziehung, und klicken Sie dann auf Als Klasse anzeigen. Ein zusätzliches Klassenfeld wird angezeigt. Anschließend können Sie Beziehungen damit verbinden.

Wie bei Domänenklassen können Sie eine Beziehung teilweise durch Vererbung definieren. Wählen Sie die abgeleitete Beziehung aus, und legen Sie im Eigenschaftenfenster Basisbeziehung fest.

Eine abgeleitete Beziehung spezialisiert ihre Basisbeziehung. Die von ihr verknüpften Domänenklassen sollten mit den von der Basisbeziehung verknüpften Klassen identisch oder von ihnen abgeleitet sein. Wenn in einem Modell ein Link der abgeleiteten Beziehung erstellt wird, handelt es sich dabei um eine Instanz der abgeleiteten Beziehung und der Basisbeziehung. Im Programmcode können Sie mithilfe der Eigenschaften, die von der Basisklasse oder der abgeleiteten Klasse generiert werden, zum anderen Ende des Links navigieren.