Udostępnij za pośrednictwem


Opis modeli, klas i relacji

Język specyficzny dla domeny (DSL) jest definiowany przez jego plik definicji DSL wraz z dowolnym niestandardowym kodem programu, który można napisać. Większość kodu programu w rozwiązaniu DSL jest generowana na podstawie tego pliku.

W tym temacie opisano centralne funkcje definicji DSL.

Definicja DSL

Po otwarciu Dsl\DslDefinition.dslokna programu Visual Studio będzie wyglądać podobnie jak na poniższej ilustracji.

dsl designer

Najważniejsze informacje w definicji DSL są wyświetlane na diagramie definicji DSL. Dodatkowe informacje, które są również częścią rozszerzenia DslDefinition.dsl, są wyświetlane w Eksploratorze DSL, który zwykle pojawia się po stronie diagramu. Możesz pracować z diagramem dla najczęściej wykonywanych zadań oraz z Eksploratorem DSL w celu uzyskania bardziej zaawansowanych dostosowań.

Diagram definicji DSL przedstawia klasy domeny definiujące elementy modelu oraz relacje definiujące łącza między elementami modelu. Przedstawia również kształty i łączniki używane do wyświetlania elementów modelu użytkownikowi.

dsl designer with swimlane

Po wybraniu elementu w definicji DSL na diagramie lub w Eksploratorze DSL informacje o nim są wyświetlane w okno Właściwości. Dodatkowe informacje mogą być wyświetlane w oknie Szczegóły DSL.

Modele to wystąpienia list DSL

Model to wystąpienie środowiska DSL utworzone przez użytkownika. Model zawiera elementy modelu, które są wystąpieniami zdefiniowanych klas domeny i łączami między elementami, które są wystąpieniami zdefiniowanych relacji domeny. Model może również zawierać kształty i łączniki, które wyświetlają elementy modelu i linki na diagramie. Definicja DSL zawiera klasy kształtów, klasy łączników i klasę dla diagramu.

Definicja DSL jest również nazywana modelem domeny. Definicja DSL lub model domeny to reprezentacja języka specyficznego dla domeny w czasie projektowania, natomiast model jest wystąpieniem języka specyficznego dla domeny w czasie wykonywania.

Klasy domeny definiują elementy modelu

Klasy domen są używane do tworzenia różnych elementów w domenie, a relacje domeny są łączami między elementami. Są one reprezentacją w czasie projektowania elementów i linków, które zostaną utworzone przez użytkowników języka specyficznego dla projektu podczas tworzenia modeli.

Na tej ilustracji przedstawiono model, który został utworzony przez użytkownika biblioteki muzycznej DSL. Albumy muzyczne są reprezentowane przez pola zawierające listy piosenek. Artyści są reprezentowani przez okrągłe pudełka i są połączone z albumami, do których się przyczynili.

Instance model of generated DSL

Definicja DSL oddziela dwa aspekty. Wygląd elementów modelu na diagramie modelu jest definiowany przy użyciu klas kształtów i klas łączników. Informacje przenoszone w modelu są definiowane przy użyciu klas domen i relacji domeny.

Poniższa ilustracja przedstawia klasy domen i relacje w definicji DSL biblioteki muzycznej.

Embedding and Reference relationships

Ilustracja przedstawia cztery klasy domen: Muzyka, Album, Artysta i Piosenka. Klasy domen definiują właściwości domeny, takie jak Nazwa, Tytuł itd. W modelu wystąpienia wartości niektórych z tych właściwości są wyświetlane na diagramie.

Między klasami znajdują się relacje domeny: MusicHasAlbums, MusicHasArtists, AlbumbHasSongs i ArtistAppearedOnAlbums. Relacje mają mnożenie, takie jak 1..1, 0..*. Na przykład każda piosenka musi być powiązana z dokładnie jednym albumem za pośrednictwem relacji AlbumHasSongs. Każdy album może mieć dowolną liczbę piosenek.

Zmienianie układu diagramu definicji DSL

Zwróć uwagę, że klasa domeny może pojawić się kilka razy na diagramie definicji DSL, jak to robi album na tej ilustracji. Zawsze jest jeden widok główny i może istnieć kilka widoków referencyjnych .

Aby zmienić rozmieszczenie diagramu definicji DSL, możesz:

  • Zamień widoki główne i referencyjne przy użyciu poleceń Bring Tree Here i Split Tree . Kliknij prawym przyciskiem myszy pojedynczą klasę domeny, aby wyświetlić te polecenia.

  • Zmień kolejność klas domen i klas kształtów, naciskając klawisze Ctrl+Up i Ctrl+Down.

  • Zwiń lub rozwiń klasy przy użyciu ikony w prawym górnym rogu każdego kształtu.

  • Zwiń części drzewa, klikając znak minus (-) w dolnej części klasy domeny.

