Udostępnij za pośrednictwem


Definiowanie języka specyficznego dla domeny

Aby zdefiniować język specyficzny dla domeny (DSL), należy utworzyć rozwiązanie programu Visual Studio na podstawie szablonu. Kluczową częścią rozwiązania jest diagram definicji DSL, który jest przechowywany w pliku DslDefinition.dsl. Definicja DSL definiuje klasy i kształty DSL. Po zmodyfikowaniu i dodaniu do tych elementów można dodać kod programu, aby bardziej szczegółowo dostosować rozszerzenie DSL.

Jeśli dopiero zaczynasz korzystać z listy DSL, zalecamy pracę z laboratorium DSL Tools Lab, które można znaleźć w tej witrynie: Wizualizacja i zestaw SDK modelowania

Wybieranie rozwiązania szablonu

Aby zdefiniować rozszerzenie DSL, należy zainstalować następujące składniki:

  • Visual Studio
  • Obciążenie programistyczne rozszerzenia programu Visual Studio (w tym zestaw Visual Studio SDK)
  • Zestaw SDK modelowania (zainstaluj go jako pojedynczy składnik w programie Visual Studio)

Uwaga

Składnik Przekształcanie szablonu tekstu jest automatycznie instalowany w ramach obciążenia programistycznego rozszerzenia programu Visual Studio. Można go również zainstalować na karcie Poszczególne składniki Instalator programu Visual Studio w kategorii Zestawy SDK, biblioteki i struktury. Zainstaluj składnik Zestawu SDK modelowania na karcie Poszczególne składniki.

Aby utworzyć nowy język specyficzny dla domeny, należy utworzyć nowe rozwiązanie programu Visual Studio przy użyciu szablonu projektu Języka specyficznego dla domeny.

Aby utworzyć rozwiązanie DSL

  1. Utwórz nowy projekt języka specyficznego dla domeny.

    Zostanie otwarty Kreator języka specyficznego dla domeny i zostanie wyświetlona lista rozwiązań DSL szablonu.

  2. Kliknij każdy szablon, aby wyświetlić opis. Wybierz rozwiązanie, które najbardziej przypomina to, co chcesz utworzyć.

    Każdy szablon DSL definiuje podstawową działającą platformę DSL. Zmodyfikujesz to rozszerzenie DSL, aby dopasować je do własnych wymagań.

    Kliknij każdy przykład, aby uzyskać więcej informacji.

    • Wybierz pozycję Przepływ zadań, aby utworzyć platformę DSL zawierającą pływaki. Pływaki są pionowymi lub poziomymi partycjami diagramu.

    • Wybierz pozycję Modele składników, aby utworzyć bibliotekę DSL zawierającą porty. Porty to małe kształty na krawędzi większego kształtu.

    • Wybierz pozycję Diagramy klas, aby zdefiniować rozszerzenie DSL z kształtami przedziału. Kształty przedziału zawierają listy elementów.

    • Wybierz pozycję Minimalny język w innych przypadkach lub jeśli nie masz pewności.

    • Wybierz pozycję Minimalny projektant WinForm lub minimalny projektant WPF, aby utworzyć rozszerzenie DSL wyświetlane na powierzchni Windows Forms lub WPF. Musisz napisać kod, aby zdefiniować edytor. Aby uzyskać więcej informacji, zobacz następujące tematy:

      Tworzenie języka specyficznego dla domeny opartego na modelu Windows Forms

      Tworzenie języka specyficznego dla domeny opartego na podsystemie WPF

  3. Wprowadź rozszerzenie nazwy pliku dla rozszerzenia DSL na odpowiedniej stronie kreatora. Jest to rozszerzenie, które będzie używane przez pliki zawierające wystąpienia rozszerzenia DSL.

    • Wybierz rozszerzenie nazwy pliku, które nie jest skojarzone z żadną aplikacją na komputerze lub na dowolnym komputerze, na którym chcesz zainstalować rozszerzenie DSL. Na przykład dokument i htm byłyby niedopuszczalne rozszerzenia nazw plików.

    • Kreator wyświetli ostrzeżenie, jeśli wprowadzone rozszerzenie jest używane jako rozszerzenie DSL. Rozważ użycie innego rozszerzenia nazwy pliku. Możesz również zresetować wystąpienie eksperymentalne zestawu VISUAL Studio SDK, aby wyczyścić starych projektantów eksperymentalnych. W menu Start systemu Windows wpisz resetuj program Visual Studio, a następnie uruchom polecenie Resetuj wystąpienie eksperymentalne programu Microsoft Visual Studio zgodne z wersją programu Visual Studio.

  4. Możesz dostosować ustawienia na innych stronach lub pozostawić wartości domyślne.

  5. Kliknij przycisk Zakończ.

    Kreator tworzy rozwiązanie zawierające dwa lub trzy projekty i generuje kod z definicji DSL.

    Interfejs użytkownika przypomina teraz poniższą ilustrację.

    projektant dsl

    To rozwiązanie definiuje język specyficzny dla domeny. Aby uzyskać więcej informacji, zobacz Omówienie interfejsu użytkownika narzędzi językowych specyficznych dla domeny.

Testowanie rozwiązania

Rozwiązanie szablonu zapewnia działającą bibliotekę DSL, którą można modyfikować lub używać w takiej postaci.

Aby przetestować rozwiązanie, naciśnij F5 lub CTRL+F5. Nowe wystąpienie programu Visual Studio zostanie otwarte w trybie eksperymentalnym.

W nowym wystąpieniu programu Visual Studio w Eksplorator rozwiązań otwórz przykładowy plik. Zostanie otwarty jako diagram z przybornikiem.

Jeśli uruchomisz rozwiązanie utworzone na podstawie szablonu Języka minimalnego, eksperymentalny program Visual Studio będzie wyglądać podobnie do następującego przykładu:

Przykładowe drzewo języka specyficznego dla domeny w programie Visual Studio

Eksperymentuj z narzędziami. Utwórz elementy i połącz je.

Zamknij eksperymentalne wystąpienie programu Visual Studio.

Uwaga

Po zmodyfikowaniu rozszerzenia DSL nie będzie już można wyświetlić kształtów w przykładowym pliku testowym. Można jednak utworzyć nowe elementy.

Modyfikowanie szablonu DSL

