Определение доменного языка
Чтобы определить доменный язык (DSL), необходимо создать решение Visual Studio из шаблона. Ключевой частью решения является схема определения DSL, которая хранится в файле DslDefinition.dsl. Определение DSL определяет классы и фигуры DSL. После внесения изменений и добавления элементов можно добавить программный код для более детальной настройки DSL.
Если вы работаете с DSL впервые, рекомендуем использовать DSL Tools Lab, который вы найдете на этом сайте: Пакет SDK для визуализации и моделирования
Содержание раздела
Выбор шаблона решения
Образцы определения DSL
Классы элемента модели
Фигуры в схеме
Ссылки и соединители
Фигуры, содержащие списки Фигуры секций
Порты на границе другой фигуры
Дорожки
Типы свойств
Настройка DSL
Устранение неполадок
Выбор шаблона решения
Для определения доменного языка необходимо установить следующие компоненты.
Visual Studio |
|
SDK для Visual Studio |
|
Пакет SDK для визуализации и моделирования в Visual Studio |
Для создания нового доменного языка необходимо создать новое решение Visual Studio при помощи шаблона проекта доменного языка.
Создание решения DSL
Создайте решение при помощи шаблона доменного языка, который можно найти в разделе Другие типы проекта > Расширение среды в диалоговом окне Новый проект.
После нажатия кнопки ОК откроется Мастер доменного языка и список шаблонов решений DSL.
Нажмите на каждый шаблон, чтобы увидеть его описание. Выберите решение, максимально соответствующее тому, что вы хотите создать.
Каждый шаблон DSL определяет основной рабочий DSL. Этот DSL можно отредактировать в соответствии с вашими требованиями.
Нажмите на каждый образец, чтобы получить дополнительную информацию.
Выберите Поток задач, чтобы создать DSL с дорожками. Дорожки — это вертикальные или горизонтальные разделы схемы.
Выберите Модели компонентов для создания DSL с портами. Порты — это небольшие фигуры на краю более крупной фигуры.
Выберите Схемы классов для создания DSL с фрагментами фигур. Фрагменты фигур содержат списки элементов.
В остальных случаях, а также если вы не уверены в выборе, выберите Минимальный язык.
Примечание
Если требуется создать схему классов или компонентов, лучше всего использовать модели UML.Средства моделирования UML предоставляют набор схем, собранных в единую модель.Они могут расширяться и интегрироваться в DSL при помощи ModelBus.Для получения дополнительной информации см. Разработка моделей для программного проектирования.
Выберите Минимальный конструктор WinForm или Минимальный конструктор WPF для создания DSL, который будет отображаться в Windows Forms или в WPF. Вам нужно будет написать код для определения редактора. Дополнительные сведения см. в следующих разделах:
Введите расширение имени файла для DSL на соответствующей странице мастера. Это расширение будут использовать файлы, содержащие экземпляры DSL.
Выберите расширение имени файла, не связанное ни с одним другим приложением на вашем или другом компьютере, где планируется устанавливать DSL. Например, расширения docx и htm использовать нельзя.
Мастер предупредит, если расширение уже используется в качестве DSL. В этом случае выберите другое расширение имени файла. Можно также сбросить экземпляр экспериментального пакета SDK для Visual Studio, чтобы удалить старые экспериментальные конструкторы. Нажмите кнопку Пуск, выберите Все программы, Microsoft Visual Studio 2010 SDK, Средства, а затем Сброс экспериментального экземпляра Microsoft Visual Studio 2010.
Также можно изменить настройки на других страницах или оставить значения по умолчанию.
Нажмите кнопку Готово.
Мастер создаст решение, содержащее два или три проекта, и сгенерирует код из определения DSL.
После этого пользовательский интерфейс примет следующий вид:
Данное решение определяет доменный язык. Для получения дополнительной информации см. Overview of the Domain-Specific Language Tools User Interface.
Тестирование решения
Шаблон решения предоставляет рабочий DSL, который можно изменить или использовать как есть.
Чтобы протестировать решение нажмите клавишу F5 или комбинацию клавиш CTRL + F5. Новый экземпляр Visual Studio откроется в экспериментальном режиме.
В новом экземпляре Visual Studio в Обозревателе решений откройте файл Sample. Он откроется в виде схемы с панелью элементов.
Если вы запустите созданное решение из шаблона Минимальный язык, экспериментальный экземпляр Visual Studio примет следующий вид:
Работа с инструментами Создайте элементы и соедините их.
Закройте экспериментальный образец Visual Studio.
Примечание
После изменения DSL фигуры больше не будут отображаться в тестовом файле Sample.При этом возможность создавать новые элементы сохранится.
Изменение шаблона DSL
Переименуйте и оставьте некоторые или все классы доменов и фигур в шаблоне определения DSL. Новые имена классов должны быть действительными CLR-именами без пробелов и знаков препинания.
Рекомендуем сохранить следующие классы:
Корневой класс отображается в верхней левой части схемы определения DSL в разделе Классы и отношения. Присвойте ему другое имя, которое будет отличаться от имени DSL. Например, DSL с именем MusicLibrary может иметь корневой класс с именем Music.
Класс схемы отображается в нижней правой части схемы определения DSL в колонке Элементы схемы. Возможно, чтобы его увидеть, экран придется прокрутить вправо. Обычно этот класс называется YourDslDiagram.
Если использовался шаблон Поток задач и необходимо создать схемы с дорожками, оставьте и переименуйте класс домена Actor и фигуру ActorSwimlane.
Удалите или переименуйте другие классы в соответствии со своими потребностями.
Образцы определения DSL
Рекомендуем разрабатывать DSL путем добавления или настройки одного или двух функций за один раз. Добавьте функцию, запустите DSL и протестируйте его работу, затем добавьте еще одну или несколько функций. В число типовых функций DSL входят следующие.
Класс домена, отношение внедрения, соединяющее элемент с моделью, фигура, предназначенная для отображения элементов класса на схеме, и средство элемента, позволяющее пользователям создавать элементы.
Свойства домена того или иного класса и декораторы, отображающие их на схеме.
Ссылочное отношение и соединитель, который отображает его на схеме, а также инструмент соединителя, который позволяет пользователям создавать связи.
Настройка, требующая программного кода, например проверка ограничений или команда меню.
В следующих разделах описывается, как построить наиболее полезные виды функций DSL. Существуют много других шаблонов, с помощью которых может быть создан DSL, но эти используются наиболее часто.
Примечание
После добавления функции не забудьте нажать Трансформировать все шаблоны на панели инструментов в Обозревателе решений перед построением и запуском DSL.
На следующем рисунке показаны классы и отношения, которые являются частью DSL и используются в качестве примера в данном разделе.
Следующий рисунок является примером модели данного DSL:
Примечание
"Модель" означает экземпляр DSL, который создается пользователем и обычно отображается в виде схемы.В данном разделе рассматривается как схема определения DSL, так и схемы модели, которые отображаются при использовании DSL.
Определение классов доменов
Классы доменов представляют собой концепции DSL. Экземпляры являются элементами модели. Например, в DSL MusicLibrary могут существовать классы доменов с именами Album (Альбом) и Song (Песня).
Чтобы создать класс домена, можно перенести его из инструмента Именованный класс домена в схему, а затем переименовать этот класс.
Для получения дополнительной информации см. Properties of Domain Classes.
Создание отношения внедрения для каждого класса домена
Каждый класс домена, кроме корневого, должен быть целевым объектом хотя бы одного отношения внедрения или наследоваться от класса, который является таким целевым объектом.
В модели каждый элемент является узлом в едином дереве отношений внедрения. Источник и целевой объект отношения внедрения часто называют родительским и дочерним элементами.
Выбор родительского элемента для класса домена зависит от того, как зависит время жизни этих элементов от других элементов. Если узел дерева удаляется, его поддерево обычно удаляется вместе с ним. Классы элемента, существующего независимо, встроены напрямую в корневой класс.
Обычно если вы отображаете элемент внутри другого элемента, то показываете и его отношение к владельцу. В данном случае наиболее соответствующий родительский класс — это класс контейнера. Исключение имеет место, когда элемент внутри контейнера на самом деле является ссылкой на независимый элемент. В этом случае при удалении контейнера удаляется ссылка, но не объект, на который она указывает.
В шаблонах определения DSL, описанных в данном разделе, будем предполагать, что элементы, отображаемые внутри контейнера, при удалении контейнера также будут удалены. Возможны и более сложные схемы, которые создаются путем определения ролей.
Отображение элемента |
Родительский класс (класс внедрения) |
Пример в шаблоне решения DSL |
---|---|---|
Фигура на схеме Дорожка |
Корневой класс DSL |
Минимальный язык Поток задач: класс субъектов |
Фигура в дорожке |
Класс домена элементов, который отображаются в качестве дорожек. |
Поток задач: класс задач |
Элемент в списке в фигуре, удаляемый при удалении контейнера Порт на краю фигуры |
Класс домена, сопоставленный с фигурой контейнера |
Схема классов: класс атрибутов Схема компонентов: класс портов |
Элемент в списке, не удаляемый при удалении контейнера |
Корневой класс DSL Список с указанием связей и отношений |
|
Не отображается напрямую |
Класс, часть которого он формирует |
В примере Music Library, альбомы (Album) отображаются как прямоугольники, в которых перечислены названия песен (Song). Следовательно, родителем элемента Album является корневой класс Music (Музыка), а родителем элемента Song (Песня) — класс Album (Альбом).
Чтобы создать класс домена и его внедрение одновременно, щелкните средство Отношение внедрения, выберите родительский класс и щелкните пустую область схемы.
Как правило, изменять имя отношения внедрения и его ролей не обязательно, так как они будут отслеживать имена классов автоматически.
Дополнительные сведения см. в разделах Properties of Domain Relationships и Properties of Domain Roles.
Примечание
Внедрение не является наследованием.Дочерние элементы в отношении внедрения не наследуют свойства родительских элементов.
Добавление свойств домена в каждый класс домена
Свойства доменов хранят значения. Примеры: имя, название, дата публикации.
Выберите Свойства домена в классе, нажмите клавишу ВВОД и введите имя свойства. Тип свойства домена по умолчанию — строка. Если необходимо изменить тип, выберите свойство домена и установите Тип в окне Свойства. Если нужного типа в раскрывающемся списке нет, см. раздел Добавление типов свойств.
Установите свойство "Имя элемента". Выберите свойство домена, которое может использоваться для определения элементов в Обозревателе языка. Например, в классе домена Song (Песня) можно выбрать свойство домена "Название". В окне Свойства присвойте параметру Имя элемента значение true.
Создание производных классов доменов
Если у классов доменов должны быть экземпляры, которые наследуют его свойства и отношения, можно создать классы, которые являются производными от него. Например, класс Album (Альбом) может иметь производные классы WMA и MP3.
Создайте производный класс при помощи инструмента Класс домена.
Выберите инструмент Наследование и выберите сначала производный, а затем базовый класс.
Также можно присвоить Модификатору наследования базового класса значение абстрактный. Если вам могут понадобиться экземпляры базового класса, создайте для них отдельные производные классы.
Производные классы наследуют свойства и роли базовых классов.
Чистка схемы определения DSL
При добавлении отношений некоторые из классов появятся сразу в нескольких местах. Чтобы уменьшить количество появлений и сделать схему шире, щелкните целевой класс отношения правой кнопкой мыши и выберите пункт Перенести дерево сюда. Для обратного эффекта щелкните целевой класс отношения правой кнопкой мыши и выберите пункт Разделить дерево. Если эти команды меню отсутствуют, убедитесь, что выбран только класс домена.
Для перемещения классов доменов и фигур используйте сочетания клавиш CTRL + стрелка вверх и CTRL + стрелка вниз.
Проверка классов доменов
Чтобы проверить новые классы доменов, сделайте следующее.
Щелкните "Трансформировать все шаблоны на панели инструментов в Обозревателе решений, чтобы сгенерировать код конструктора DSL. Этот шаг можно автоматизировать. Для получения дополнительной информации см. Автоматизация преобразования всех шаблонов.
Постройте и запустите DSL. Нажмите клавишу F5 или сочетание клавиш CTRL + F5 для запуска нового экземпляра Visual Studio в экспериментальном режиме. В экспериментальном экземпляре Visual Studio откройте или создайте файл с расширением вашего DSL.
Откройте обозреватель. С краю схемы находится окно обозревателя языка, которое обычно называется "Обозреватель Ваш язык". Если вы не видите это окно, оно может быть на вкладке под Обозревателем решений. Если вы не можете его найти, в меню Вид наведите указатель мыши на пункт Другие окна и выберите параметр ОбозревательВашЯзык.
В обозревателе представлен вид модели в качестве дерева.
Создание новых элементов. Щелкните верхний корневой узел правой кнопкой мыши и выберите команду Добавить новый ВашКласс.
Новый экземпляр класса появится в Обозревателе языка.
При создании новых экземпляров следите за тем, чтобы все экземпляры получали разные имена. Для этого в свойствах домена должен быть установлен флажок Имя элемента.
Проверьте свойства домена. При помощи экземпляра выбранного класса проверьте окно "Свойства". Оно должно показывать свойства домена, которые вы определили для данного класса домена.
Сохраните файл, закройте его и откройте снова. Все созданные экземпляры должны отобразиться в обозревателе, когда вы развернете узлы.
Определение фигур на схеме
Вы можете определить классы элементов, которые отображаются на схеме в виде прямоугольников, эллипсов или ярлыков.
Определение класса элементов, которые отображаются на схеме в виде фигур
Определите и протестируйте класс домена, как описано в разделе Определение классов доменов**.**
Родителем класса должен быть корневой класс. Это значит, что между корневым классом и новым классом домена должно существовать отношение внедрения.
Если в схеме есть дорожки, то родителем может быть класс домена, сопоставленный с дорожкой. Перед продолжением данной процедуры см. раздел Определение DSL с дорожками.
Добавьте класс фигуры , чтобы представить элементы на схеме моделей. Перетащите один из следующих инструментов на схему определения DSL.
Геометрическая фигура дает прямоугольник или эллипс.
Фигура изображения выводит указанное изображение.
Фигура секции представляет собой прямоугольник, содержащий один или несколько списков элементов.
Переименуйте класс фигуры, который отображается в правой части схемы определения DSL под фигурами и соединителями.
Определите изображение, если вы создали фигуру изображения.
Создайте файл изображения любого размера. Поддерживаются форматы BMP, JPEG, GIF и EMF.
В Обозревателе решений добавьте файл в каталог решения Dsl\Resources.
Вернитесь в схему определения DSL и выберите новый класс фигуры изображения.
В окне "Свойства" выберите свойство Изображение.
В диалоговом окне Выбор изображения откройте раскрывающееся меню в поле Имя файла и выберите изображение.
Добавьте к фигуре декораторы текста, чтобы отобразить свойства домена.
Чтобы отобразить имя или название элемента модели, потребуется хотя бы один декоратор.
Щелкните заголовок класса фигуры правой кнопкой мыши, наведите указатель мыши на пункт Добавить и выберите параметр Декоратор текста. Укажите имя декоратора, а в окне "Свойства" укажите значение для его параметра Позиция.
Соедините все фигуры при помощи карты элементов схемы с классом домена, которые они должны отображать.
Щелкните инструмент Карта элементов схемы и выберите класс домена, а затем класс фигуры.
Сопоставьте свойства с текстовыми декораторами.
Выберите серую линию между классом домена и классом фигуры, которая представляет карту элементов схемы.
В окне Подробные сведения о DSL откройте вкладку Карты декораторов. Если вы не можете найти окно Подробные сведения о DSL, в меню Вид наведите указатель мыши на пункт Другие окна и выберите Подробные сведения о DSL. Часто нужно поднять верхнюю часть окна, чтобы увидеть все его содержимое.
Выберите имя декоратора. В поле Отобразить свойство выберите имя свойства класса домена. Повторите эти шаги для каждого декоратора.
Если вы хотите отобразить свойство связанного элемента, щелкните раскрывающийся навигатор дерева на вкладке Путь для отображения свойства.
Возле имени каждого декоратора должен быть установлен флажок.
Создайте элемент панели элементов для создания элементов класса домена.
В Обозревателе DSL разверните узел Редактор и все его подузлы.
Щелкните правой кнопкой мыши узел в разделе Вкладки панели элементов, имя которого совпадает с именем вашего DSL, например MusicLibrary. Щелкните Добавить средство элемента.
Примечание
Если щелкнуть правой кнопкой мыши узел Инструменты, пункта Добавить инструмент элемента в контекстном меню не будет.Вместо этого необходимо щелкнуть узел на уровень выше.
В окне "Свойства" с выбранным новым инструментом элемента укажите в поле Класс добавленный класс домена.
Укажите значения для параметров Заголовок и Подсказка.
Укажите для параметра Значок на панели элементов значок, который будет отображаться в панели элементов. Можно выбрать новый значок или значок, который уже используется для другого инструмента.
Чтобы создать новый значок, откройте Dsl\Resources в Обозревателе решений. Скопируйте и вставьте один из существующих BMP-файлов средства элемента. Переименуйте вставленную копию, а затем откройте ее двойным щелчком кнопки мыши для редактирования.
Вернитесь в схему определения DSL, выберите инструмент, а затем в окне "Свойства" щелкните [...] в поле Значок на панели элементов. В диалоговом окне Выбор точечного рисунка выберите BMP-файл в раскрывающемся меню.
Дополнительные сведения см. в разделах Properties of Geometry Shapes и Properties of Image Shapes.
Тестирование Фигур
Щелкните "Трансформировать все шаблоны на панели инструментов в Обозревателе решений, чтобы сгенерировать код конструктора DSL.
Постройте и запустите DSL. Нажмите клавишу F5 или сочетание клавиш CTRL + F5 для запуска нового экземпляра Visual Studio в экспериментальном режиме. В экспериментальном экземпляре Visual Studio откройте или создайте файл с расширением вашего DSL.
Убедитесь, что средства элементов появились на панели элементов.
Создайте фигуры, перетащив их из инструмента в схему модели.
Убедитесь, что появился каждый текстовый декоратор и:
его можно редактировать, только если в свойстве домена не установлен флажок Только для чтения;
в случае изменения свойства в окне"Свойства" или в декораторе другой вид обновляется.
После первого тестирования фигуры можно откорректировать некоторые свойства и добавить расширенные свойства. Для получения дополнительной информации см. Customizing and Extending a Domain-Specific Language.
Определение ссылочных отношений
Между любым классом домена источника и классом домена целевого объекта можно определить ссылочное отношение. Ссылочные отношения обычно отображаются на схеме в виде соединителей — линий между фигурами.
Например, если музыкальные альбомы (Album) и исполнители (Artist) отображаются в схеме в виде фигур, можно определить отношение с именем ArtistsAppearedOnAlbums, связывающее исполнителей и альбомы, в которых они участвуют. См. пример на рисунке.
Ссылочные отношения могут также связывать элементы одного типа. Например, в DSL, представляющем собой генеалогическое древо, взаимосвязь между родительскими и дочерними элементами является ссылочным отношением между персонами.
Определение ссылочного отношения
Щелкните инструмент ссылочного отношения, затем класс домена источника отношения и, наконец, целевой класс домена. Целевой класс может быть таким же как и класс источника.
Каждое отношение имеет две роли, представленные линией с каждой стороны окна отношений. Можно выбрать каждую роль и настроить ее свойства в окне "Свойства".
Роли следует переименовать. Например, в отношении между персонами можно изменить имена по умолчанию на "Родители" и "Дети", "Руководитель" и "Подчиненные", "Преподаватель" и "Студент" и т. д.
При необходимости настройте кратность каждой роли . Если у каждой персоны должно быть не больше одного Руководителя, укажите для параметра кратности под ярлыком "Руководитель" в схеме значение "0..1".
Добавьте в отношение свойства домена. На рисунке отношение между исполнителем и альбомом имеет свойство роли.
Установите свойство отношения Разрешить дубликаты, если между одной парой элементов модели может существовать несколько связей одного класса. Например, можно разрешить Преподавателю обучать одного и того же Студента нескольким Дисциплинам.
Дополнительные сведения см. в разделах Properties of Domain Relationships и Properties of Domain Roles.
Определение соединителя для отображения отношения
Соединитель отображает линию между двумя фигурами в схеме модели.
Перенесите инструмент Соединитель в схему определения DSL.
Добавьте текстовые декораторы если необходимо отобразить ярлыки на соединителе. Установите их расположение. Чтобы разрешить пользователю двигать текстовый декоратор, установите его свойство Допускается перемещение.
Используйте инструмент Карта элементов схемы, чтобы связать соединитель со ссылочным отношением.
С выбранной картой элементов схемы откройте окно Подробные сведения о DSL и перейдите на вкладку Сопоставления декораторов.
Выберите каждый Декоратор и укажите для параметра Свойство отображения соответствующее свойство домена.
Убедитесь, что возле каждого элемента в списке Декораторов установлен флажок.
Определение средства построителя подключений
В Обозревателе DSL разверните узел Редактор и все его подузлы.
Щелкните правой кнопкой мыши узел, имя которого совпадает с именем вашего DSL, и выберите пункт Добавить новое средство подключения.
Выбрав новый инструмент, в окне "Свойства":
укажите значения для параметров Заголовок и Подсказка.
выберите Построитель подключений и выберите соответствующий построитель для нового отношения;
укажите для параметра Значок на панели элементов значок, который будет отображаться в панели элементов. Можно выбрать новый значок или значок, который уже используется для другого инструмента.
Чтобы создать новый значок, откройте Dsl\Resources в Обозревателе решений. Скопируйте и вставьте один из существующих BMP-файлов средства элемента. Переименуйте вставленную копию, а затем откройте ее двойным щелчком кнопки мыши для редактирования.
Вернитесь в схему определения DSL, выберите инструмент, а затем в окне "Свойства" щелкните [...] в поле Значок на панели элементов. В диалоговом окне Выбор точечного рисунка выберите BMP-файл в раскрывающемся меню.
Тестирование ссылочного отношения и соединителя
Щелкните "Трансформировать все шаблоны на панели инструментов в Обозревателе решений, чтобы сгенерировать код конструктора DSL.
Постройте и запустите DSL. Нажмите клавишу F5 или сочетание клавиш CTRL + F5 для запуска нового экземпляра Visual Studio в экспериментальном режиме. В экспериментальном экземпляре Visual Studio откройте или создайте файл с расширением вашего DSL.
Убедитесь, что средства подключений появились на панели элементов.
Создайте фигуры, перетащив их из инструмента в схему модели.
Создайте соединения между фигурами. Выберите соединитель, щелкните фигуру, а затем выберите другую фигуру.
Убедитесь, что вы не можете создать соединения между несоответствующими классами. Например, если установлено отношение между Альбомами и Исполнителями, убедитесь, что нельзя связать Исполнителей с Исполнителями.
Проверьте правильно ли задана кратность. Например, убедитесь, что Персону нельзя соединить более чем с одним Руководителем.
Убедитесь, что появился каждый текстовый декоратор и:
его можно редактировать, только если в свойстве домена не установлен флажок Только для чтения;
в случае изменения свойства в окне"Свойства" или в декораторе другой вид обновляется.
После первого тестирования соединителя можно откорректировать некоторые свойства и добавить расширенные свойства. Для получения дополнительной информации см. Customizing and Extending a Domain-Specific Language.
Определение фигур, содержащих списки. Фигуры секций
Фигура секции содержит один или несколько списков элементов. Например, в DSL Music Library можно использовать фигуру секции для представления музыкальных Альбомов. В каждом Альбоме есть список Песен.
Самый простой способ добиться этого эффекта в определении DSL — это определить один класс домена для контейнера и один класс домена для каждого списка. Класс контейнера сопоставлен с фигурой секции.
Для получения дополнительной информации см. Properties of Compartment Shapes.
Определение фигуры секции
Создайте класс домена для контейнера. Выберите инструмент Отношение внедрения, щелкните корневой класс модели, а затем пустую часть схемы определения DSL. Это создаст класс домена, который на рисунке примера называется Album.
В качестве альтернативы вместо встраивания в корневой класс можно встроить контейнер в класс домена, сопоставленный с дорожкой.
Добавьте к классу свойство домена, например Имя, и установите для него флажок Имя элемента в окне "Свойства".
Создание класса домена для списка элементов. Выберите инструмент Отношение внедрения, щелкните класс контейнера (Album), а затем пустую часть схемы. Это создаст класс домена, который на рисунке примера называется Song (Песня).
Добавьте к классу свойство домена, например Название, и установите для него флажок Имя элемента.
Добавьте другие свойства домена.
Добавьте по классу домена для каждого списка элементов, который необходимо отобразить.
Чтобы смешать несколько типов элементов в списке, создайте классы, которые наследуются от класса списка. Сделайте класс списка абстрактным, настроив его Модификатор наследования.
Например, если вы хотите, чтобы классическая музыка сортировалась по композитору, а не по исполнителю, можно создать в классе Song (Песня) два подкласса: ClassicalSong (Классические) и NonClassicalSong (Не классические).
Создайте фигуру секции. Перенесите инструмент Фигура секции в схему определения DSL.
Добавьте текстовый декоратор и укажите для него имя.
Добавьте секцию и укажите для нее имя.
Чтобы пользователь мог скрывать секции списка, щелкните класс фигуры секции правой кнопкой мыши, наведите указатель мыши на пункт Добавить и выберите параметр Развернуть/свернуть декоратор. В окне "Свойства" задайте расположение декоратора.
Щелкните инструмент Карта элементов схемы и выберите класс домена контейнера, а затем класс фигуры секции.
Выберите связь карты элемента схемы между классом домена и фигурой. В окне Подробные сведения о DSL
Откройте вкладку Декораторы. выберите имя декоратора, а затем соответствующий элемент в разделе Отобразить свойство. Убедитесь, что возле имени каждого декоратора установлен флажок.
Откройте вкладку Сопоставления секций.
Выберите имя секции.
В поле Путь коллекции отображенных элементов найдите класс списка элементов (Song). Щелкните стрелку раскрывающегося меню, чтобы воспользоваться инструментом навигации.
В разделе Свойства отображения выберите свойство, которое должно отображаться в списке. В этом примере это свойство — Название.
Примечание
Используя поля "Путь" в карте декораторов и полях в карте секций, установите более сложные отношения между классами доменов и фигурой секции.
Определение инструмента для создания фигуры
Создайте элемент панели элементов для создания элементов класса домена.
В Обозревателе DSL разверните узел Редактор и все его подузлы.
Щелкните правой кнопкой мыши узел в разделе Вкладки панели элементов, имя которого совпадает с именем вашего DSL, например MusicLibrary. Щелкните Добавить средство элемента.
Примечание
Если щелкнуть правой кнопкой мыши узел Инструменты, пункта Добавить инструмент элемента в контекстном меню не будет.Вместо этого необходимо щелкнуть узел на уровень выше.
В окне "Свойства" с выбранным новым инструментом элемента укажите в поле Класс добавленный класс домена.
Укажите значения для параметров Заголовок и Подсказка.
Укажите для параметра Значок на панели элементов значок, который будет отображаться в панели элементов. Можно выбрать новый значок или значок, который уже используется для другого инструмента.
Чтобы создать новый значок, откройте Dsl\Resources в Обозревателе решений. Скопируйте и вставьте один из существующих BMP-файлов средства элемента. Переименуйте вставленную копию, а затем откройте ее двойным щелчком кнопки мыши для редактирования.
Вернитесь в схему определения DSL, выберите инструмент, а затем в окне "Свойства" щелкните [...] в поле Значок на панели элементов. В диалоговом окне Выбор точечного рисунка выберите BMP-файл в раскрывающемся меню.
Тестирование фигуры сегмента
Щелкните "Трансформировать все шаблоны на панели инструментов в Обозревателе решений, чтобы сгенерировать код конструктора DSL.
Постройте и запустите DSL. Нажмите клавишу F5 или сочетание клавиш CTRL + F5 для запуска нового экземпляра Visual Studio в экспериментальном режиме. В экспериментальном экземпляре Visual Studio откройте или создайте файл с расширением вашего DSL.
Убедитесь, что инструмент появился на панели элементов.
Перетащите инструмент в схему модели. Будет создана новая фигура.
Убедитесь, что имя элемента отображается и автоматически получает значение по умолчанию.
Щелкните заголовок новой фигуры правой кнопкой мыши и выберите пункт "Добавить Элемент списка". В этом примере используется команда "Добавить песню".
Убедитесь, что элемент отображается в списке под новым именем.
Щелкните один из элементов списка и проверьте окно "Свойства". В нем должны появиться свойства элементов списка.
Откройте Обозреватель языка. Убедитесь, что узлы контейнера содержат узлы элементов списка.
После первого тестирования фигуры секции можно откорректировать некоторые свойства и добавить расширенные свойства. Для получения дополнительной информации см. Customizing and Extending a Domain-Specific Language.
Отображение ссылочной связи в секции
Обычно элемент, который отображается в секции, является дочерним для элемента, который представлен фигурой фрагмента. Однако в некоторых случаях можно отобразить элемент, который связан с ним ссылочным отношением.
Например, можно добавить вторую секцию в элемент AlbumShape, отображающий список Исполнителей, которые связаны с Альбомом.
В этом случае секция должна отображать связь вместо элемента, на который она ссылается. Это связано с тем, что, когда пользователь выбирает элемент в секции и нажимает клавишу DELETE, должна удаляться связь, а не элемент, на который создана ссылка.
Тем не менее можно сделать так, чтобы имя элемента, на который создана ссылка, отображалось в секции.
Следующая процедура предполагает, что вы уже создали класс домена, ссылочное отношение, фигуру секции и карту элементов схемы, как описано выше в этом разделе.
Отображение ссылочной связи в секции
Добавьте секцию в фигуру секции. В схеме определения DSL щелкните класс фигуры секции правой кнопкой мыши, наведите указатель мыши на пункт Добавить и выберите параметр Секция.
Настройте Путь коллекции отображенных элементов на переход к связи, а не к целевому элементу. Откройте раскрывающееся меню и выберите в представлении дерева вместо цели ссылочное отношение. В это примере используется отношение ArtistAppearedOnAlbums.
Настройте Путь для отображения свойства на переход от связи к целевому объекту. В этом примере используется Artist (Исполнитель).
Укажите для параметра Свойство отображения соответствующее свойство целевого элемента, например Имя.
Трансформируйте все шаблоны, постройте и запустите DSL и откройте тестовую модель.
В схеме модели создайте соответствующие классы фигур, присвойте им имена и создайте связь между ними. В фигуре секции должны появиться имена связанных элементов.
Выберите связь или элемент в фигуре секции. Связь и элемент должны исчезнуть.
Определение портов на границе другой фигуры
Порт — это фигура, которая находится на границе с другой фигурой.
Порты могут также использоваться для предоставления фиксированной точки соединения с другой фигурой, для которой пользователь может нарисовать соединители. В данном случае фигуру порта можно сделать прозрачной.
Чтобы увидеть пример с использованием портов, выберите шаблон Схема компонентов при создании нового решения DSL. В данном примере показаны основные точки, которые можно использовать при определении портов.
Класс домена, который представляет контейнер портов (Component).
Класс домена, который представляет порты. В этом примере используется класс ComponentPort.
Отношение внедрения между классом домена контейнера и классом домена порта. Дополнительные сведения см. в разделе Определение классов доменов.
Если в одном контейнере нужно смешать разные типы портов, можно создать подклассы класса домена порта. В данном примере InPort и OutPort наследуются от ComponentPort.
Класс домена контейнера может быть сопоставлен с любым видом фигуры. В этом примере используется ComponentShape. Дополнительные сведения см. в разделе Определение фигур.
Классы доменов портов сопоставлены с фигурами портов. Можно сопоставить либо производные классы с отдельными классами фигур портов, либо базовый класс с одним классом фигуры порта.
В остальном фигуры портов ведут себя так, как описано в разделе Определение фигур.
Для получения дополнительной информации см. Properties of Port Shapes.
Определение DSL с дорожками
Дорожки — это вертикальные или горизонтальные разделения схемы. Каждая дорожка соответствует элементу модели. Определение DSL требует одного класса домена для элементов дорожек.
Лучший способ создать DSL с дорожками — это создать новое решение DSL и выбрать шаблон решения "Поток задач". В определении DSL класс субъекта является классом домена, сопоставленным с дорожкой. Переименуйте его и другие классы в соответствии со своим проектом.
Чтобы добавить класс, который будет отображаться как фигура внутри дорожки, создайте отношение внедрения между классом дорожки и новым классом. Пользователи смогут перетаскивать элементы из одной дорожки в другую, но каждый элемент всегда будет находиться внутри конкретной дорожки. В шаблоне решения "Поток задач", FlowElement является дочерним классом класса дорожки.
Чтобы добавить класс, который будет отображаться как фигура, независимая от дорожки, создайте отношение внедрения между корневым и новым классами. Пользователи смогут размещать эти фигуры в любом месте схемы, в т. ч. на границах и за пределами дорожек. В шаблоне решения "Поток задач", Comment является дочерним классом класса дорожки.
Для получения дополнительной информации см. Properties of Swimlanes.
Добавление типов свойств
Доменные перечисления и литералы
Доменное перечисление — это тип с несколькими значениями литералов.
Чтобы добавить доменное перечисление, щелкните корень модели в Обозревателе DSL правой кнопкой мыши и выберите пункт Добавить новое доменное перечисление. Элемент появится в Обозревателе DSL в узле Типы доменов. Этот элемент не отображается в схеме.
Чтобы добавить литералы в доменное перечисление, щелкните доменное перечисление в Обозревателе DSL правой кнопкой мыши и выберите пункт Добавить новый литерал перечисления.
По умолчанию свойство, которое имеет тип перечисления, может иметь только одно значение перечисления за раз. Если вы хотите разрешить пользователям и программистам устанавливать любую комбинацию значений (поле битов), выберите для перечисления свойство Флажок.
Внешние типы
Если при установке типа домена вы не можете найти нужный тип в раскрывающемся списке Тип, можно добавить внешний тип. Например, можно добавить в список тип System.Drawing.Color.
Чтобы добавить тип, щелкните корень модели в Обозревателе DSL правой кнопкой мыши и выберите пункт Добавить новый внешний тип. В окне "Свойства" укажите имя Color и пространство имен System.Drawing. Это тип теперь появится в Обозревателе DSL на вкладке Типы доменов и будет доступен для выборе при установке типа свойства домена.
Настройка DSL
Используя техники, описанные в этом разделе, можно быстро создать DSL со схематическим представлением, читаемой формой XML и основными инструментами, необходимыми для генерирования кода или других артефактов.
Существуют два метода расширения определения DSL.
Точная настройка DSL с использованием многочисленных функций определения DSL. Например, можно сделать единое средство подключения, способное создавать несколько типов соединителей, и настроить правила, по которым удаление одного элемента ведет к удалению связанных элементов. Большинство этих техник требуют установки значений в определении DSL, а некоторые — написания нескольких строк программного кода.
Для получения дополнительной информации см. Customizing and Extending a Domain-Specific Language.
Расширение инструментов моделирования с помощью программного кода для достижения более сложных эффектов. Например, можно создать команды меню, способные изменять модель, а также инструменты, соединяющие в себе два и более DSL. VMSDK разработан специально для того, чтобы облегчить интеграцию расширений с кодом, который генерируется из определения DSL. Для получения дополнительной информации см. Writing Code to Customise a Domain-Specific Language.
Изменение определения DSL
При создании любого элемента в определении DSL многие значения устанавливаются автоматически. Установленные значения можно изменять. Это упрощает разработку DSL и в то же время позволяет осуществлять значительные настройки.
Например, когда фигура сопоставляется с элементом, путь родительского элемента сопоставления автоматически устанавливается согласно отношению внедрения соответствующего класса домена. Если же впоследствии отношение внедрения корректируется, путь родительского элемента автоматически не изменяется.
Следовательно, необходимо знать, что при изменении некоторых взаимосвязей в определении DSL нет ничего необычного в том, что при сохранении определения или трансформации всех шаблонов будут выдаваться сообщения об ошибках. Большинство этих ошибок легко исправить. Откройте сообщение об ошибке двойным щелчком кнопки мыши, чтобы найти расположение ошибки.
См. также раздел How to: Change the Namespace of a Domain-Specific Language.
Устранение неполадок
В следующей таблице перечислено большинство стандартных проблем, возникающих при разработке DSL, а также предложения по их решению. Дополнительные рекомендации см. на Форуме по расширению инструментов визуализации.
Проблема |
Предложение |
---|---|
Изменения, внесенные в файл определения DSL, не работают. |
Нажмите Трансформировать все шаблоны на панели инструментов в верхней части Обозревателя решений, и выполните сборку решения еще раз. |
Фигуры показывают имя декоратора вместо значения свойства. |
Настройте сопоставление декоратора. В схеме определения DSL щелкните карту элементов схемы — это серая линия между классом домена и классом фигуры. Откройте окно Подробные сведения о DSL. Если вы не можете его найти, в меню "Вид" наведите указатель мыши на пункт Другие окна и выберите параметр Подробные сведения DSL. Откройте вкладку Сопоставления декораторов. Выберите имя декоратора. Убедитесь, что флажок рядом с ним установлен. В поле Отобразить свойство выберите имя свойства домена. Дополнительные сведения см. в разделе Фигуры на схеме. |
В Обозревателе DSL не удается добавить коллекцию. Например, при щелчке правой кнопкой мыши по пункт "Инструменты" в меню не отображается команда "Добавить инструмент". В Обозревателе DSL не удается добавить элемент в список. |
Щелкните элемент над интересующим вас узлом правой кнопкой мыши. Если вы хотите добавить элемент в список, ищите команду "Добавить" не в узле списка, а во владельце. |
Я создал класс домена, но не могу создать экземпляры в Обозревателе языка. |
Каждый класс домена, кроме корневого, должен быть целевым объектом отношения внедрения. |
В Обозревателе DSL элементы отображаются только с именами их типов. |
В определении DSL выберите свойство домена класса и в окне "Свойства" установите для параметра Имя элемента значение true. |
DSL всегда открывается в XML-редакторе. |
Это происходит из-за ошибки чтения файла. Даже если вы исправите эту ошибку, необходимо будет специально сбросить редактор, чтобы он больше не выступал в качестве конструктора DSL. Щелкните элемент проекта правой кнопкой мыши и выберите пункт Открыть с помощью, а затем Ваш язык Конструктор (по умолчанию). |
Панель элементов в DSL не отображается после изменения имен сборки. |
Проверьте и обновите DslPackage\GeneratedCode\Package.tt. Дополнительные сведения см. в разделе How to: Change the Namespace of a Domain-Specific Language. |
Панель элементов в DSL не отображается, хотя имя сборки не изменялось. Либо появляется сообщение о невозможности загрузить расширение. |
Сбросьте экспериментальный экземпляр и выполните сборку решения заново.
|
См. также
Задачи
Creating a Windows Forms-Based Domain-Specific Language