Dziedziczenie

Klasy domen można definiować przy użyciu dziedziczenia. Aby utworzyć wyprowadzenie dziedziczenia, kliknij narzędzie Dziedziczenie, kliknij klasę pochodną, a następnie kliknij klasę bazową. Element modelu ma wszystkie właściwości zdefiniowane we własnej klasie domeny wraz ze wszystkimi właściwościami dziedziczone z klasy bazowej. Dziedziczy również swoje role w relacjach.

Dziedziczenie może być również używane między relacjami, kształtami i Połączenie or. Dziedziczenie musi pozostać w tej samej grupie. Kształt nie może dziedziczyć z klasy domeny.

Relacje domeny

Elementy modelu mogą być połączone relacjami. Łącza są zawsze binarne; łączą dokładnie dwa elementy. Jednak każdy element może mieć wiele linków do innych obiektów, a nawet może istnieć więcej niż jedno łącze między tą samą parą elementów.

Podobnie jak można zdefiniować różne klasy elementów, można zdefiniować różne klasy łączy. Klasa łącza jest nazywana relacją domeny. Relacja domeny określa klasy elementu, z którymi mogą się łączyć jego wystąpienia. Każdy koniec relacji jest nazywany rolą, a relacja domeny definiuje nazwy dwóch ról, a także dla samej relacji.

Istnieją dwa rodzaje relacji domeny: osadzanie relacji i relacji referencyjnych. Na diagramie definicji DSL relacje osadzania mają linie stałe w każdej roli, a relacje odwołania mają linie przerywane.

Osadzanie relacji

Każdy element w modelu, z wyjątkiem katalogu głównego, jest elementem docelowym jednego linku osadzania. W związku z tym cały model tworzy pojedyncze drzewo osadzania łączy. Relacja osadzania reprezentuje zawieranie lub własność. Dwa elementy modelu powiązane w ten sposób są również nazywane elementami nadrzędnymi i podrzędnym. Mówi się, że dziecko jest osadzone w rodzicu.

Łącza osadzania nie są zwykle wyświetlane jawnie jako łączniki na diagramie. Zamiast tego są one zwykle reprezentowane przez zawieranie. Katalog główny modelu jest reprezentowany przez diagram, a elementy osadzone w nim są wyświetlane jako kształty na diagramie.

W tym przykładzie główna klasa Music ma osadzaną relację MusicHasAlbums do albumu, która ma osadzony albumHasSongs do song. Utwory są wyświetlane jako elementy na liście wewnątrz każdego albumu. Muzyka ma również osadzanie MusicHasArtists w klasie Artist, której wystąpienia są również wyświetlane jako kształty na diagramie.

Domyślnie osadzone elementy są automatycznie usuwane po usunięciu ich elementów nadrzędnych.

Gdy model jest zapisywany w pliku w postaci XML, osadzone elementy są zagnieżdżone wewnątrz ich elementów nadrzędnych, chyba że dostosowano serializacji.

Uwaga

Osadzanie nie jest takie samo jak dziedziczenie. Elementy podrzędne w relacji osadzania nie dziedziczą właściwości elementu nadrzędnego. Osadzanie to typ połączenia między elementami modelu. Dziedziczenie jest relacją między klasami i nie tworzy łączy między elementami modelu.

Reguły osadzania

Każdy element w modelu wystąpienia musi być elementem docelowym dokładnie jednego linku osadzania, z wyjątkiem katalogu głównego modelu.

W związku z tym każda nie abstrakcyjna klasa domeny, z wyjątkiem klasy głównej, musi być obiektem docelowym co najmniej jednej relacji osadzania lub musi dziedziczyć osadzanie z klasy bazowej. Klasa może być obiektem docelowym co najmniej dwóch osadzonych elementów, ale jej elementy modelu wystąpienia mogą mieć tylko jeden element nadrzędny naraz. Wielokrotność wartości docelowej do źródła musi mieć wartość 0..1 lub 1..1.

W Eksploratorze jest wyświetlane drzewo osadzania

Definicja DSL tworzy również eksploratora, który użytkownicy widzą obok diagramu modelu.

Generated explorer of DSL

W eksploratorze są wyświetlane wszystkie elementy modelu, nawet te, dla których nie zdefiniowano żadnych kształtów. Przedstawia elementy i osadzanie relacji, ale nie odwołuje się do relacji.