Zmień nazwę i zachowaj niektóre lub wszystkie klasy domeny i klasy kształtów w definicji DSL szablonu. Nowe nazwy klas powinny być prawidłowymi nazwami CLR bez spacji ani znaków interpunkcyjnych.

Szczególnie przydatne jest zachowanie tych klas:

  • Klasa główna jest wyświetlana w lewym górnym rogu diagramu definicji DSL w obszarze Klasy i relacje. Zmień nazwę na inną niż DSL. Na przykład dsL o nazwie MusicLibrary może mieć klasę główną o nazwie Music.

  • Klasa diagramu jest wyświetlana w prawym dolnym rogu diagramu definicji DSL w kolumnie Elementy diagramu. Może być konieczne przewinięcie w prawo, aby go zobaczyć. Zazwyczaj nosi nazwę YourDslDiagram.

  • Jeśli użyto szablonu przepływu zadań i chcesz utworzyć diagramy z pływakami, zachowaj i zmień nazwę klasy domeny aktora i kształtu ActorSwimlane.

    Usuń lub zmień nazwy innych klas zgodnie z wymaganiami.

Wzorce do definiowania języka DSL

Zalecamy opracowanie rozszerzenia DSL przez dodanie lub dostosowanie jednej lub dwóch funkcji naraz. Dodaj funkcję, uruchom rozszerzenie DSL i przetestuj ją, a następnie dodaj co najmniej jedną funkcję. Typową funkcją dsl może być:

  • Klasa domeny, relacja osadzania, która łączy element z modelem, kształt wymagany do wyświetlania elementów tej klasy na diagramie i narzędzie elementu, które umożliwia użytkownikom tworzenie elementów.

  • Właściwości domeny klasy domeny i dekoratory, które wyświetlają je na kształcie.

  • Relacja referencyjna i łącznik, który wyświetla go na diagramie i narzędziu łącznika, które umożliwia użytkownikom tworzenie linków.

  • Dostosowanie, które wymaga kodu programu, takiego jak ograniczenie poprawności lub polecenie menu.

    W poniższych sekcjach opisano sposób konstruowania najbardziej przydatnych rodzajów funkcji DSL. Istnieje wiele innych wzorców, za pomocą których można skonstruować język DSL, ale są one najczęściej używane.

Uwaga

Po dodaniu funkcji nie zapomnij kliknąć pozycję Przekształć wszystkie szablony na pasku narzędzi Eksplorator rozwiązań przed skompilowanie i uruchomieniem rozszerzenia DSL.

Na poniższej ilustracji przedstawiono klasy i relacje części DSL, która jest używana jako przykład w tym temacie.

Osadzanie i relacje odwołań

Następnego rysunku przedstawiono przykładowy model tego rozszerzenia DSL:

Model wystąpienia wygenerowanego języka DSL

Uwaga

"Model" odnosi się do wystąpienia rozszerzenia DSL tworzonego przez użytkowników i zazwyczaj jest wyświetlany jako diagram. W tym temacie omówiono zarówno diagram definicji DSL, jak i diagramy modelu, które są wyświetlane podczas użycia rozszerzenia DSL.

Definiowanie klas domeny

Klasy domeny reprezentują koncepcje dsl. Wystąpienia są elementami modelu. Na przykład w języku MusicLibrary DSL mogą istnieć klasy domen o nazwach Album i Song.

Aby utworzyć klasę domeny, możesz przeciągnąć z narzędzia Nazwana klasa domeny do diagramu, a następnie zmienić nazwę klasy.

Aby uzyskać więcej informacji, zobacz Właściwości klas domeny.

Tworzenie relacji osadzania dla każdej klasy domeny

Każda klasa domeny z wyjątkiem klasy głównej musi być elementem docelowym co najmniej jednej relacji osadzania lub musi dziedziczyć z klasy, która jest celem osadzonej relacji.

W modelu każdy element modelu jest węzłem w jednym drzewie osadzania relacji. Źródło i element docelowy relacji osadzania są często określane jako element nadrzędny i podrzędny.

Wybór elementu nadrzędnego dla klasy domeny zależy od tego, jak mają być zależne okresy istnienia jego elementów od innych elementów. Jeśli węzeł drzewa zostanie usunięty, jego drzewo podrzędne jest zwykle usuwane. Klasy elementów, które mają niezależne istnienie, są więc osadzone bezpośrednio pod klasą główną.

Zazwyczaj jeśli element jest wyświetlany wewnątrz innego elementu, chcesz wskazać relację właściciela. W takim przypadku najbardziej odpowiednią klasą nadrzędną jest klasa kontenera. Wyjątek występuje, gdy element widoczny wewnątrz kontenera jest w rzeczywistości tylko linkiem odwołania do niezależnego elementu. W takim przypadku usunięcie kontenera spowoduje usunięcie odwołania, ale nie jego obiektu docelowego.

W wzorcach definicji DSL opisanych w tym temacie zakładamy, że elementy wyświetlane wewnątrz kontenera zostaną usunięte po usunięciu kontenera. Możliwe są bardziej złożone schematy i można je osiągnąć, definiując reguły.

Jak jest wyświetlany element Klasa nadrzędna (osadzanie) Przykład w szablonie rozwiązania DSL
Kształt na diagramie.

Pływak.
Klasa główna DSL. Minimalny język.

Przepływ zadań: klasa Aktor.
Kształt w toru. Klasa domeny elementów, które są wyświetlane jako pływaki. Przepływ zadania: klasa zadania.
Element na liście w kształcie, w którym element jest usuwany, jeśli kontener zostanie usunięty.

Port na krawędzi kształtu.
Klasa domeny mapowana na kształt kontenera. Diagram klas: Klasa atrybutu.

Diagram składników: klasa portów.
Element na liście, a nie usunięty, jeśli kontener zostanie usunięty. Klasa główna DSL.

Na liście są wyświetlane linki referencyjne.
Nie są wyświetlane bezpośrednio. Klasa, której stanowi część.

W przykładzie Biblioteki muzycznej albumy są wyświetlane jako prostokąty, w których są wyświetlane tytuły utworów. W związku z tym element nadrzędny albumu jest główną klasą Music, a element nadrzędny song to Album.

Aby utworzyć klasę domeny i jej osadzanie w tym samym czasie, kliknij narzędzie Osadzanie relacji , a następnie kliknij klasę nadrzędną, a następnie kliknij pustą część diagramu.

Zwykle nie jest konieczne dostosowanie nazwy relacji osadzania i jej ról, ponieważ będą one śledzić nazwy klas automatycznie.

