Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Eine domänenspezifische Sprache (DSL) wird durch ihre DSL-Definitionsdatei zusammen mit jedem benutzerdefinierten Programmcode definiert, den Sie schreiben. Der Großteil des Programmcodes in der DSL-Lösung wird aus dieser Datei generiert.
In diesem Thema werden die zentralen Merkmale der DSL-Definition erläutert.
Die DSL-Definition
Wenn Sie öffnen Dsl\DslDefinition.dsl, ähnelt ihr Visual Studio-Fenster der folgenden Abbildung.
Die wichtigsten Informationen in der DSL-Definition werden im DSL-Definitionsdiagramm angezeigt. Zusätzliche Informationen, die auch Teil von DslDefinition.dsl sind, werden im DSL Explorer angezeigt, der in der Regel an der Seite des Diagramms angezeigt wird. Sie arbeiten mit dem Diagramm für die am häufigsten verwendeten Aufgaben und mit DSL Explorer für erweiterte Anpassungen.
Das DSL-Definitionsdiagramm zeigt die Domänenklassen, die Modellelemente definieren, und die Beziehungen, die Verknüpfungen zwischen Modellelementen definieren. Außerdem werden die Shapes und Verbinder angezeigt, die zum Anzeigen der Modellelemente für den Benutzer verwendet werden.
Wenn Sie ein Element in der DSL-Definition auswählen, entweder im Diagramm oder im DSL-Explorer, werden Informationen dazu im Eigenschaftenfenster angezeigt. Zusätzliche Informationen können im DSL-Detailfenster angezeigt werden.
Modelle sind Instanzen von DSLs
Ein Modell ist eine Instanz Ihres DSL, das von einem Benutzer erstellt wurde. Ein Modell enthält Modellelemente, bei denen es sich um Instanzen der domänenklassen handelt, die Sie definieren, und Verknüpfungen zwischen den Elementen, bei denen es sich um Instanzen der von Ihnen definierten Domänenbeziehungen handelt. Ein Modell kann auch Shapes und Verbinder aufweisen, mit denen die Modellelemente und Verknüpfungen in einem Diagramm angezeigt werden. Die DSL-Definition enthält die Shape-Klassen, Verbinderklassen und eine Klasse für das Diagramm.
Eine DSL-Definition wird auch als Domänenmodell bezeichnet. Eine DSL-Definition oder 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 Verknüpfungen zwischen den Elementen. Sie sind die Entwurfszeitdarstellung der Elemente und Links, die von den Benutzern der entwurfsspezifischen Sprache instanziiert werden, wenn sie ihre Modelle erstellen.
Diese Abbildung zeigt ein Modell, das vom Benutzer einer Musikbibliothek DSL erstellt wurde. Musikalben werden durch Kästchen dargestellt, die Listen von Songs enthalten. Künstler werden durch abgerundete Kästchen dargestellt und sind mit den Alben verbunden, zu denen sie beigetragen haben.
Die DSL-Definition trennt zwei Aspekte. Die Darstellung der Modellelemente im Modelldiagramm wird mithilfe von Shape-Klassen und Verbinderklassen definiert. Die im Modell übertragenen 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.
Die Abbildung zeigt vier Domänenklassen: Musik, Album, Künstler und Song. Die Domänenklassen definieren Domäneneigenschaften wie Name, Titel usw. Im Instanzmodell werden die Werte einiger dieser Eigenschaften im Diagramm angezeigt.
Zwischen den Klassen bestehen Domänenbeziehungen: MusicHasAlbums, MusicHasArtists, AlbumHasSongs und ArtistAppearedOnAlbums. Die Beziehungen haben Multiplicitäten wie 1...1, 0...*. Beispielsweise muss jeder Song mit genau einem Album über die AlbumHasSongs-Beziehung verknüpft sein. Jedes Album kann eine beliebige Anzahl von Songs haben.
Neuanordnen des DSL-Definitionsdiagramms
Beachten Sie, dass eine Domänenklasse mehrmals im DSL-Definitionsdiagramm angezeigt werden kann, wie das Album in diesem Bild tut. Es gibt immer eine Hauptansicht, und es können einige Referenzansichten vorhanden sein.
Um das DSL-Definitionsdiagramm neu anzuordnen, können Sie:
Tauschen Sie die Haupt- und Referenzansichten mithilfe der Befehle " Struktur hier herbringen " und " Struktur teilen " aus. Klicken Sie mit der rechten Maustaste auf eine einzelne Domänenklasse, um diese Befehle anzuzeigen.
Ordnen Sie die Domänenklassen und Shape-Klassen erneut an, indem Sie STRG+NACH-OBEN und STRG+NACH-UNTEN drücken.
Reduzieren oder Erweitern von Klassen mithilfe des Symbols oben rechts in jeder Form.
Reduzieren Sie Teile der Struktur, indem Sie unten in einer Domänenklasse auf das Minuszeichen (-) klicken.
Vererbung
Domänenklassen können mithilfe der Vererbung definiert werden. Um eine Vererbungsableitung zu erstellen, klicken Sie auf das Vererbungstool, klicken Sie auf die abgeleitete Klasse und dann auf die Basisklasse. Ein Modellelement verfügt über alle Eigenschaften, die in einer eigenen Domänenklasse definiert sind, zusammen mit allen von der Basisklasse geerbten Eigenschaften. Es übernimmt auch seine Rollen in Beziehungen.
Vererbung kann auch zwischen Beziehungen, Formen und Verbindungen verwendet werden. Die Vererbung muss innerhalb derselben Gruppe beibehalten werden. Ein Shape kann nicht von einer Domänenklasse erben.
Domänenbeziehungen
Modellelemente können durch Beziehungen verknüpft werden. Verknüpfungen sind immer binär; sie verknüpfen genau zwei Elemente. Jedes Element kann jedoch viele Verknüpfungen zu anderen Objekten haben, und es kann sogar mehrere Verknüpfungen zwischen demselben Elementpaar geben.
Ebenso wie Sie unterschiedliche Klassen von Elementen definieren können, können Sie unterschiedliche Verknüpfungsklassen definieren. Die Klasse eines Links wird als Domänenbeziehung bezeichnet. Eine Domänenbeziehung gibt an, welche Klassen von Elementen ihre Instanzen verbinden können. Jedes Ende einer Beziehung wird als Rolle 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: Einbetten von Beziehungen und Referenzbeziehungen. Im DSL-Definitionsdiagramm weisen Einbettungsbeziehungen an jeder Rolle durchgezogene Linien auf, und Referenzbeziehungen weisen gestrichelte Linien auf.
Einbetten von Beziehungen
Jedes Element in einem Modell mit Ausnahme des Stammelements ist das Ziel eines einbettenden Links. Daher bildet das gesamte Modell einen einzigen Baum von Einbettungs-Links. Eine Einbettungsbeziehung stellt Einschluss oder Eigentum dar. Zwei Modellelemente, die auf diese Weise verknüpft sind, werden auch als Eltern und Kind bezeichnet. Es heißt, dass das Kind im Elternteil eingebettet ist.
Einbettungsverknüpfungen werden in der Regel nicht explizit als Verbinder in einem Diagramm angezeigt. Stattdessen werden sie in der Regel durch Eindämmung dargestellt. Der Stamm des Modells wird durch das Diagramm dargestellt, und darin eingebettete Elemente werden als Formen im Diagramm angezeigt.
Im Beispiel hat die Stammklasse "Music" eine Einbettungsbeziehung "MusicHasAlbums zu Album", die eine Einbettung "AlbumHasSongs zu Song" aufweist. Songs werden als Elemente in einer Liste innerhalb jedes Albums angezeigt. Musik enthält auch ein Embedding namens MusicHasArtists zur Artist-Klasse, deren Instanzen ebenfalls als Formen im Diagramm dargestellt werden.
Eingebettete Elemente werden standardmäßig automatisch gelöscht, wenn ihre übergeordneten Elemente gelöscht werden.
Wenn ein Modell als XML-Datei gespeichert wird, werden eingebettete Elemente in übergeordnete Elemente geschachtelt, es sei denn, Sie haben die Serialisierung angepasst.
Hinweis
Das Einbetten ist nicht identisch mit der Vererbung. Kind-Elemente in einer Einbettungsbeziehung erben nicht die Eigenschaften des übergeordneten Elements. Eine Einbettung ist eine Art von Verknüpfung zwischen Modellelementen. Vererbung ist eine Beziehung zwischen Klassen und erstellt keine Verknüpfungen zwischen Modellelementen.
Einbettungsregeln
Jedes Element in einem Instanzmodell muss das Ziel genau eines Einbettungslinks sein, mit Ausnahme des Stamms des Modells.
Daher muss jede nicht abstrakte Domänenklasse mit Ausnahme der Stammklasse das Ziel mindestens einer Einbettungsbeziehung sein, oder sie muss eine Einbettung von einer Basisklasse erben. Eine Klasse kann das Ziel von zwei oder mehr Einbettungen sein, aber ihre Instanzmodellelemente können jeweils nur ein übergeordnetes Element haben. Die Multiplikation von Ziel zu Quelle muss 0..1 oder 1..1 sein.
Im Explorer wird der Einbettungsbaum angezeigt.
Ihre DSL-Definition erstellt auch einen Explorer, den Benutzer zusammen mit ihrem Modelldiagramm sehen.
Im Explorer werden alle Elemente im Modell angezeigt, auch die Elemente, für die Sie keine Shapes definiert haben. Es zeigt Elemente und Einbettungsbeziehungen an, aber keine Referenzbeziehungen.
Um die Werte der Domäneneigenschaften eines Elements anzuzeigen, wählt der Benutzer ein Element aus, entweder im Modelldiagramm oder im Modell-Explorer, und öffnet das Eigenschaftenfenster. Es werden alle Domäneneigenschaften angezeigt, einschließlich der Domäneneigenschaften, die nicht im Diagramm angezeigt werden. Im Beispiel hat jeder Song sowohl einen Titel als auch ein Genre, aber nur der Wert des Titels wird im Diagramm angezeigt.
Referenzbeziehungen
Eine Referenzbeziehung stellt jede Art von Beziehung dar, die nicht eingebettet wird.
Referenzbeziehungen werden in der Regel in einem Diagramm als Verbinder zwischen Shapes angezeigt.
In der XML-Darstellung des Modells wird eine Verweisverknüpfung zwischen zwei Elementen mithilfe von Monikern dargestellt. Das heißt, Moniker sind Namen, die jedes Element 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 Zeile zwischen der Publisher-Domänenklasse und der PublisherCatalog-Domänenbeziehung die Quellrolle. Die Zeile zwischen der Domänenbeziehung und der Albumdomänenklasse ist die Zielrolle.
Die Namen, die einer Beziehung zugeordnet sind, sind besonders wichtig, wenn Sie Programmcode schreiben, der das Modell durchläuft. Wenn Sie beispielsweise die DSL-Lösung erstellen, verfügt die generierte Klasse Publisher über einen Eigenschaftenkatalog, der eine Sammlung von Alben ist. Die Klasse Album hat eine Eigenschaft namens Publisher, die eine einzelne Instanz der Klasse Publisher ist.
Wenn Sie eine Beziehung in einer DSL-Definition erstellen, erhalten die Eigenschafts- und Beziehungsnamen Standardwerte. Sie können sie jedoch ändern.
Multiplizitäten
Multiplicities geben an, wie viele Elemente dieselbe Rolle in einer Domänenbeziehung haben können. Im Beispiel gibt die Multiplizitätseinstellung 0..* in der Rolle des Katalogs an, dass jede Instanz der Publisher-Domänenklasse beliebig viele PublisherCatalog-Beziehungslinks aufweisen kann, wie Sie möchten.
Konfigurieren Sie die Multiplikation einer Rolle, indem Sie entweder das Diagramm eingeben oder die Multiplicity Eigenschaft im Eigenschaftenfenster ändern. In der folgenden Tabelle werden die Einstellungen für diese Eigenschaft beschrieben.
| Multiplikationstyp | Description |
|---|---|
| 0..*(Null bis viele) | Jede Instanz der Domänenklasse kann mehrere Instanzen der Beziehung oder keine Instanzen der Beziehung aufweisen. |
| 0..1 (Null bis 1) | Jede Instanz der Domänenklasse kann nicht mehr als eine Instanz der Beziehung oder keine Instanzen der Beziehung aufweisen. |
| 1..1 (eins) | Jede Instanz der Domänenklasse kann eine Instanz der Beziehung haben. Sie können nicht mehr als eine Instanz dieser Beziehung aus einer Instanz der Rollenklasse erstellen. Wenn die Überprüfung aktiviert ist, wird ein Überprüfungsfehler angezeigt, wenn eine Instanz der Rollenklasse keine Instanz der Beziehung aufweist. |
| 1..* (1 bis n) | Jede Instanz der Klasse für die Rolle, die über diese Multiplizität verfügt, kann mehrere Instanzen der Beziehung besitzen, und jede Instanz muss mindestens eine Instanz der Beziehung haben. Wenn die Überprüfung aktiviert ist, wird ein Überprüfungsfehler angezeigt, wenn eine Instanz der Rollenklasse keine Instanz der Beziehung aufweist. |
Domänenbeziehungen als Klassen
Eine Verknüpfung wird im Store als Instanz von LinkElement dargestellt, bei der es sich um eine abgeleitete Klasse von ModelElement handelt. Sie können diese Eigenschaften im Domänenmodelldiagramm für Domänenbeziehungen definieren.
Sie können auch eine Beziehung zur Quelle oder zum Ziel anderer Beziehungen machen. Klicken Sie im Domänenmodelldiagramm mit der rechten Maustaste auf die Domänenbeziehung, und klicken Sie dann auf " Als Klasse anzeigen". Es wird ein zusätzliches Klassenfeld angezeigt. Anschließend können Sie Beziehungen damit verbinden.
Sie können eine Beziehung teilweise durch Vererbung definieren, genau wie bei Domänenklassen. Wählen Sie die abgeleitete Beziehung aus, und legen Sie die Basisbeziehung im Eigenschaftenfenster fest.
Eine abgeleitete Beziehung ist auf ihre Basisbeziehung spezialisiert. Die Domänenklassen, mit denen sie verknüpft werden sollen, sollten von den Klassen abgeleitet sein oder identisch mit den Klassen sein, die durch die Basisbeziehung verknüpft werden. Wenn eine Verknüpfung der abgeleiteten Beziehung in einem Modell erstellt wird, handelt es sich um eine Instanz der abgeleiteten und der Basisbeziehungen. Im Programmcode können Sie mithilfe der von der Basis oder der abgeleiteten Klasse generierten Eigenschaften zum entgegengesetzten Ende des Links navigieren.