Вопрос

В настоящее время проект, с которым я работаю, не имеет полностью фиксированных моделей (из-за внешнего влияния), и поэтому я хотел бы некоторой гибкости в их написании.В настоящее время они реплицируются на трех разных уровнях приложения (db, web api и client), и каждый из них имеет схожую логику в нем (т.е.валидация).

Мне было интересно, существует ли подход, который позволил бы мне написать файл модели (скажем, на ruby), а затем преобразовать эту модель в необходимые файлы c #.В настоящее время кажется, что я просто пишу много шаблонного кода, который может измениться на любом этапе, в то время как этот сгенерированный подход позволил бы мне сосредоточиться на гораздо более важных вещах.

Есть ли у кого-нибудь рекомендация для чего-то подобного, dsl / язык, на котором я могу это сделать, и есть ли у кого-нибудь опыт в отношении чего-то подобного?

Это было полезно?

Решение

Это можно легко сделать с помощью ANTLR ( АНТЛР ).Если выходные данные достаточно похожи, вы можете просто использовать механизм создания текстовых шаблонов — в противном случае он может сгенерировать абстрактное синтаксическое дерево, по которому вы сможете перемещаться.

Другие советы

Я видел систему, которая использовала частичные классы и частичные методы, позволяющие восстанавливать код, не затрагивая пользовательский код."Механизм правил", если хотите, был полностью сгенерирован на основе диаграммы состояний Visio.По сути, это рабочий процесс для бедных людей, но его очень легко изменить.Диаграмма Viso была экспортирована в XML, который был прочитан при использовании powershell и T4 для создания классов.

Приведенный выше пример относится к внешнему DSL.Т.Е.внешний по отношению к языку программирования, на котором выполняется приложение.С другой стороны, вы могли бы создать внутренний DSL, который реализован и используется на языке программирования.

Этот и предыдущий статья о DSLSs из Code-Magazine довольно хороши.

По приведенной выше ссылке Нил Форд показывает вам, как создать внутренний DSL на C #, используя свободный интерфейс.

Одна вещь, о которой он еще не упомянул, это то, что вы можете поместить этот атрибут [EditorBrowsable(EditorBrowsableState.Никогда)] на ваших методах, чтобы они не отображались в intellisense.Это означает, что вы можете скрыть методы класса, отличные от DSL (если хотите), от пользователя DSL, что делает fluent API намного более доступным для обнаружения.

Вы можете увидеть, как беглый интерфейс пишется вживую в этой серии видеороликов Даниэль Каццулино о написании контейнера IoC с TDD

Что касается внешних DSL, то у вас также есть возможность Осло (ОСАГО на данный момент) что довольно мощно в своей способности позволять вам создавать внешние DSL, которые могут выполняться напрямую, а не для использования генерации кода, который, если подумать, на самом деле совсем не похож на DSL.

Я думаю, что вы на правильном пути.

Что я обычно делаю в подобной ситуации, так это разрабатываю простой язык, который отражает мои потребности, и пишу для него синтаксический анализатор LL1 (рекурсивный спуск).

Если в языке должен быть нетривиальный синтаксис C #, я могу либо процитировать это, либо просто заключить в скобки, которые я могу распознать, и просто передать это в выходной код.

Я могу либо заставить его сгенерировать древовидную структуру синтаксического анализа и сгенерировать, скажем, 3 разных вида кода на основе этого, либо я могу просто заставить его сгенерировать код "на лету", либо используя переменную mode с 3 значениями, либо просто одновременно записывать код в 3 разных выходных файла.

Есть более чем один способ сделать это.Если вы боитесь писать синтаксические анализаторы (как некоторые программисты), в другом месте по SO есть много помощи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top