Aby uzyskać więcej informacji, zobacz Właściwości relacji domeny i właściwości ról domeny.

Uwaga

Osadzanie nie jest takie samo jak dziedziczenie. Dzieci w relacji osadzania nie dziedziczą funkcji od rodziców.

Dodawanie właściwości domeny do każdej klasy domeny

Właściwości domeny przechowują wartości. Przykłady to: Nazwa, Tytuł, Data publikacji.

Kliknij pozycję Właściwości domeny w klasie, naciśnij ENTER, a następnie wpisz nazwę właściwości. Domyślnym typem właściwości domeny jest Ciąg. Jeśli chcesz zmienić typ, wybierz właściwość domeny i ustaw typ w oknie Właściwości . Jeśli żądany typ nie znajduje się na liście rozwijanej, zobacz Dodawanie typów właściwości.

Ustaw właściwość Nazwa elementu. Wybierz właściwość domeny, która może służyć do identyfikowania elementów w Eksploratorze języków. Na przykład w klasie domeny Song możesz wybrać właściwość Domena Tytuł. W oknie Właściwości ustaw wartość Is Element Name na true.

Tworzenie pochodnych klas domen

Jeśli chcesz, aby klasa domeny miała warianty dziedziczone jej właściwości i relacje, utwórz klasy, które pochodzą z niej. Na przykład Album może mieć klasy pochodne WMA i MP3.

Utwórz klasę pochodną przy użyciu narzędzia Klasa domeny.

Kliknij narzędzie Dziedziczenie, kliknij klasę pochodną, a następnie kliknij klasę bazową.

Rozważ ustawienie modyfikatora dziedziczenia klasy bazowej na abstrakcyjne. Jeśli uważasz, że może być potrzebne wystąpienia klasy bazowej, rozważ utworzenie dla nich oddzielnej klasy pochodnej.

Klasy pochodne dziedziczą właściwości i role swoich klas bazowych.

Uporządkowanie diagramu definicji DSL

Po dodaniu relacji niektóre klasy będą wyświetlane w więcej niż jednym miejscu. Aby zmniejszyć liczbę wystąpień i zwiększyć rozmiar diagramu, kliknij prawym przyciskiem myszy klasę docelową relacji, a następnie kliknij polecenie Bring Tree Here (Przynieś drzewo tutaj). Aby uzyskać odwrotny efekt, kliknij prawym przyciskiem myszy klasę docelową relacji, a następnie kliknij pozycję Split Tree (Podziel drzewo). Jeśli te polecenia menu nie są widoczne, upewnij się, że wybrano tylko klasę domeny.

Użyj CTRL+Up i CTRL+Down, aby przenieść klasy domeny i klasy kształtów.

Testowanie klas domen

Aby przetestować nowe klasy domen
  1. Kliknij pozycję Przekształć wszystkie szablony na pasku narzędzi Eksplorator rozwiązań, aby wygenerować kod projektanta DSL. Ten krok można zautomatyzować. Aby uzyskać więcej informacji, zobacz Jak zautomatyzować przekształcanie wszystkich szablonów.

  2. Skompiluj i uruchom rozszerzenie DSL. Naciśnij F5 lub CTRL+F5, aby uruchomić nowe wystąpienie programu Visual Studio w trybie eksperymentalnym. W eksperymentalnym wystąpieniu programu Visual Studio otwórz lub utwórz plik z rozszerzeniem nazwy pliku DSL.

  3. Otwórz Eksploratora. Po stronie diagramu znajduje się okno eksploratora języka, które zazwyczaj nosi nazwę YourLanguage Explorer. Jeśli to okno nie jest widoczne, może to być na karcie poniżej Eksplorator rozwiązań. Jeśli nie możesz go znaleźć, w menu Widok wskaż pozycję Inny system Windows, a następnie kliknij pozycję Eksploratora language.

    Eksplorator przedstawia widok drzewa modelu.

  4. Utwórz nowe elementy. Kliknij prawym przyciskiem myszy węzeł główny u góry, a następnie kliknij polecenie Dodaj nowąklasę YourClass.

    W Eksploratorze języka zostanie wyświetlone nowe wystąpienie klasy.

  5. Sprawdź, czy każde wystąpienie ma inną nazwę podczas tworzenia nowych wystąpień. Taka sytuacja będzie występować tylko wtedy, gdy dla właściwości domeny ustawiono flagę Is, Nazwa elementu.

  6. Sprawdź właściwości domeny. Po wybraniu wystąpienia klasy, sprawdź okno Właściwości. Powinny zostać wyświetlone właściwości domeny zdefiniowane w tej klasie domeny.

  7. Zapisz plik, zamknij go i otwórz go ponownie. Wszystkie utworzone wystąpienia powinny być widoczne w eksploratorze po rozwinięciu węzłów.

Definiowanie kształtów na diagramie

Można zdefiniować klasy elementów, które są wyświetlane na diagramie jako prostokąty, wielokropek lub ikony.

