Как известно, страшным грехом в современном программировании считаются синдром NIH, изобретение велосипедов и попытки решить уже решенные задачи, а уже нахождение новых задач - страшнейшее богохульство, на уровне осквернения могил и нежелания смотреть олимпиаду по телевизору.
В связи с этим, в своих дотнет-проектах я стараюсь использовать два стандарных инструмента: MSBuild для сборки и t4 для генерации повторяющегося кода.
Так вот, если первый всего лишь содержит мелкие странности (типа считает переменные окружения своими переменными, но не передает автоматически свои обычные переменные, если вызывает сам себя и не содержит внятных средств организации подпроцедур - т.е. области видимости переменных в нем - это ad-hoc ад писанный людьми, которые никогда не читали SICP), то второй - это теоретически правильное, но неудобное при разработке дичайшее безумие.
И я уверен, что аналогичный темплейтер, сделанный на clojure, был бы намного понятнее, нежели "готовое" решение.
В связи с этим, в своих дотнет-проектах я стараюсь использовать два стандарных инструмента: MSBuild для сборки и t4 для генерации повторяющегося кода.
Так вот, если первый всего лишь содержит мелкие странности (типа считает переменные окружения своими переменными, но не передает автоматически свои обычные переменные, если вызывает сам себя и не содержит внятных средств организации подпроцедур - т.е. области видимости переменных в нем - это ad-hoc ад писанный людьми, которые никогда не читали SICP), то второй - это теоретически правильное, но неудобное при разработке дичайшее безумие.
И я уверен, что аналогичный темплейтер, сделанный на clojure, был бы намного понятнее, нежели "готовое" решение.
no subject
Date: 2014-02-15 09:44 am (UTC)no subject
Date: 2014-02-15 10:01 am (UTC)no subject
Date: 2014-02-15 10:13 am (UTC)no subject
Date: 2014-02-15 10:55 am (UTC)Т.е. берем анемик класс, добавляем руками поведения в соседнем файле и все заебца.
no subject
Date: 2014-02-15 11:03 am (UTC)И чисто интересно, что за предметные области, в которых модели можно генерить, а главное что является исходником? База данных что ли?
no subject
Date: 2014-02-15 11:44 am (UTC)Исходником для t4 является сам шаблон, код типа:
FieldDesc[] fields = new FieldDesc[] {
new FieldDesc("string","Caption"),
new FieldDesc("int","Level"),
new FieldDesc("string","Reference"),
new FieldDesc("string","Default"),
new FieldDesc("string","Type")
};
Но конкретно это не объекты предметки, это всякая внутренняя хрень, типа "описание настроек полей" или прочие классы для таскания данных между частями системы, в т.ч. и через разного рода текстовые форматы.
no subject
Date: 2014-02-15 09:51 am (UTC)no subject
Date: 2014-02-15 10:04 am (UTC)no subject
Date: 2014-02-15 10:23 am (UTC)no subject
Date: 2014-02-15 09:54 am (UTC)no subject
Date: 2014-02-15 10:04 am (UTC)no subject
Date: 2014-02-15 10:20 am (UTC)T4 в таком ракурсе предстает уже ошибкой третьего порядка - сначала менеджеры-идиоты придумали шаблонизаторы, потом воспитали себе юнитов-дебилов-программистов, которые потом сделали T4 по образу и подобию шаблонизаторов html для юнитов-дебилов, сделанных по ошибке менеджерами-идиотами.
no subject
Date: 2014-02-15 11:12 am (UTC)no subject
Date: 2014-02-15 11:33 am (UTC)no subject
Date: 2014-02-15 11:38 am (UTC)no subject
Date: 2014-02-15 11:44 am (UTC)По факту всегда образуется слой-обертка над этими всеми div-ами и span-ами, и зачем и что в шаблонах надо писать близко к тексту становится совсем непонятно.
no subject
Date: 2014-02-15 11:56 am (UTC)no subject
Date: 2014-02-15 12:03 pm (UTC)no subject
Date: 2014-02-15 12:06 pm (UTC)no subject
Date: 2014-02-15 12:11 pm (UTC)no subject
Date: 2014-02-15 10:01 am (UTC)no subject
Date: 2014-02-15 10:13 am (UTC)<!-- ================================================================ _ComputeNonExistentFileProperty There are certain situations in which we want to always run the CoreCompile target (and thus the Csc task), even if the timestamps of the outputs appear to be up-to-date on disk. If we're inside the IDE during design-time, then the Csc/Vbc/Vjc task is simply being used to initialize the host compiler, so we always want to run it. Also, if we're inside the IDE, and the host compiler is responsible for doing the compilation during an actual build, we want to let the host compiler determine whether the output is up-to-date, because there may be source files in the IDE's in-memory buffers that we don't know about. So, we always run the CoreCompile target if we're in the IDE, and either we're in design-time or we're delegating to the host compiler for the actual build. We compare against BuildOutOfProcess != true because we cannot assume that the build process will have set BuildOutOfProcess to true or false. Therefore the default behavior should be to do the legacy behavior seen before BuildingOutOfProcess was introduced if the property is not set. ================================================================ --> <Target Name="_ComputeNonExistentFileProperty" Condition="('$(BuildingInsideVisualStudio)' == 'true') and ('$(BuildingOutOfProcess)' != 'true') and (('$(BuildingProject)' == 'false') or ('$(UseHostCompilerIfAvailable)' == 'true'))"> <PropertyGroup> <NonExistentFile>__NonExistentSubDir__\__NonExistentFile__</NonExistentFile> </PropertyGroup> </Target>