Aby wyświetlić wartości właściwości domeny elementu, użytkownik wybiera element w diagramie modelu lub w Eksploratorze modeli i otwiera okno Właściwości. Wyświetla wszystkie właściwości domeny, w tym te, które nie są wyświetlane na diagramie. W tym przykładzie każda piosenka ma zarówno tytuł, jak i gatunek, ale na diagramie jest wyświetlana tylko wartość Tytułu.

Relacje odwołań

Relacja referencyjna reprezentuje wszelkiego rodzaju relacje, które nie są osadzaniem.

Relacje referencyjne są zwykle wyświetlane na diagramie jako łączniki między kształtami.

W reprezentacji XML modelu link odwołania między dwoma elementami jest reprezentowany przy użyciu elementów monikers. Oznacza to, że nazwy monikers są unikatowo identyfikujące każdy element w modelu. Węzeł XML dla każdego elementu modelu zawiera węzeł, który określa nazwę relacji i pseudonim innego elementu.

Role

Każda relacja domeny ma dwie role, rolę źródłową i rolę docelową.

Na poniższej ilustracji wiersz między klasą domeny wydawcy a relacją domeny PublisherCatalog jest rolą źródłową. Linia między relacją domeny a klasą domeny Album jest rolą docelową.

Roles and properties.

Nazwy skojarzone z relacją są szczególnie ważne podczas pisania kodu programu przechodzącego przez model. Na przykład podczas kompilowania rozwiązania DSL wygenerowana klasa Publisher ma katalog właściwości, który jest kolekcją albumów. Klasa Album ma właściwość Publisher, która jest pojedynczym wystąpieniem klasy Publisher.

Podczas tworzenia relacji w definicji DSL właściwości i nazwy relacji otrzymują wartości domyślne. Można je jednak zmienić.

Mnożenie

Mnożenie określa, ile elementów może mieć tę samą rolę w relacji domeny. W tym przykładzie ustawienie wielościeżkowości od zera do wielu (0..*) w roli Katalogu określa, że każde wystąpienie klasy domeny wydawcy może mieć tyle linków relacji PublisherCatalog, ile chcesz nadać.

Skonfiguruj wielość roli, wpisując na diagramie lub modyfikując Multiplicity właściwość w oknie Właściwości . W poniższej tabeli opisano ustawienia tej właściwości.

Typ wielodostępności opis
0..* (zero do wielu) Każde wystąpienie klasy domeny może mieć wiele wystąpień relacji lub brak wystąpień relacji.
0..1 (zero do jednego) Każde wystąpienie klasy domeny nie może mieć więcej niż jednego wystąpienia relacji lub nie ma żadnych wystąpień relacji.
1..1 (Jeden) Każde wystąpienie klasy domeny może mieć jedno wystąpienie relacji. Nie można utworzyć więcej niż jednego wystąpienia tej relacji z dowolnego wystąpienia klasy roli. Jeśli walidacja jest włączona, zostanie wyświetlony błąd weryfikacji, gdy dowolne wystąpienie klasy roli nie ma wystąpienia relacji.
1..* (jeden do wielu) Każde wystąpienie klasy w roli, która ma tę wielokrotność, może mieć wiele wystąpień relacji, a każde wystąpienie musi mieć co najmniej jedno wystąpienie relacji. Jeśli walidacja jest włączona, zostanie wyświetlony błąd weryfikacji, gdy dowolne wystąpienie klasy roli nie ma wystąpienia relacji.

Relacje domeny jako klasy

Link jest reprezentowany w magazynie jako wystąpienie elementu LinkElement, które jest klasą pochodną ModeluElement. Te właściwości można zdefiniować na diagramie modelu domeny w relacjach domeny.

Możesz również utworzyć relację jako źródło lub element docelowy innych relacji. Na diagramie modelu domeny kliknij prawym przyciskiem myszy relację domeny, a następnie kliknij polecenie Pokaż jako klasę. Zostanie wyświetlone dodatkowe pole klasy. Następnie możesz połączyć relacje z nimi.

Relację można zdefiniować częściowo według dziedziczenia, tak jak w przypadku klas domen. Wybierz relację pochodną i ustaw relację podstawową w okno Właściwości.

Relacja pochodna specjalizuje swoją podstawową relację. Klasy domeny, z których łączy się, powinny pochodzić lub takie same jak klasy połączone przez relację podstawową. Po utworzeniu połączenia relacji pochodnej w modelu jest to wystąpienie zarówno relacji pochodnych, jak i podstawowych. W kodzie programu można przejść do przeciwległego końca łącza przy użyciu właściwości wygenerowanych przez bazę lub klasę pochodną.