Aby zdefiniować klasę elementów, które są wyświetlane jako kształty na diagramie

  1. Zdefiniuj i przetestuj klasę domeny zgodnie z opisem w temacie Definiowanie klas domen .

    • Element nadrzędny klasy powinien być klasą główną. Oznacza to, że powinna istnieć relacja osadzania między klasą główną a nową klasą domeny.

    • Jeśli diagram zawiera pływaki, element nadrzędny może być klasą domeny mapowana na pływak. Przed kontynuowaniem tej procedury zobacz Definiowanie dsL, który ma pływaki.

  2. Dodaj klasę kształtu, aby reprezentować elementy na diagramie modelu. Przeciągnij z jednego z następujących narzędzi do diagramu definicji DSL:

    • Kształt geometryczny zapewnia prostokąt lub wielokropek.

    • Kształt obrazu wyświetla obraz, który zostanie wyświetlony.

    • Kształt przedziału to prostokąt zawierający co najmniej jedną listę elementów.

      Zmień nazwę klasy kształtu, która będzie wyświetlana po prawej stronie diagramu definicji DSL w obszarze Kształty i łączniki.

  3. Zdefiniuj obraz, jeśli utworzono kształt obrazu.

    1. Utwórz plik obrazu o dowolnym rozmiarze. Obsługiwane są formaty BMP, JPEG, GIF i EMF.

    2. W Eksplorator rozwiązań dodaj plik do rozwiązania w obszarze Dsl\Resources.

    3. Wróć do diagramu definicji DSL i wybierz nową klasę kształtu obrazu.

    4. W okno Właściwości kliknij właściwość Image.

    5. W oknie dialogowym Wybieranie obrazu kliknij menu rozwijane w obszarze Nazwa pliku i wybierz obraz.

  4. Dodaj dekoratory tekstu do kształtu, aby wyświetlić właściwości domeny.

    Aby wyświetlić nazwę lub tytuł elementu modelu, prawdopodobnie będzie potrzebny co najmniej jeden dekorator tekstu.

    Kliknij prawym przyciskiem myszy nagłówek klasy kształtu, wskaż polecenie Dodaj, a następnie kliknij polecenie Dekorator tekstu. Ustaw nazwę dekoratora, a w okno Właściwości ustaw jego pozycję.

  5. Połącz każdy kształt z mapą elementu diagramu z klasą domeny, która powinna być wyświetlana.

    Kliknij narzędzie Mapa elementu diagramu, a następnie kliknij klasę domeny, a następnie kliknij klasę kształtu.

  6. Zamapuj właściwości na dekoratory tekstu.

    1. Wybierz szarą linię między klasą domeny a klasą kształtu reprezentującą mapę elementu diagramu.

    2. W oknie Szczegóły DSL kliknij kartę Mapy dekoratora. Jeśli nie widzisz okna Szczegóły DSL, w menu Widok wskaż pozycję Inny system Windows, a następnie kliknij pozycję Szczegóły DSL. Często trzeba podnieść górną część tego okna, aby wyświetlić całą jego zawartość.

    3. Wybierz nazwę dekoratora. W obszarze Właściwość wyświetlania wybierz nazwę właściwości klasy domeny. Powtórz to dla każdego dekoratora.

      Jeśli chcesz wyświetlić właściwość powiązanego elementu, kliknij nawigator drzewa rozwijanego w obszarze Ścieżka, aby wyświetlić właściwość.

    4. Upewnij się, że obok każdej nazwy dekoratora jest wyświetlany znacznik wyboru.

      Okno Mapowania kształtów i szczegóły DSL

  7. Utwórz element przybornika do tworzenia elementów klasy domeny.

    1. W Eksploratorze DSL rozwiń węzeł Edytor i wszystkie jego węzły podrzędne.

    2. Kliknij prawym przyciskiem myszy węzeł w obszarze Karty przybornika , które mają taką samą nazwę jak rozszerzenie DSL, na przykład MusicLibrary. Kliknij pozycję Dodaj narzędzie elementu.

      Uwaga

      Jeśli klikniesz prawym przyciskiem myszy węzeł Narzędzia , nie zobaczysz pozycji Dodaj narzędzie elementu. Zamiast tego kliknij węzeł nad nim.

    3. W okno Właściwości z wybranym nowym narzędziem elementu ustaw pozycję Klasa na ostatnio dodaną klasę domeny.

    4. Ustaw podpis i etykietkę narzędzia.

    5. Ustaw ikonę przybornika na ikonę, która będzie wyświetlana w przyborniku. Można ustawić ją na nową ikonę lub ikonę, która jest już używana dla innego narzędzia.

      Aby utworzyć nową ikonę, otwórz plik Dsl\Resources w Eksplorator rozwiązań. Skopiuj i wklej jeden z istniejących plików BMP narzędzia elementu. Zmień nazwę wklejonej kopii, a następnie kliknij dwukrotnie, aby ją edytować.

      Wróć do diagramu definicji DSL, wybierz narzędzie, a następnie w okno Właściwości kliknij pozycję [...] w obszarze Ikona przybornika. W oknie dialogowym Wybieranie mapy bitowej wybierz plik .BMP z menu rozwijanego.

    Aby uzyskać więcej informacji, zobacz Właściwości kształtów geometrycznych i właściwości kształtów obrazu.

Aby przetestować kształty

  1. Kliknij pozycję Przekształć wszystkie szablony na pasku narzędzi Eksplorator rozwiązań, aby wygenerować kod projektanta DSL.

  2. Skompiluj i uruchom rozszerzenie DSL. Naciśnij F5 lub CTRL+F5, aby uruchomić nowe wystąpienie programu Visual Studio w trybie eksperymentalnym. W eksperymentalnym wystąpieniu programu Visual Studio otwórz lub utwórz plik z rozszerzeniem nazwy pliku DSL.

  3. Sprawdź, czy narzędzia elementów są wyświetlane w przyborniku.

  4. Utwórz kształty , przeciągając je z narzędzia do diagramu modelu.

  5. Sprawdź, czy każdy dekorator tekstu jest wyświetlany i czy:

    1. Można go edytować, chyba że ustawiono flagę Is UI Read Only (Tylko do odczytu interfejsu użytkownika) we właściwości domeny.

    2. Podczas edytowania właściwości w okno Właściwości lub w dekoratorze drugi widok jest aktualizowany.

    Po pierwszym przetestowaniu kształtu warto dostosować jego właściwości i dodać bardziej zaawansowane funkcje. Aby uzyskać więcej informacji, zobacz Dostosowywanie i rozszerzanie języka specyficznego dla domeny.

Definiowanie relacji odwołań

Relację referencyjną można zdefiniować między dowolną klasą domeny źródłowej a dowolną docelową klasą domeny. Relacje referencyjne są zwykle wyświetlane na diagramie jako łączniki, które są liniami między kształtami.

Jeśli na przykład albumy muzyczne i artyści są wyświetlane jako kształty na diagramie, można zdefiniować relację o nazwie ArtistsAppearedOnAlbums, która łączy artystów z albumami, na których pracowali. Zobacz przykład na rysunku.

Model wystąpienia wygenerowanego języka DSL

Relacje referencyjne mogą również łączyć elementy tego samego typu. Na przykład w języku DSL reprezentującym drzewo rodzinne relacja między rodzicami a ich dziećmi jest relacją referencyjną od Osoby do osoby.

Definiowanie relacji referencyjnej

Kliknij narzędzie Relacja odwołania, a następnie kliknij klasę domeny źródłowej relacji, a następnie kliknij docelową klasę domeny. Klasa docelowa może być taka sama jak klasa źródłowa.

Każda relacja ma dwie role reprezentowane przez wiersz po każdej stronie pola relacji. Możesz wybrać każdą rolę i ustawić jej właściwości w okno Właściwości.

