Вопрос

Используете ли вы инструменты генерации кода (помимо тех, которые используются для генерации прокси-серверов и от дизайнеров, встроенных в Visual Studio)?

Какие части вашего приложения вы создаете?

Вы обычно запускаете свой собственный генератор?Если да, то какой тип генератора вы пишете (шаблоны asp, coddom и т.д.).Если нет, то какие сторонние инструменты вы используете?

В настоящее время я работаю над несколькими различными проектами, все из которых используют пользовательский генератор кода, который обрабатывает все, начиная с создания структуры базы данных, бизнес-объектов, DAL и BLL.Мне любопытно узнать об опыте других людей с подобными инструментами.

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

Решение

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

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

На ум приходит код, который генерируется при создании Windows Form в Visual Studio.Вы можете посмотреть на сгенерированный код, если хотите, но лучше этого не делать.Однако переход на декларативный язык с помощью WPF был лучше, потому что программно манипулировать декларативным кодом чище и надежнее, чем императивным кодом.

Они должны были сделать то же самое с классами LINQ-To-SQL.Им нужен декларативный язык для классов, которые просто имеют свойства и не имеют пользовательского поведения.Вероятно, было бы проще сделать эти классы сущностей динамическими - изменяющимися автоматически при изменении базовой схемы базы данных.

Мы попытались использовать CodeSmith для создания классов .NetTiers для всех таблиц в нашей базе данных, но столкнулись с двумя проблемами:

  1. .NetTiers был раздут, а сгенерированный код был огромным.Я думаю, что инструменты генерации кода слишком упрощают создание feep.

  2. Поскольку схема активно разрабатывалась и пересматривалась, нам также пришлось многое создавать заново, и это в конечном итоге очень затруднило сохранение всего в системе управления версиями, потому что все файлы были восстановлены и заменены.В итоге я был не уверен, сгенерирован ли код следовало бы вообще находиться в системе управления версиями.

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

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

Да, но мы называем их стажерами.

Не то чтобы мы работали в домене .net / web, но самодельные инструменты генерации кода на различных самодельных языках являются важной частью нашей цепочки инструментов разработки.У нас есть два основных таких инструмента (с грамматиками, синтаксическими анализаторами и формальными определениями) и множество второстепенных, построенных на макросах, таких как m4 и perl.Все они в конце концов генерируют простой C, который изначально компилируется.

По моему опыту, языки, ориентированные на конкретную предметную область, являются одним из ключевых инструментов повышения производительности программистов в любой крупномасштабной разработке программного обеспечения.Если вы создаете такие вещи, как компиляторы, симуляторы или другое очень сложное программное обеспечение со множеством повторяющихся шаблонов, которые вообще не поддерживаются на базовых языках (что обычно означает переносимый C и иногда C ++), инструменты генерации кода - это правильный путь.Я рассматриваю языки, специфичные для конкретной предметной области, как следующий шаг в обобщении:сначала вы разбиваете общие вычисления на функции (или подпрограммы, чтобы быть историческими), затем вы разбиваете общие функции на шаблоны или дженерики, если такая возможность доступна, а затем вы разбиваете еще большую общность и повторяющийся код на полноценный пользовательский язык.

Все дело в сокращении объема кода, который вы на самом деле пишете, и устранении любой формы утомительного повторения и кода, не приносящего дополнительной ценности, из процесса программирования.Как только шаблоны повторятся, примените язык, специфичный для конкретного домена!

Я начал создавать свои собственные генераторы (доступ к данным, sprocs и т.д.) Еще тогда, когда занимался классической работой с asp (примерно в 2001 году).Я медленно перешел на CodeSmith, так как с ним было намного проще иметь дело.Я все еще в основном просто генерировал весь материал типа уровня доступа к данным (включая sprocs) для моего .NET-кода.

Пару лет назад я перешел от генерации кода макроса (т.е.CodeSmith) для генерации микро-кода.

Разница в том, что с CodeSmith я генерировал огромные участки кода для своего приложения, все универсальные и все сразу.Это стало проблематичным для крайних случаев и регенерации при изменении источника для шаблона (т. е.структура таблицы).Я также сталкивался со случаями, когда имелся большой запас несущего кода, который я не использовал, но был сгенерирован на основе моего шаблона.Сработали ли все эти методы?Может быть, а может, и нет.Вход и очистка сгенерированного кода потребовали бы огромного объема работы (т. е.после более чем года работы над одной и той же кодовой базой).

Напротив, микрогенерация кода позволяет мне генерировать именно те классы, которые мне нужны, в именно том сценарии, который я хочу.Основной инструмент, который я использую для этого, - ReSharper.Я делаю это, написав свои модульные тесты перед написанием производственного кода.В этом сценарии ReSharper использует мой модульный тест в качестве шаблона для автоматической генерации скелета для производственного кода.Тогда это просто вопрос заполнения пробелов.

Что касается доступа к данным, я больше ничего не генерирую.Я обнаружил, что хороший O / R M заменяет все, что я использовал для размещения на моем уровне доступа к данным (т. Е.NHibernate).Учитывая это, я никогда в жизни не напишу и не создам другой уровень доступа к данным (я отказываюсь это делать).

Кроме того, я получаю преимущества от наличия большого набора модульных тестов, среди прочего

