Главная страница   /   3. Text Template Transformation Toolkit (T4) (Метапрограммирование в .NET

Метапрограммирование в .NET

Метапрограммирование в .NET

Кевин Хазард

3. Text Template Transformation Toolkit (T4)

В это главе рассматривается:

  • Дженерики как шаблоны
  • Введение в T4 и изучение полезных примеров с T4
  • Использование T4 внутри Visual Studio

Умение распознавать шаблоны и выгодно повторять проверенные шаблоны считается отличными качествами программиста. Разработчики программного обеспечения и архитекторы, которые имеют большие словари шаблонов, часто являются лучшими среди нас. Это те разработчики, которые редко пытаются изобретать сложные решения с нуля. Вместо этого они полагаются на хорошо известный передовой опыт, заимствования успешных решений других разработчиков, чтобы создать свои отличные работы. Генерация кода, которая рассматривается многими как форма метапрограммирования, как правило, является ключевой частью их успешной технологии разработки. Эта глава посвящена шаблонному метапрограммированию с использованием Text Template Transformation Toolkit (T4) от Microsoft, чтобы понять, как эти профессиональные разработчики думают и работают.

Среди объектно-ориентированных принципов проектирования SOLID, которые мы обсудили в первой главе, принцип DRY (Don’t Repeat Yourself) открыто говорит об опасности повторения. Согласно DRY, повторение плохо тем, что оно децентрализует влияние бизнес логики в коде, что приводит к неоднозначным, потенциально конфликтующим реализациям. Это может привести к повышению расходов на поддержку и потенциальным ошибкам, когда система будет развиваться. Однако, генерация кода на основе шаблонов – это все о повторении. Повторение – это хорошо или плохо? Ответ заключается в том, что это зависит от того, как и почему вы повторяете код.

Разработчики, которые начинают изучать принципы SOLID, часто ошибочно предполагают, что DRY обозначает "не повторять свой код". Это правда, что дублирование кода вручную является плохой практикой, в основном из-за проблем с поддержкой, которые вытекают из практики. Однако принцип DRY говорит о более высокоуровневом наборе проблем, таких как: власть, абстракция и неоднозначность бизнес логики. Системы генерации кода на основе шаблонов, которые полагаются на повторение дизайна, как правило, не нарушают принцип DRY, потому что они оставляют влияние и абстракции для шаблонов. Однако, остерегайтесь шаблоно-управляемых систем, которые позволяют или поощряют разработчиков редактировать код, который был выработан, потому что они почти наверняка заставят разработчиков нарушить принцип DRY.

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

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

Эта глава начинается с изучения того, что дженерики являются простой, но мощной формой метапрограммирования, которую использует сегодня почти каждый .NET разработчик. Мы продолжим эту линию мысли о метапрограммировании на основе шаблонов, рассмотрев то, как конкретно можно использовать T4, чтобы обеспечить гибкость в сценариях, где присутствие дженериков является технически трудным. Затем мы погрузимся в некоторые детали T4, помогая вам разобраться в архитектуре, а также в том, каким образом Visual Studio объединяет возможности, необходимые для упрощения кода.

3.1. Дженерик-типы в качестве шаблонов

3.2. Что такое T4

3.3. Более полезные примеры T4

3.4. Основы T4

3.5. Использование T4 с Visual Studio

3.6. Резюме