Rozważ zmianę nazw ról. Na przykład w relacji między osobami i osobami możesz zmienić domyślne nazwy na Rodzice i Dzieci, Menedżer i Podwładni, Nauczyciel i Student itd.

Dostosuj mnożenie każdej roli, jeśli jest to konieczne. Jeśli chcesz, aby każda osoba miała co najwyżej jeden menedżer, ustaw wielościeżność wyświetlaną poniżej etykiety Menedżer na diagramie na wartość 0..1.

Dodaj właściwości domeny do relacji. Na rysunku relacja Artist-Album ma właściwość roli.

Ustaw właściwość Zezwalaj na duplikaty relacji, jeśli istnieje więcej niż jeden link tej samej klasy między tą samą parą elementów modelu. Na przykład możesz zezwolić nauczycielowi na nauczanie więcej niż jednego tematu dla tego samego ucznia.

Mapy kształtów dla łączników

Aby uzyskać więcej informacji, zobacz Właściwości relacji domeny i właściwości ról domeny.

Definiowanie łącznika do wyświetlania relacji

Łącznik wyświetla linię między dwoma kształtami na diagramie modelu.

Przeciągnij narzędzie Łącznik na diagram definicji DSL.

Dodaj dekoratory tekstu, jeśli chcesz wyświetlić etykiety na łączniku. Ustaw swoje pozycje. Aby umożliwić użytkownikowi przeniesienie dekoratora tekstu, ustaw jego właściwość Is Moveable .

Użyj narzędzia Mapa elementu diagramu, aby połączyć łącznik z relacją referencyjną.

Po wybraniu mapy elementu diagramu otwórz okno Szczegóły DSL i otwórz kartę Mapy dekoratora.

Wybierz każdą dekorator i ustaw właściwość Display na prawidłową właściwość domeny.

Upewnij się, że obok każdego elementu na liście Decorators jest wyświetlany znacznik wyboru.

Definiowanie narzędzia konstruktora połączeń

W oknie Eksplorator DSL rozwiń węzeł Edytor i wszystkie jego podwęźle.

Kliknij prawym przyciskiem myszy węzeł o tej samej nazwie co rozszerzenie DSL, a następnie kliknij polecenie Dodaj nowe narzędzie połączenia.

Po wybraniu nowego narzędzia w okno Właściwości:

  • Ustaw podpis i etykietkę narzędzia.

  • Kliknij pozycję Konstruktor połączeń i wybierz odpowiedniego konstruktora dla nowej relacji.

  • Ustaw ikonę przybornika na ikonę, którą chcesz wyświetlić w przyborniku. Można ustawić ją na nową ikonę lub ikonę, która jest już używana dla innego narzędzia.

    Aby utworzyć nową ikonę, otwórz plik Dsl\Resources w Eksplorator rozwiązań. Skopiuj i wklej jeden z istniejących plików BMP narzędzia elementu. Zmień nazwę wklejonej kopii, a następnie kliknij dwukrotnie, aby ją edytować.

    Wróć do diagramu definicji DSL, wybierz narzędzie, a następnie w okno Właściwości kliknij pozycję [...] w obszarze Ikona przybornika. W oknie dialogowym Wybieranie mapy bitowej wybierz plik .BMP z menu rozwijanego.

Aby przetestować relację referencyjną i łącznik
  1. Kliknij pozycję Przekształć wszystkie szablony na pasku narzędzi Eksplorator rozwiązań, aby wygenerować kod projektanta DSL.

  2. Skompiluj i uruchom rozszerzenie DSL. Naciśnij F5 lub CTRL+F5, aby uruchomić nowe wystąpienie programu Visual Studio w trybie eksperymentalnym. W eksperymentalnym wystąpieniu programu Visual Studio otwórz lub utwórz plik z rozszerzeniem nazwy pliku DSL.

  3. Sprawdź, czy narzędzie połączenia jest wyświetlane w przyborniku.

  4. Utwórz kształty , przeciągając je z narzędzia do diagramu modelu.

  5. Utwórz połączenia między kształtami. Kliknij narzędzie łącznika, kliknij kształt, a następnie kliknij inny kształt.

  6. Sprawdź, czy nie można tworzyć połączeń między nieodpowiednimi klasami. Jeśli na przykład relacja znajduje się między albumami i artystami, sprawdź, czy nie możesz połączyć artystów z artystami.

  7. Sprawdź, czy mnożenie jest poprawne. Na przykład sprawdź, czy nie można połączyć osoby z więcej niż jednym menedżerem.

  8. Sprawdź, czy każdy dekorator tekstu jest wyświetlany i czy:

    1. Można go edytować, chyba że ustawiono flagę Is UI Read Only (Tylko do odczytu interfejsu użytkownika) we właściwości domeny.

    2. Podczas edytowania właściwości w okno Właściwości lub w dekoratorze drugi widok jest aktualizowany.

    Po pierwszym przetestowaniu łącznika warto dostosować jego właściwości i dodać bardziej zaawansowane funkcje. Aby uzyskać więcej informacji, zobacz Dostosowywanie i rozszerzanie języka specyficznego dla domeny.

Definiowanie kształtów zawierających listy: kształty przedziału

Kształt przedziału zawiera co najmniej jedną listę elementów. Na przykład w bibliotece muzycznej DSL można użyć kształtów przedziałów do reprezentowania albumów muzycznych. W każdym albumie znajduje się lista piosenek.

Kształt przedziału

W najprostszej metodzie osiągnięcia tego efektu w definicji DSL należy zdefiniować jedną klasę domeny dla kontenera i jedną klasę domeny dla każdej listy. Klasa kontenera jest mapowana na kształt przedziału.

Mapa kształtów

Aby uzyskać więcej informacji, zobacz Właściwości kształtów przedziału.