Поскольку внутренний язык Fog Creek Software, Wasabi, имеет встроенные генераторы кода во время компиляции, мы используем их для автоматического создания основных компонентов наших классов сущностей, которые сопоставляются таблицам базы данных.Таким образом, вместо того, чтобы писать класс с дюжиной различных свойств и методов, мы можем просто написать:

<ActiveRecord("Kiwi")> _
Class CKiwi
End Class

и CKiwi будет иметь Load (ix как Int32), Commit() и поля / свойства для каждого столбца, определенного в его базовой схеме для таблицы Kiwi.Это избавляет нас от необходимости иметь огромные библиотеки O / R M, но все же позволяет нам быстро добавлять таблицу в наши продукты.

Генерация кода в духе компиляторов может быть великолепной.Генерация кода в духе "волшебников" неизменно оказывалась плохой идеей.

Раньше мы использовали CodeSmith для создания наших NHibernate hbms, наших сущностей и нескольких других вещей.Через некоторое время нам надоел этот поток, и мы отказались от него.

Генератор T4 бесплатен, и им стоит заняться для генерации.

Мы по-прежнему используем Castle CodeGenerator для генерации монорельсовых линий.

  1. Мы используем генераторы кода для исключений
  2. Генерация DAO для операций CRUD
  3. используйте JAXB для генерации кода
  4. Используйте XDoclet для создания локальных / домашних интерфейсов EJB
  5. Используйте шаблоны Velocity для создания документации для бизнес-моделей
  6. Используйте Apache Axis для создания заглушек WSDL

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

Я создаю свои собственные инструменты для некоторых задач.Это весело делать и даже экономит время в долгосрочной перспективе.Для очень скучных задач это даже спасает ваше здравомыслие.

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

Видишь Инструменты для создания тестовых примеров приведу один пример.

Мы используем LLBLGen для создания нашего уровня доступа к данным.Вы указываете генератору на базу данных, которую используете, выбираете, какие таблицы вы хотите использовать, и он создает необходимые классы.Все это делается очень быстро и просто.

У нас есть встроенный генератор кода, который обеспечивает доступ к базе данных.Человек записывает хранимые процедуры и получает соответствующие методы, абстрагированные в классе gateway.

Мы также создаем веб-сервисы для правильного взаимодействия с Flash, т. е.обработка исключений разумным образом.

Наконец-то у нас есть генератор исключений, который избавляет от рутинной работы с рекомендациями по исключениям (тонны конструкторов и т.д.)

У предыдущего работодателя у нас было самодельное VB.NET приложение, которое превращало файл определения XML-схемы (XSD) в статическую библиотеку C ++.Это значительно упростило работу с типами данных C ++ (bool, std::string и т.д.), и весь интересный XML-код был скрыт внутри этих сгенерированных классов.

Мы только начали использовать Grails здесь, в офисе.Ранее у нас был набор собственных скриптов генерации CRUD в JSF / Hibernate.

...Грааль побеждает.Генерация кода из Grails очень приятна и может обеспечить запуск CRUD-приложения примерно за 15 минут, фактически не помещая код в файлы кода!

Конечно, он МОЖЕТ сгенерировать фактический код в файлах кода, когда вы захотите его изменить.В большинстве случаев, для обычного CRUD, вам может сойти с рук простое изменение представлений.

Я использовал его для создания сериализуемых объектов данных, которые могли бы быть преобразованы на разных платформах (Windows, linux, solaris, mac, bsd и т.д.).Это было внутреннее решение.

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

Исходя из этого, будет сгенерирован JUnit-тест.Прелестно.

За исключением того, что ни один человек не потрудился им воспользоваться, и я не собрал ни одного тестового примера.

Как и некоторые другие здесь, мы также создали наш собственный генератор кода (Inon Datamanager / Viewmanager) для доступа к данным, обработки HTML-форм и определенных операций бизнес-логики.Ключом к тому, чтобы это хорошо работало, является его дизайн таким образом, чтобы вам никогда не приходилось прикасаться к сгенерированному коду или смотреть на него.

Таким образом, он почти становится частью языка - язык (Java в нашем случае) расширяется, чтобы включать спецификацию модели предметной области и viewmodel, а затем вы просто заполняете пользовательскую бизнес-логику реальным Java-кодом.

Это дает нам правильные инструменты для общения с аналитиками и бизнес-пользователями, сохраняя при этом возможности Java для настройки деталей базового поведения.

Если вас интересует LLBLGEN, который превосходен, вы также можете оценить subsonic.Может быть, даже посмотрим, что скажет Роб Конери о любом совпадении или взаимодействии между subsonic и t4.

Я написал и использую инструмент генерации кода на основе Xslt. http://perfectstorm.codeplex.com/

При этом используется единая корневая xml-модель для генерации dal, процедур, таблиц.

Я создал пользовательский фреймворк генерации кода, который генерирует прокси-классы для веб-служб на нескольких языках, таких как Java Script, Action Script, Java, C # и Objective C, я не использую шаблонов или инструментов, просто простой код на C #, который генерирует код с некоторыми вспомогательными классами, генерация кода действительно может сэкономить много времени, но я думаю, что сгенерированный код должен быть максимально простым и им не следует злоупотреблять.

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