Nano Hash - криптовалюты, майнинг, программирование

Зачем мне использовать генераторы кода

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

Вы можете объяснить, почему я должен использовать их в своих проектах и ​​как они могут облегчить мне жизнь.

Примеры будут отличными, и откуда я могу узнать эту тему немного больше.


  • Вопрос в том, почему бы и нет; В самом деле! Зачем использовать компиляторы? 23.03.2010
  • Кажется, что часто, когда требуется генерация кода, в основе этого лежит какая-то сложная нерешенная проблема. Часто это также связано с уровнем данных. 23.03.2010
  • @Mark Проблема NP SOAP может быть в игре. 30.03.2010

Ответы:


1

По крайней мере, вы правильно сформулировали вопрос =)

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

Классический пример этого - доступ к данным; вы можете сгенерировать 250 классов (по 1 для каждой таблицы в схеме), эффективно создав решение табличного шлюза, или вы можете создать что-то более похожее на модель предметной области и использовать NHibernate / ActiveRecord / LightSpeed ​​/ [выберите свой orm] для отображения богатой модели предметной области в базу данных.

Хотя и ручное решение, и ORM фактически являются генераторами кода, основное различие заключается в том, когда код генерируется. В ORM это неявный шаг, который происходит во время выполнения и, следовательно, является односторонним по своей природе. Решение, созданное вручную, требует явного шага для генерации кода во время разработки и вероятности того, что сгенерированные классы потребуют настройки в какой-то момент, что создаст проблемы при повторной генерации кода. Явный шаг, который должен произойти во время разработки, вносит трение в процесс разработки и часто приводит к коду, который нарушает DRY (хотя некоторые утверждают, что сгенерированный код никогда не может нарушать DRY).

Другая причина рекламировать генерацию кода связана с миром MDA / MDE (Model Driven Architecture / Engineering). Я не придаю этому большого значения, но вместо того, чтобы приводить ряд плохо выраженных аргументов, я просто собираюсь кооптировать кого-то другого - http://www.infoq.com/articles/8-reasons-why-MDE-fails.

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

Одним из типов генерации кода, который действительно повышает производительность, является «генерация микрокода», когда использование макросов и шаблонов позволяет разработчику генерировать новый код непосредственно в среде IDE и вводить / вводить свой путь через заполнители (например, пространство имен / имя класса и т. Д.) . Такая генерация кода - это функция resharper, и я интенсивно использую ее каждый день. Причина того, что микрогенерация выигрывает там, где большинство крупномасштабных генераций кода терпит неудачу, заключается в том, что сгенерированный код не привязан к какому-либо другому ресурсу, который должен быть синхронизирован, и поэтому, как только код сгенерирован, он такой же, как и весь другой код в решение.

@John
Перенос создания «базовых классов» из IDE в xml / dsl часто наблюдается при разработке «большого взрыва» - классическим примером может быть попытка разработчиков преобразовать базу данных в модель предметной области. Если генератор кода не очень хорошо написан, он просто создает дополнительную нагрузку на разработчика, поскольку каждый раз, когда им нужно обновить модель предметной области, им придется либо переключать контекст и обновлять xml / dsl, либо расширять модель предметной области. а затем перенесите эти изменения обратно в xml / dsl (эффективно выполняя работу дважды).

Есть некоторые генераторы кода, которые очень хорошо работают в этом пространстве (дизайнер LightSpeed ​​- единственный, о котором я могу думать о atm), выступая в качестве движка для поверхности дизайна, но часто эти генераторы кода генерируют ужасный код, который невозможно поддерживать (например, winforms / webforms, поверхность дизайна EF1) и, следовательно, быстро сводит на нет любые преимущества производительности, полученные от использования генератора кода в первую очередь.