Aby zdefiniować kształt przedziału

  1. Utwórz klasę domeny kontenera. Kliknij narzędzie Osadzanie relacji, kliknij klasę główną modelu, a następnie kliknij pustą część diagramu definicji DSL. Spowoduje to utworzenie klasy domeny o nazwie Album na przykładzie.

    Alternatywnie zamiast osadzania w klasie głównej można osadzić kontener w klasie domeny, która jest mapowana na pływak.

    Dodaj właściwość domeny, taką jak Name do klasy, i ustaw flagę Is Element Name w okno Właściwości.

  2. Utwórz klasę domeny elementu listy. Kliknij narzędzie Osadzanie relacji, kliknij klasę kontenera (Album), a następnie kliknij pustą część diagramu. Spowoduje to utworzenie klasy domeny o nazwie Song na przykładzie.

    Dodaj właściwość domeny, taką jak Title do klasy, i ustaw flagę Is Element Name .

    Dodaj inne właściwości domeny.

    Dodaj kolejną klasę domeny elementu listy dla każdej listy, którą chcesz wyświetlić.

  3. Aby mieszać kilka typów elementów na liście, utwórz klasy dziedziczone z klasy listy. Ustaw klasę listy jako abstrakcyjną, ustawiając modyfikator dziedziczenia.

    Jeśli na przykład chcesz, aby muzyka klasyczna została posortowana przez kompozytora zamiast artysty, możesz utworzyć dwie podklasy Song, ClassicSong i NonClassicalSong.

  4. Utwórz kształt przedziału. Przeciągnij z narzędzia Kształt przedziału na diagram definicji DSL.

    Dodaj dekorator tekstu i ustaw jego nazwę.

    Dodaj przedział i ustaw jego nazwę.

  5. Aby umożliwić użytkownikowi ukrycie przedziałów listy, kliknij prawym przyciskiem myszy klasę kształtu przedziału, wskaż polecenie Dodaj, a następnie kliknij polecenie Rozwiń/Zwiń dekorator. W okno Właściwości ustaw pozycję dekoratora.

  6. Kliknij narzędzie Mapa elementu diagramu, kliknij klasę domeny kontenera, a następnie kliknij kształt przedziału.

  7. Wybierz link mapy elementu diagramu między klasą domeny a kształtem. W oknie Szczegóły DSL:

    1. Kliknij kartę Dekoratory . Kliknij nazwę dekoratora, a następnie wybierz odpowiedni element w obszarze Właściwość wyświetlana. Upewnij się, że obok nazwy dekoratora jest wyświetlany znacznik wyboru.

    2. Kliknij kartę Mapy przedziałów.

      Kliknij nazwę przedziału.

      W obszarze Wyświetlana ścieżka kolekcji elementów przejdź do klasy elementu listy (Song). Kliknij strzałkę listy rozwijanej, aby użyć narzędzia nawigatora.

      W obszarze Właściwość wyświetlania wybierz właściwość, która ma być wyświetlana na liście. W tym przykładzie jest to Tytuł.

Uwaga

Korzystając z pól Ścieżka w polach mapy dekoratora i przedziału, można tworzyć bardziej złożone relacje między klasami domeny a kształtem przedziału.

Aby zdefiniować narzędzie do tworzenia kształtu

  1. Utwórz element przybornika do tworzenia elementów klasy domeny.

  2. W Eksploratorze DSL rozwiń węzeł Edytor i wszystkie jego węzły podrzędne.

  3. Kliknij prawym przyciskiem myszy węzeł w obszarze Karty przybornika , które mają taką samą nazwę jak rozszerzenie DSL, na przykład MusicLibrary. Kliknij pozycję Dodaj narzędzie elementu.

    Uwaga

    Jeśli klikniesz prawym przyciskiem myszy węzeł Narzędzia , nie zobaczysz pozycji Dodaj narzędzie elementu. Zamiast tego kliknij węzeł nad nim.

  4. W okno Właściwości z wybranym nowym narzędziem elementu ustaw pozycję Klasa na ostatnio dodaną klasę domeny.

  5. Ustaw podpis i etykietkę narzędzia.

  6. Ustaw ikonę przybornika na ikonę, która będzie wyświetlana w przyborniku. Można ustawić ją na nową ikonę lub ikonę, która jest już używana dla innego narzędzia.

    Aby utworzyć nową ikonę, otwórz plik Dsl\Resources w Eksplorator rozwiązań. Skopiuj i wklej jedno z istniejących narzędzi elementów .BMP plików. Zmień nazwę wklejonej kopii, a następnie kliknij dwukrotnie, aby ją edytować.

    Wróć do diagramu definicji DSL, wybierz narzędzie, a następnie w okno Właściwości kliknij pozycję [...] w obszarze Ikona przybornika. W oknie dialogowym Wybieranie mapy bitowej wybierz plik BMP z menu rozwijanego.

Aby przetestować kształt przedziału

  1. Kliknij pozycję Przekształć wszystkie szablony na pasku narzędzi Eksplorator rozwiązań, aby wygenerować kod projektanta DSL.

  2. Skompiluj i uruchom rozszerzenie DSL. Naciśnij F5 lub CTRL+F5, aby uruchomić nowe wystąpienie programu Visual Studio w trybie eksperymentalnym. W eksperymentalnym wystąpieniu programu Visual Studio otwórz lub utwórz plik z rozszerzeniem nazwy pliku DSL.

  3. Sprawdź, czy narzędzie jest wyświetlane w przyborniku.

  4. Przeciągnij narzędzie na diagram modelu. Zostanie utworzony kształt.

    Sprawdź, czy nazwa elementu jest wyświetlana i jest ustawiana automatycznie na wartość domyślną.

  5. Kliknij prawym przyciskiem myszy nagłówek nowego kształtu, a następnie kliknij polecenie Dodaj element listy. W tym przykładzie polecenie to Dodaj piosenkę.

    Sprawdź, czy element znajduje się na liście i czy ma nową nazwę.

  6. Kliknij jeden z elementów listy, a następnie sprawdź okno Właściwości. Powinny zostać wyświetlone właściwości elementów listy.

  7. Otwórz Eksploratora języków. Sprawdź, czy węzły kontenera są widoczne z węzłami elementu listy w środku.

    Wygenerowany eksplorator DSL

    Po pierwszym przetestowaniu kształtu przedziału możesz dostosować niektóre jego właściwości i dodać bardziej zaawansowane funkcje. Aby uzyskać więcej informacji, zobacz Dostosowywanie i rozszerzanie języka specyficznego dla domeny.

Zazwyczaj element wyświetlany w przedziale jest elementem podrzędnym elementu reprezentowanego przez kształt przedziału. Czasami jednak chcesz wyświetlić element połączony z nim z relacją referencyjną.

Możemy na przykład dodać drugi przedział do albumu, który wyświetla listę artystów połączonych z albumem.

W takim przypadku przedział powinien wyświetlić łącze zamiast elementu, do których odwołuje się odwołanie. Dzieje się tak dlatego, że gdy użytkownik wybierze element w przedziale i naciśnie DELETEpolecenie , ma zostać usunięte łącze, a nie element, do którego odwołuje się odwołanie.

Niemniej jednak w przedziale może znajdować się nazwa elementu, do którego odwołuje się odwołanie.

W poniższej procedurze przyjęto założenie, że utworzono już klasę domeny, relację referencyjną, kształt przedziału i mapę elementu diagramu, jak opisano wcześniej w tej sekcji.

  1. Dodaj przedział do kształtu przedziału. Na diagramie definicji DSL kliknij prawym przyciskiem myszy klasę kształtu przedziału, wskaż polecenie Dodaj, a następnie kliknij pozycję Przedział.

  2. Ustaw ścieżkę kolekcji Wyświetlane elementy, aby przejść do linku zamiast jego elementu docelowego. Kliknij menu rozwijane i użyj widoku drzewa, aby wybrać relację referencyjną zamiast jej celu. W tym przykładzie relacja to ArtistAppearedOnAlbums.

  3. Ustaw ścieżkę na właściwość wyświetlaną, aby przejść z linku do elementu docelowego. W tym przykładzie jest to Artysta.

  4. Ustaw właściwość wyświetlania na odpowiednią właściwość elementu docelowego, na przykład Name.

  5. Przekształć wszystkie szablony, skompiluj i uruchom rozszerzenie DSL i otwórz model testowy.

  6. Na diagramie modelu utwórz odpowiednie klasy kształtu, ustaw ich nazwy i utwórz połączenie między nimi. W kształcie przedziału powinny pojawić się nazwy połączonych elementów.

  7. Wybierz link lub element w kształcie przedziału. Zarówno link, jak i element powinny zniknąć.

Definiowanie portów na granicy innego kształtu

Port to kształt, który znajduje się na granicy innego kształtu.

Porty mogą również służyć do zapewnienia stałego punktu połączenia na innym kształcie, do którego użytkownik może rysować łączniki. W takim przypadku można ustawić kształt portu jako przezroczysty.

Aby zobaczyć przykład, który używa portów, wybierz szablon Diagram składników podczas tworzenia nowego rozwiązania DSL. W tym przykładzie przedstawiono główne kwestie, które można wziąć pod uwagę podczas definiowania portów:

  • Istnieje klasa domeny reprezentująca kontener portów . Component

  • Istnieje klasa domeny, która reprezentuje porty. w tym przykładzie jest to ComponentPort.

  • Istnieje relacja osadzania z klasy domeny kontenera do klasy domeny portu. Aby uzyskać więcej informacji, zobacz Definiowanie klas domeny.

  • Jeśli chcesz, aby różne typy portów mogły być mieszane w tym samym kontenerze, możesz utworzyć podklasy klasy domeny portu. W tym przykładzie InPort i OutPort dziedziczą z ComponentPortelementu .

  • Klasę domeny kontenera można zamapować na dowolny rodzaj kształtu. W tym przykładzie jest to ComponentShape. Aby uzyskać więcej informacji, zobacz Definiowanie kształtów.

  • Klasy domen portów są mapowane na kształty portów. Klasy pochodne można mapować na oddzielne klasy kształtów portów lub mapować klasę bazową na jedną klasę kształtu portu.

    Pod innymi względami kształty portów zachowują się zgodnie z opisem w artykule Definiowanie kształtów.

    Aby uzyskać więcej informacji, zobacz Właściwości kształtów portów.

Definiowanie języka DSL, który ma pływaki

Pływaki to pozioma lub pionowa partycja diagramu. Każdy pływak odpowiada elementowi modelu. Definicja DSL wymaga jednej klasy domeny dla elementów pływaka.

Najlepszym sposobem utworzenia biblioteki DSL z pływakami jest utworzenie nowego rozwiązania DSL i wybranie szablonu rozwiązania Przepływu zadań. W definicji DSL klasa Aktor jest klasą domeny zamapowana na pływak. Zmień nazwę tej i innych klas, aby odpowiadały twojemu projektowi.

Aby dodać klasę, która będzie wyświetlana jako kształt wewnątrz toru, utwórz relację osadzania między klasą pływaka a nową klasą. Użytkownicy będą mogli przeciągać elementy z jednego toru kąpielowego do drugiego, ale każdy element będzie zawsze wewnątrz określonego toru. W szablonie rozwiązania Przepływ zadań element FlowElement jest elementem podrzędnym klasy pływaka.

Aby dodać klasę, która będzie wyświetlana jako kształt niezależnie od torów, utwórz relację osadzania między klasą główną a nową klasą. Użytkownicy będą mogli umieszczać te kształty w dowolnym miejscu na diagramie, w tym przez granice pływaków i poza pływakami. W szablonie rozwiązania Przepływ zadań komentarz jest elementem podrzędnym klasy głównej.

Aby uzyskać więcej informacji, zobacz Właściwości pływaków.

Dodawanie typów właściwości

Wyliczenia i literały domeny

Wyliczenie domeny jest typem z kilkoma wartościami literału.

Aby dodać wyliczenie domeny, kliknij prawym przyciskiem myszy katalog główny modelu w Eksploratorze DSL, a następnie kliknij polecenie Dodaj nową domenę wyliczenie. Element zostanie wyświetlony w Eksploratorze DSL w węźle Typy domen. Ten element nie jest wyświetlany na diagramie.

Aby dodać literały wyliczania do wyliczenia domeny, kliknij prawym przyciskiem myszy wyliczenie domeny w Eksploratorze DSL, a następnie kliknij polecenie Dodaj nowy literał wyliczenia.

Domyślnie właściwość, która ma typ wyliczenia, może być ustawiona tylko na jedną wartość wyliczenia jednocześnie. Jeśli chcesz, aby użytkownicy i programiści mogli ustawić dowolną kombinację wartości — "pole bitowe" — ustaw właściwość IsFlags w wyliczenie.

Typy zewnętrzne

Po ustawieniu typu właściwości domeny, jeśli nie znajdziesz żądanego typu na liście rozwijanej Typ , możesz dodać typ zewnętrzny. Możesz na przykład dodać typ System.Drawing.Color do listy.

Aby dodać typ, kliknij prawym przyciskiem myszy katalog główny modelu w Eksploratorze DSL, a następnie kliknij polecenie Dodaj nowy typ zewnętrzny. W okno Właściwości ustaw nazwę Na Kolor, a przestrzeń nazw na System.Drawing. Ten typ jest teraz wyświetlany w Eksploratorze DSL w obszarze Typy domen. Można go wybrać za każdym razem, gdy ustawisz typ właściwości domeny.