22.03.2010
  • В вашей модели предметной области нет повторяющегося кода? Действительно? Вы не используете один и тот же код для каждого строкового свойства? 23.03.2010
  • @Neal: Как NHibernate и т. Д. Устраняют необходимость в генерации кода? Разве в этом случае вы просто не определяете классы и не генерируете сценарии для создания таблиц базы данных? Или вы вручную кодируете менее 250 классов и 250 таблиц, которые имеют много общих характеристик (т.е. нарушают DRY)? 23.03.2010
  • @John - не понимаю, к чему вы клоните, вашему аргументу недостает содержания. @Michael - я моделирую только то, что мне нужно, и если мне нужен большой домен, я бы смоделировал это, но проблемы с хранением не должны попадать в проблемы домена, что происходит, когда вы создаете код из базы данных. NH + FNH (или ConfORM) позволяет выражать модель и сопоставления в коде и является очень мощным подходом, особенно в сочетании с соглашением над конфигурацией. NH действительно позволяет генерировать DDL для создания базы данных, и это один из немногих подходящих случаев для генерации кода (SQL). 23.03.2010
  • @ Нил: Я не спорил, я задал вопрос, на который ты не ответил. Про кодогенерацию из БД я тоже ничего не сказал. Генерация кода может происходить из XML или другого представления модели вашей предметной области. 23.03.2010
  • @John Ваш вопрос не имеет смысла, и ваш аргумент ошибочен - просто потому, что базовая структура класса такая же, как и у всех других, не является хорошей причиной для генерации кода. Когда вы генерируете код, вы просто перекладываете бремя обслуживания на менее гибкий / более сложный носитель - сэкономленное время редко окупается в течение срока службы системы. 25.03.2010
  • @Neal: Я понятия не имею, какие инструменты генерации плохого кода вы использовали, но нет причин для их негибкости. Дублированная структура кода - прекрасная причина для генерации кода, если предположить, что различия между классами можно учесть в декларативных данных. 25.03.2010
  • Генерация кода - это больше, чем просто доступ к данным. Механизм ASP.NET для обработки файлов .aspx / .ascx - это генератор кода. Вы хотите сказать, что не будете использовать их и просто Response.Write("<b>blah</b>") все свои страницы? 25.03.2010
  • @codeka Механизмы создания шаблонов для генерации кода презентации - отличное место для использования генераторов кода, но мой ответ сосредоточен на генерации бизнес-кода, а не кода презентации. Кстати, я не использую Response.Write, если мне что-то нужно в веб-форме, я использую заполнители и литералы. 26.03.2010
  • @John Трудно с вами спорить, поскольку я еще не видел четко сформулированного обоснования того, почему вы считаете, что использование генерации кода лучше, чем не использовать его, поэтому у меня нет точки покупки, против которой можно было бы подготовить контраргумент. 26.03.2010
  • @Neal: Я не делал таких общих заявлений. Я уже говорил, что генерация кода может быть полезна для создания базовых классов из вашей модели предметной области (в XML или некотором DSL). Затем вы можете расширить классы предметной области с помощью логики предметной области, но создание базовой структуры классов является механическим процессом и может выполняться механически. 26.03.2010
  • @John См. Дополнительные моменты, которые я добавил при редактировании моего исходного ответа 29.03.2010
  • @Neal: Думаю, я не знаю, почему у вас нет инструментов, которые могут генерировать код прямо из вашей модели предметной области. Даже если необходимо перевести модель предметной области в XML или какой-либо другой формат, весь процесс должен быть достаточно автоматическим. 29.03.2010
  • @Neal: возможно, мы говорим о разных вещах и используем одни и те же термины. Какие инструменты вы используете для своих моделей предметной области? Когда я думаю о моделях предметной области и генерации кода, я думаю о моделях, построенных на DSL Toolkit (теперь Visualization and Modeling SDK), который входит в Visual Studio SDK; в противном случае - встроенный в Sparx Enterprise Architect. Инструмент VS может генерировать код или другие текстовые артефакты с помощью шаблонов T4; EA следует MDA и использует преобразования. У них обоих есть кодогенерация, очень близкая к модели. 29.03.2010
  • @John Мой домен смоделирован в коде и определен с помощью тестов. Ваши инструменты показывают, что вы следуете путем MSDN, тогда как я твердо нахожусь в лагере alt.net (если вы не понимаете ссылки, посмотрите «Основы программирования» Карла Сегина). Я серьезно сомневаюсь, что смогу выиграть с вами спор, потому что ваше мышление прочно закрепилось за MDA, тогда как я смотрю на MDA с жалостью и хочу, чтобы люди осознали, что построение системы требует большего, чем просто моделирование группы сущностей. 30.03.2010
  • @Neal: Рад, что мы разобрались с этим. Я бы не сказал, что вы вообще использовали моделирование. Я никогда не слышал о модели, которая является кодом - есть ли у вас справочник, в котором слово модель используется таким образом? Как я понял этот термин, модель и код должны иметь разные уровни абстракции. 30.03.2010
  • @Neal: Гуру ZOMG asp.net/nhibernate с 983 представителями на SO, он знает все и дал ответы на все комментарии, в том числе 3l33t, когда его пинают (code! = Model). 30.03.2010
  • Мой комментарий был плохим и был удален (комментировать, пока сварливый - плохая карма). Трудно написать контраргумент, если основное убеждение не сформулировано четко. О MDA не упоминали до 13-го комментария. Если бы MDA была поднята раньше, я бы лучше понял POV и поэтому ответил комментариями, которые больше соответствовали этой POV. Я сдался, потому что для победы в споре необходимо, чтобы обе стороны имели твердое мнение, которого придерживались слабо. Я никогда не утверждаю, что я гуру. Я просто публикую то, что понимаю, и принимаю исправления к моему пониманию, когда оказывается, что оно ошибочно. 30.03.2010
  • @Neal: как вы думаете, что делает NHibernate / ActiveRecord / LightSpeed ​​/ [выберите свой orm]? Они генерируют для вас код. Неважно, что они испускают код в динамические сборки, вопрос в том, что дешевле - втиснуть вашу проблему в существующую ORM или написать свои собственные генераторы? 30.03.2010
  • Спасибо за то, что довели суть аргумента до его простейшей формы. Генерация кода - это, по сути, преобразование одной абстракции в другую, различия заключаются в том, насколько различаются уровни абстракции между источником и целью и насколько явным является этап генерации кода. С ORM уровни очень близки, а генерация кода неявная (и явно односторонняя - код в sql). Это важно, потому что когда создается sql. Явная односторонняя генерация кода создает дополнительную нагрузку на любую систему, поскольку ее нельзя изменить без ее регенерации. 30.03.2010
  • @Neal: Я обычно не говорю таких вещей, но вам действительно нужно получить некоторый опыт работы с .NET. Большинство генераторов кода в пространстве .NET генерируют код в частичные классы. Их можно расширить, добавив еще одну часть класса в отдельный файл, который не затрагивается последующей генерацией кода. Кроме того, не все ORM производят прямое сопоставление с базой данных. В некоторых (например, .NET Entity Framework) одна модель на концептуальном уровне затем отображается в базу данных. Код создается только для концептуального уровня, поэтому изменения базы данных не влияют на потребителей сгенерированного кода. 31.03.2010
  • Джон, я хорошо знаком с частичными классами, и я использовал EF, оба оставляют кислый привкус во рту (хотя EF4 звучит так, как будто это шаг в правильном направлении). Я разработчик, а это значит, что я конвертирую пожелания клиентов в спецификации и использую эти спецификации для написания кода, который делает именно то, что требуется - не больше и не меньше. Я рассматриваю MDA как подход башни из слоновой кости для архитекторов, не занимающихся программированием. 06.04.2010
  • @JohnSaunders полностью согласен с понятием одной и той же структуры классов, одних и тех же директорий, даже тех же имен классов, пространств имен стандартных включенных шаблонов, тех же сущностей / методов миграции, тех же путей маршрутизации и т. Д. Примером является мой генератор кода, основанный на. файл конфигурации yaml - github.com/RJAPI/api-generator, вы даже можете добавить свой код там и по-прежнему иметь возможность восстанавливать стандартные методы / реквизиты / комментарии. 19.12.2018

  • 2

    Ну это либо:

    • вы пишете 250 классов, все они примерно одинаковы, но немного отличаются, например делать доступ к данным; занимает у вас неделю, и это скучно, подвержено ошибкам и раздражает

    OR:

    • вы вкладываете 30 минут в создание шаблона кода и позволяете механизму генерации выполнять основную работу еще за 30 минут

    Итак, генератор кода дает вам:

    • скорость
    • воспроизводимость
    • намного меньше ошибок
    • намного больше свободного времени! :-)

    Отличные примеры:

    • Шаблоны Linq-to-SQL T4 от Damien Guard для создания одного отдельного файла для каждого класса в модели вашей базы данных, используя лучший секрет Visual Studio 2008 - шаблоны T4

    • PLINQO - то же самое, но для генератора Codesmith

    и многое другое .....

    22.03.2010
  • вы пишете 250 классов, все в значительной степени одинаковые, но немного разные. Я не могу не думать, что если я когда-нибудь окажусь в таком положении, я буду делать это неправильно. Где-то по пути я должен был отступить и попытаться выяснить, почему я так часто повторяю себя, и что-то построил лучше (создать родительский класс или что-то в этом роде). 23.03.2010
  • @MGOwen: но наследование не всегда помогает. Таким способом не всегда удается выделить общий код. Рассмотрим случай уровня данных, где разница между классами, представляющими две сущности, будет включать набор столбцов для каждой сущности. Вы не можете исключить это, используя наследование. 23.03.2010
  • @MGOwen: что, если у вас есть база данных из 250 таблиц, и вам нужно написать какой-то общий репозиторий доступа к данным? Все таблицы в основном одинаковы - столбцы и строки, но столбцы различаются от таблицы к таблице. Не уверен, что наследование может сильно помочь в таком случае, но вам все равно нужно написать слой сопоставления между 250 таблицами базы данных и некоторой объектной моделью в памяти ... 23.03.2010
  • Я не понимаю, почему между вашими таблицами данных и вашей объектной моделью существует прямое соответствие. Вы должны использовать хранимые процедуры / подпрограммы для дальнейшего абстрагирования ваших данных ... это означает, что несколько таблиц будут использовать одну процедуру и т.д. Кроме того, вы должны попытаться сделать свои таблицы как можно более общими ... Таким образом, одна таблица / хранится процедура может обслуживать несколько представлений объекта. Используя все это вместе, вы сможете сократить количество необходимых вам таблиц / классов. 25.03.2010
  • Polaris878: Прошло много лет с тех пор, как я имел возможность определять свою собственную базу данных. По большей части мне приходится взаимодействовать с системами других поставщиков, где у меня нет возможности изменять их схемы или создавать хранимые процедуры. Почему бы мне не использовать codegen? 25.03.2010
  • @gabe: я думаю, он говорит, что ваша объектная модель должна быть абстракцией базы данных, а не сопоставляться с ней напрямую. 26.03.2010
  • Джон: Я не понимаю, почему эту абстракцию не следует генерировать, скажем, из XML-файла, который описывает, как схема должна отображаться на объекты. 26.03.2010
  • Ваш ответ игнорирует бремя обслуживания, которое генерация кода добавляет к любому решению, но, как и во всех решениях, есть время и место, где генерация кода уместна - я просто не думаю, что существует столько сценариев, как некоторые люди, похоже, думают. 29.03.2010
  • @Neal: как насчет бремени обслуживания, если вам нужно поддерживать 250 файлов, созданных вручную? Для меня это тоже не звучит весело ... 29.03.2010
  • Бремя возникает из-за того, что вам нужно поддерживать систему в нескольких местах, и если ваш инструмент для создания шаблонов не очень хорошо написан и ваши процессы его использования не понятны, вы добавляете больше трений, чем убираете. Редко, когда после создания вам нужно будет коснуться всех 250 файлов, чтобы исправить проблему или добавить функцию, но с помощью генерации кода вы не можете использовать подход, ориентированный на код, вы должны сначала изменить источник вашей модели (например, базу данных ), а затем регенерировать все 250 классов. Это добавляет трения и со временем приводит к обходным путям и взломам, которые искажают исходное намерение. 30.03.2010
  • @Neal: база данных не является источником модели. Модель, вероятно, будет на более высоком уровне абстракции, чем база данных. Часть модели будет описывать соответствие между концептуальным уровнем и логическим уровнем. Инструменты генерации кода, скорее всего, проигнорируют логический уровень и просто сгенерируют код на основе концептуальной модели. Я могу оптимизировать базу данных по своему усмотрению, сохраняя концептуальную модель, которую используют разработчики и генераторы кода. 30.03.2010

  • 3

    Каждый раз, когда вам нужно создать большое количество повторяющегося шаблонного кода, генератор кода - это тот, кто сделает эту работу. В последний раз я использовал генератор кода при создании настраиваемого уровня доступа к данным для проекта, где на основе объектной модели был создан каркас для различных действий CRUD. Вместо того, чтобы вручную кодировать все эти классы, я собрал генератор кода на основе шаблонов (используя StringTemplate), чтобы сделать это для меня. Достоинствами этой процедуры были:

    • Это было быстрее (нужно было сгенерировать большой объем кода)
    • Я мог бы по прихоти регенерировать код, если бы обнаружил ошибку (в ранних версиях кода иногда могут быть ошибки)
    • Меньше ошибок; когда у нас была ошибка в сгенерированном коде, она была везде, что означает, что ее можно было найти с большей вероятностью (и, как отмечалось в предыдущем пункте, ее было легко исправить и восстановить код) .
    22.03.2010

    4

    Использование построителей графического интерфейса, которые генерируют для вас код, является обычной практикой. Благодаря этому вам не нужно вручную создавать все виджеты. Вы просто перетаскиваете их и используете сгенерированный код. Для простых виджетов это действительно экономит время (я много использовал это для wxWidgets).

    22.03.2010

    5

    На самом деле, когда вы используете практически любой язык программирования, вы используете «генератор кода» (кроме ассемблера или машинного кода). Я часто пишу небольшие 200-строчные скрипты, которые выжимают несколько тысяч строк на C. Есть также программное обеспечение. вы можете получить, который помогает генерировать определенные типы кода (например, yacc и lex используются для генерации синтаксических анализаторов для создания языков программирования).

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

    Например, вот очень длинный и утомительный файл, который я (не) писал в рамках своей работы по модификации игрового движка CRX на основе Quake2. Он берет целочисленные значения всех констант #defined из двух заголовков и превращает их в "cvars" (переменные для игровой консоли).
    http://meliaserlow.dyndns.tv:8000/alienarena/lua_source/game/cvar_constants.c

    Вот короткий сценарий Bash, который сгенерировал этот код во время компиляции:
    http://meliaserlow.dyndns.tv:8000/alienarena/lua_source/autogen/constant_cvars.sh

    Что бы вы предпочли сохранить? Оба они эквивалентны с точки зрения того, что они описывают, но один из них намного длиннее и раздражает больше.

    22.03.2010

    6

    Канонический пример этого - доступ к данным, но у меня есть другой пример. Я работал над системой обмена сообщениями, которая обменивается данными через последовательный порт, сокеты и т. Д., И обнаружил, что мне постоянно приходилось писать такие классы снова и снова:

    public class FooMessage
    {
        public FooMessage()
        {
        }
    
        public FooMessage(int bar, string baz, DateTime blah)
        {
            this.Bar = bar;
            this.Baz = baz;
            this.Blah = blah;
        }
    
        public void Read(BinaryReader reader)
        {
            this.Bar = reader.ReadInt32();
            this.Baz = Encoding.ASCII.GetString(reader.ReadBytes(30));
            this.Blah = new DateTime(reader.ReadInt16(), reader.ReadByte(),
                reader.ReadByte());
        }
    
        public void Write(BinaryWriter writer)
        {
            writer.Write(this.Bar);
            writer.Write(Encoding.ASCII.GetBytes(
                this.Baz.PadRight(30).Substring(0, 30)));
            writer.Write((Int16)this.Blah.Year);
            writer.Write((byte)this.Blah.Month);
            writer.Write((byte)this.Blah.Day);
        }
    
        public int Bar { get; set; }
        public string Baz { get; set; }
        public DateTime Blah { get; set; }
    }
    

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

    Я не буду публиковать код code-gen, это много загадочного материала CodeDom, но суть в том, что я смог сжать всю систему до одного XML-файла:

    <Messages>
        <Message ID="12345" Name="Foo">
            <ByteField Name="Bar"/>
            <TextField Name="Baz" Length="30"/>
            <DateTimeField Name="Blah" Precision="Day"/>
        </Message>
        (More messages)
    </Messages>
    

    Насколько это проще? (Риторический вопрос.) Я наконец смог дышать. Я даже добавил несколько наворотов, чтобы он мог сгенерировать «прокси», и я мог написать такой код:

    var p = new MyMessagingProtocol(...);
    SetFooResult result = p.SetFoo(3, "Hello", DateTime.Today);
    

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

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

    25.03.2010
  • Я использовал библиотеку Google protobuf (code.google.com/p/protobuf) для создание высокопроизводительного кода сериализации / десериализации сообщений. Очень рекомендую его для таких ситуаций. 29.03.2010
  • @sblom: protobuf и protobuf-net отлично подходят, когда вам нужно собрать протокол обмена сообщениями с нуля, - не так хорошо, когда вам нужно придерживаться существующего протокола, который сложили вместе некоторые аппаратные парни. ;) 29.03.2010
  • Я приветствую ваше заключение, однако проблема также может быть решена путем создания чего-то, что могло бы читать метаданные, связанные с сообщением, и использовать их для интеллектуальной десериализации двоичного потока в сообщение. Такой подход значительно уменьшил бы количество фактического кода в системе. Это классический пример того, как, переоценив суть проблемы, вы можете создать более простое решение без кодогенерации. 30.03.2010
  • Я думал что-то вроде этого gist.github.com/348784, который имеет примерно то же содержание, что и ваш xml решение на основе (где вы все еще эффективно написали 300 сообщений). 30.03.2010
  • Я помню, как делал что-то подобное для преобразований C в Cobol с функциями проверки. Чтение метаданных было исключено, так как оно должно было выполняться как можно быстрее на нескольких платформах. 30.03.2010
  • @Neal: теперь расширьте свое решение для обработки вложенных сообщений, полиморфных сообщений (конечно они повторно использовали идентификаторы сообщений), последовательностей сообщений, обратного / прямого порядка байтов, пользовательских кодировок текста, контрольных сумм и всего остального. else, который входит в реальную систему обмена сообщениями и фактически пишет сериализатор, а не просто пример класса сообщения. И у вас по-прежнему есть решение, которое является значительно более подробным, менее прозрачным, более сложным для расширения (например, с использованием частичных классов), более подверженным ошибкам (не может применять определенные типы, например, с XSD) и только Выполнено на 50% (без пар запрос / ответ или прокси). 30.03.2010
  • Программисты, как правило, очень оптимистичны - они смотрят на любую сложную систему, делают дюжину упрощающих предположений и бах, я мог бы это сделать! Ни на минуту не думайте, что я не исследовал досконально возможность сериализатора на основе отражения. Да, и имейте в виду, что он должен поддерживать .NET 2.0 Framework, поэтому нельзя допускать Linq, деревья выражений или любые другие забавные вещи. 30.03.2010
  • Мои упрощающие предположения основывались на содержании предоставленного вами XML-файла. Фрагмент xml не содержит указаний на какие-либо дополнительные детали, которые вы подняли, поэтому куда вы вводите дополнительный контекст, необходимый для решения этих проблем, которые вы поднимаете? 30.03.2010
  • @Neal: Дополнительного контекста нет. Генератор кода предполагает это. Полиморфные сообщения используют IsCustom = "True", они генерируют частичный класс, а сообщение последовательности использует IsSequence = "True", так что вместо этого кодогенератор использует enumerable / list. Никакой дополнительной информации для создания прокси-сервера не требуется, синтаксис намного более краток, чем код, XSD обеспечивает проверку во время компиляции (чего не может сделать сопоставление атрибутов), и, кроме того, сгенерированный код сериализации занимает несколько порядков. намного эффективнее, чем Reflection, что важно для низкоуровневого протокола. 31.03.2010
  • Общедоступны ли подробности протокола? Мне интересно узнать об этом зверю, которого вы приручили. 31.03.2010
  • @Neal: Это не секрет, но я связан более чем одним NDA, что, вероятно, было очевидно из анонимного кода. И чтобы быть ясным, я не утверждаю, что выполнил какую-либо титаническую задачу; Я просто утверждаю, что разработать генератор кода было быстрее, чем разработать полную библиотеку сериализации. Думаю, вы переоцениваете сложность преобразования XML в CodeDom; весь инструмент не превышает 500 LOC или около того. 31.03.2010
  • Возможно, но теперь мне больше интересен протокол, чем сама задача, потому что это интересная проблема для решения, и если бы это был общедоступный протокол, я бы мог поиграть в свое время =) 31.03.2010
  • @Neal: Ну, я уверен, что смогу придумать что-то достаточно близкое к оригиналу, не раскрывая каких-либо существенных деталей технологии, и, возможно, опубликовать это как то, как бы вы реализовали этот CW - конечно, вам не хватало бы конечной точки чтобы протестировать его, и это было бы не очень поучительно в отношении реальных приложений. Если вы интересуетесь академическим ... конечно, оставайтесь, я что-нибудь опубликую, когда у меня будет время. Между прочим, учитывая возможность использования .NET 3.5, действительно быстрым решением было бы просто написать собственную кодировку / транспорт для WCF. 31.03.2010

  • 7

    Генератор кода полезен, если:

    1. Стоимость написания и обслуживания генератора кода меньше, чем стоимость написания и поддержки повторения, которое он заменяет.

    2. Согласованность, достигнутая с помощью генератора кода, уменьшит количество ошибок до степени, которая того стоит.

    3. Дополнительная проблема отладки сгенерированного кода не сделает отладку достаточно неэффективной, чтобы перевесить преимущества 1 и 2.

    29.03.2010

    8

    Для доменных или многоуровневых приложений генерация кода - отличный способ создать начальную модель или уровень доступа к данным. Он может произвести 250 классов сущностей за 30 секунд (или в моем случае 750 классов за 5 минут). После этого программист может сосредоточиться на улучшении модели с помощью отношений, бизнес-правил или получения представлений в MVC.

    Ключевым моментом здесь является то, что я говорю начальная модель. Если вы полагаетесь на генерацию кода для поддержки кода, то настоящая работа выполняется в шаблонах. (Как заявил Макс Э.) И остерегайтесь этого, потому что поддержание кода на основе шаблонов сопряжено с риском и сложностью.

    Если вы просто хотите, чтобы уровень данных был «автоматически создан», чтобы вы могли «заставить графический интерфейс работать за 2 дня», то я бы предложил использовать продукт / набор инструментов, ориентированный на управляемое данными или двухуровневое приложение. сценарий.

    Наконец, не забывайте «мусор на входе = мусор на выходе». Если весь ваш уровень данных однороден и не абстрагируется от базы данных, пожалуйста, спросите себя, зачем вам вообще нужен слой данных. (Если только вам не нужно выглядеть продуктивно :))

    23.03.2010
  • 750 занятий за 5 минут, теперь это большая модель предметной области! 23.03.2010

  • 9

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

    Здесь используются шаблоны t4 (встроенный в Visual Studio генератор кода) для создания сжатого CSS из файлов .less: http://haacked.com/archive/2009/12/02/t4-template-for-less-css.aspx

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

    22.03.2010

    10

    Здесь все говорят о простой генерации кода, но как насчет генерации кода на основе моделей (например, MDSD или DSM)? Это поможет вам выйти за рамки простых ORM / элементов доступа / генераторов шаблонов и перейти к генерации кода концепций более высокого уровня для вашей проблемной области.

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

    Подобно тому, как 3GL и ООП обеспечили увеличение абстракции за счет генерации большого количества ассемблерного кода на основе спецификации более высокого уровня, разработка, управляемая моделями, позволяет нам снова повысить уровень абстракции с еще одним увеличением производительности.

    MetaEdit + от MetaCase (зрелый) и ABSE от Isomeris (мой проект, в альфа-версии, информация на http://www.abse.info) - это две передовые технологии генерации кода на основе моделей.

    Что действительно необходимо, так это изменение мышления (как в 90-х годах требовалось ООП) ...

    29.03.2010
  • @Rui: хотя легко посмотреть свой профиль и увидеть вашу связь с ABSE, я рекомендую вам прямо указать это в своем ответе, чтобы вас не сочли спамером. 30.03.2010
  • Извини, Джон. Ты прав. Обычно я называю ABSE своим проектом (проверьте другие мои сообщения), но на этот раз я почему-то пропустил это. Я отредактировал ответ. 30.03.2010

  • 11

    Я фактически добавляю последние штрихи к генератору кода, который использую для проекта, для которого меня наняли. У нас есть огромные XML-файлы определений, и за несколько дней работы мне удалось сгенерировать более 500 классов C #. Если я хочу добавить функциональность ко всем классам, скажем, я хочу добавить атрибут ко всем свойствам. Я просто добавляю его в свой генератор кода, нажимаю - и бац! Я задолбался.

    Это действительно здорово, правда.

    25.03.2010

    12

    Есть много применений для генерации кода.

    Написание кода на знакомом языке и создание кода для другого целевого языка.

    • GWT - Java -> Javascript
    • MonoTouch - C# -> Objective-C

    Написание кода на более высоком уровне абстракции.

    • Компиляторы
    • Языки, специфичные для домена

    Автоматизация повторяющихся задач.

    • Уровни доступа к данным
    • Исходные модели данных

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

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

    30.03.2010

    13

    Если с генератором кода вы также намереваетесь использовать фрагменты, попробуйте разницу между вводом ctor + TAB и написанием конструктора каждый раз в ваших классах. Или проверьте, сколько времени вы зарабатываете, используя фрагмент для создания оператора switch, связанного с перечислением со многими значениями.

    22.03.2010

    14

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

    В качестве незначительного касательного момента, я думаю, это также объясняет тенденцию некоторых кодировщиков разбивать одну логическую единицу кода на как можно больше различных классов (когда-либо наследовать проект с классами LastName, FirstName и MiddleInitial?).

    22.03.2010

    15

    Вот какая ересь:

    Если задача настолько глупа, что ее можно автоматизировать во время написания программы (т.е. исходный код может быть сгенерирован сценарием, скажем, из XML), то то же самое можно сделать и во время выполнения (т.е. некоторое представление этого XML может можно интерпретировать во время выполнения) или с помощью некоторого метапрограммирования. Таким образом, по сути, программист был ленив, не пытался решить настоящую проблему, но нашел простой выход и написал генератор кода. В Java / C # посмотрите на отражение, а в C ++ на шаблоны

    30.03.2010
  • хотя мне очень нравится рефлексия и метапрограммирование, обычно это связано с падением производительности во время выполнения. 30.03.2010
  • истинный. Но с n-ядерными процессорами, работающими на частоте 3+ ГГц, это уже не имеет большого значения на стороне клиента. 30.03.2010
  • в среде разработки на стороне клиента - да, это вполне приемлемо. 30.03.2010
  • это зависит от платформы. Если бы я попробовал эту штуку среды выполнения в .NET, моя структура сгенерировала бы и скомпилировала код во время выполнения, после чего я бы запускал скомпилированный код. 31.03.2010
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..