Dostosowywanie rozszerzenia DSL

Korzystając z technik opisanych w tym temacie, możesz szybko utworzyć język DSL z notacją diagramową, czytelnym formularzem XML i podstawowymi narzędziami wymaganymi do generowania kodu i innych artefaktów.

Istnieją dwie metody rozszerzania definicji DSL:

  1. Dostrajanie rozszerzenia DSL przy użyciu większej liczby funkcji definicji DSL. Można na przykład utworzyć jedno narzędzie łącznika, które może utworzyć kilka typów łączników, i kontrolować reguły, za pomocą których usunięcie jednego elementu powoduje również usunięcie powiązanych elementów. Te techniki są w większości osiągane przez ustawienie wartości w definicji DSL, a niektóre wymagają kilku wierszy kodu programu.

    Aby uzyskać więcej informacji, zobacz Dostosowywanie i rozszerzanie języka specyficznego dla domeny.

  2. Rozszerz narzędzia do modelowania przy użyciu kodu programu, aby osiągnąć bardziej zaawansowane efekty. Możesz na przykład utworzyć polecenia menu, które mogą zmienić model, i utworzyć narzędzia integrujące co najmniej dwie listy DSL. Zestaw VMSDK został zaprojektowany specjalnie w celu ułatwienia integracji rozszerzeń z kodem generowanym na podstawie definicji DSL. Aby uzyskać więcej informacji, zobacz Pisanie kodu w celu dostosowania języka specyficznego dla domeny.

Zmienianie definicji DSL

Podczas tworzenia dowolnego elementu w definicji DSL wiele wartości domyślnych jest ustawianych automatycznie. Po ich ustawieniu można je zmienić. Upraszcza to opracowywanie rozszerzenia DSL, a jednocześnie pozwala na zaawansowane dostosowania.

Na przykład podczas mapowania kształtu na element ścieżka elementu nadrzędnego mapowania jest automatycznie ustawiana zgodnie z relacją osadzania klasy domeny. Jeśli jednak później zmienisz relację osadzania, ścieżka elementu nadrzędnego nie zostanie automatycznie zmieniona.

W związku z tym należy pamiętać, że podczas zmiany niektórych relacji w definicji DSL błędy nie są zgłaszane podczas zapisywania definicji lub podczas przekształcania wszystkich szablonów. Większość tych błędów jest łatwa do naprawienia. Kliknij dwukrotnie raport o błędach, aby wyświetlić lokalizację błędu.

Zobacz również Instrukcje: zmienianie przestrzeni nazw języka specyficznego dla domeny.

Rozwiązywanie problemów

W poniższej tabeli wymieniono niektóre typowe problemy występujące podczas projektowania języka DSL wraz z sugestiami dotyczącymi ich rozwiązania. Więcej porad jest dostępnych na forum rozszerzalności narzędzi wizualizacji.

Problem Sugestia
Zmiany wprowadzone w pliku definicji DSL nie mają wpływu. Kliknij pozycję Przekształć wszystkie szablony na pasku narzędzi powyżej Eksplorator rozwiązań, a następnie ponownie skompiluj rozwiązanie.
Kształty pokazują nazwę dekoratora zamiast wartości właściwości. Skonfiguruj mapowanie dekoratora. Na diagramie definicji DSL kliknij mapę elementu diagramu, która jest szarą linią między klasą domeny a klasą kształtu.

Otwórz okno Szczegóły DSL. Jeśli nie widzisz go, w menu Widok wskaż pozycję Inne okna, a następnie kliknij pozycję Szczegóły DSL.

Kliknij kartę Mapy dekoratora. Wybierz nazwę dekoratora. Upewnij się, że pole obok niego jest zaznaczone. W obszarze Właściwość wyświetlania wybierz nazwę właściwości domeny.

Aby uzyskać więcej informacji, zobacz Kształty na diagramie.
W Eksploratorze DSL nie mogę dodać do kolekcji. Na przykład po kliknięciu prawym przyciskiem myszy pozycji Narzędzia w menu nie ma polecenia "Dodaj narzędzie".

W Eksploratorze dla mojego rozszerzenia DSL nie mogę dodać elementu do listy.
Kliknij prawym przyciskiem myszy element nad węzłem, który próbujesz. Jeśli chcesz dodać do listy, polecenie Dodaj nie znajduje się w węźle listy, ale w jego właścicielu.
Utworzono klasę domeny, ale nie mogę tworzyć wystąpień w Eksploratorze języków. Każda klasa domeny z wyjątkiem katalogu głównego musi być elementem docelowym relacji osadzania.
W eksploratorze dla mojego rozszerzenia DSL elementy są wyświetlane tylko z ich nazwami typów. W definicji DSL wybierz właściwość domeny klasy, a w okno Właściwości ustaw wartość Is Element Name na true.
Moje rozszerzenie DSL zawsze otwiera się w edytorze XML. Może się to zdarzyć z powodu błędu podczas odczytywania pliku. Jednak nawet po usunięciu tego błędu należy jawnie zresetować edytor, aby był projektantem DSL.

Kliknij prawym przyciskiem myszy element projektu, kliknij polecenie Otwórz za pomocą i wybierz pozycję YourLanguageDesigner (domyślny).
Przybornik mojego rozszerzenia DSL nie jest wyświetlany po zmianie nazw zestawów. Sprawdzanie i aktualizowanie rozszerzenia DslPackage\GeneratedCode\Package.tt Aby uzyskać więcej informacji, zobacz Jak zmienić przestrzeń nazw języka specyficznego dla domeny.
Przybornik mojego rozszerzenia DSL nie jest wyświetlany, ale nie zmieniłem nazwy zestawu.

Może też pojawić się okno komunikatu z informacją o niepowodzeniu załadowania rozszerzenia.
Zresetuj wystąpienie eksperymentalne i ponownie skompiluj rozwiązanie.

1. W menu Start systemu Windows w obszarze Wszystkie programy rozwiń węzeł Visual Studio SDK , narzędzia, a następnie kliknij polecenie Resetuj wystąpienie eksperymentalne programu Microsoft Visual Studio.
2. W menu Kompilacja kliknij pozycję Skompiluj rozwiązanie.