Поделиться через


Рекомендации по написанию текстовых шаблонов T4

Эти общие рекомендации могут быть полезны, если вы создаете код программы или другие ресурсы приложения в Visual Studio. Они не являются фиксированными правилами.

Рекомендации по шаблонам T4 во время разработки

Шаблоны T4 во время разработки — это шаблоны, создающие код в проекте Visual Studio во время разработки. Дополнительные сведения см. в статье Создание кода во время разработки с помощью текстовых шаблонов T4.

Создайте переменные аспекты приложения.

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

Кодирование аспектов переменной в одной или нескольких исходных моделях.

Модель — это файл или база данных, которые каждый шаблон считывает для получения определенных значений для переменных частей кода, которые необходимо создать. Модели могут быть базами данных, XML-файлами собственного дизайна, схем или языков, относящихся к домену. Как правило, одна модель используется для создания многих файлов в проекте Visual Studio. Каждый файл создается из отдельного шаблона.

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

Сосредоточьтесь на модели потребностей пользователей и словаря, а не на вашей реализации.

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

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

Проверьте созданный код.

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

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

Разрешить пользовательский код: создать частичные классы.

Разрешить код, который вы пишете вручную, в дополнение к созданному коду. Это необычно для схемы создания кода, чтобы иметь возможность учитывать все возможные варианты, которые могут возникнуть. Поэтому необходимо добавить или переопределить некоторые созданные коды. Где созданный материал находится на языке .NET, например C# или Visual Basic, особенно полезны две стратегии:

  • Созданные классы должны быть частичными. Это позволяет добавлять содержимое в созданный код.

  • Классы должны создаваться в парах, один наследует от другого. Базовый класс должен содержать все созданные методы и свойства, а производный класс должен содержать только конструкторы. Это позволяет рукописному коду переопределить любой из созданных методов.

В других созданных языках, таких как XML, используйте <#@include#> директиву, чтобы сделать простые сочетания рукописного и созданного содержимого. В более сложных случаях может потребоваться написать шаг после обработки, который объединяет созданный файл с любыми рукописными файлами.

Переместите общие материалы в файлы или шаблоны времени выполнения.

Чтобы избежать повторения аналогичных блоков текста и кода в нескольких шаблонах, используйте директиву <#@ include #> . Дополнительные сведения см. в директиве T4 Include.

Вы также можете создавать текстовые шаблоны во время выполнения в отдельном проекте, а затем вызывать их из шаблона времени разработки. Для этого используйте директиву <#@ assembly #> для доступа к отдельному проекту.

Рассмотрите возможность перемещения больших блоков кода в отдельную сборку.

Если у вас есть большие блоки кода и блоки функций класса, может быть полезно переместить некоторые из этого кода в методы, скомпилируемые в отдельном проекте. Директиву <#@ assembly #> можно использовать для доступа к коду в шаблоне. Дополнительные сведения см. в директиве T4 Assembly.

Методы можно поместить в абстрактный класс, который шаблон может наследовать. Абстрактный класс должен наследоваться от Microsoft.VisualStudio.TextTemplating.TextTransformation. Дополнительные сведения см. в директиве шаблона T4.

Создайте код, а не файлы конфигурации.

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

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

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

Используйте папку "Созданный код".

Поместите шаблоны и созданные файлы в папку проекта с именем "Созданный код", чтобы убедиться, что они не являются файлами, которые следует редактировать напрямую. Если создать пользовательский код для переопределения или добавления в созданные классы, поместите эти классы в папку с именем Custom Code. Структура типичного проекта выглядит следующим образом:

MyProject
   Custom Code
      Class1.cs
      Class2.cs
   Generated Code
      Class1.tt
          Class1.cs
      Class2.tt
          Class2.cs
   AnotherClass.cs

Рекомендации по шаблонам T4 во время выполнения (предварительная обработка)

Перемещение общих материалов в унаследованные шаблоны.

Для совместного использования методов и текстовых блоков между текстовыми шаблонами T4 можно использовать наследование. Дополнительные сведения см. в директиве шаблона T4.

Можно также использовать файлы с шаблонами времени выполнения.

Переместите большие тела кода в частичный класс.

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

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

Например, в MyReportText.tt:

The total is: <#= ComputeTotal() #>

В MyReportText-Methods.cs:

private string ComputeTotal() { ... }

Разрешить пользовательский код: укажите точки расширения.

Рекомендуется создавать виртуальные методы в <блоках компонентов класса #>+ . Это позволяет использовать один шаблон во многих контекстах без изменений. Вместо изменения шаблона можно создать производный класс, который предоставляет минимальную дополнительную логику. Производный класс может быть обычным кодом или шаблоном времени выполнения.

Например, в MyStandardRunTimeTemplate.tt:

This page is copyright <#= CompanyName() #>.
<#+ protected virtual string CompanyName() { return ""; } #>

В коде приложения:

class FabrikamTemplate : MyStandardRunTimeTemplate
{
  protected override string CompanyName() { return "Fabrikam"; }
}
...
  string PageToDisplay = new FabrikamTemplate().TextTransform();

Рекомендации по всем шаблонам T4

Разделение сбора данных из создания текста.

Старайтесь не смешивать вычислительные и текстовые блоки. В каждом текстовом шаблоне используйте первый <блок кода #> для задания переменных и выполнения сложных вычислений. От первого текстового блока до конца шаблона или первого <блока компонентов> класса #+, избегайте длинных выражений и избегайте циклов и условных условий, если они не содержат текстовые блоки. Эта практика упрощает чтение и обслуживание шаблона.

Не используйте .tt для включения файлов.

Используйте другое расширение имени файла, например .ttinclude для включения файлов. Используйте .tt только для файлов, которые необходимо обрабатывать как текстовые шаблоны во время выполнения или во время разработки. В некоторых случаях Visual Studio распознает .tt файлы и автоматически задает их свойства для обработки.

Запустите каждый шаблон как фиксированный прототип.

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

Рекомендуется использовать типизированные модели.

Хотя для моделей можно создать xml-схему или схему базы данных, возможно, полезно создать конкретный язык домена (DSL). DSL имеет преимущество, которое создает класс для представления каждого узла в схеме и свойств для представления атрибутов. Это означает, что вы можете программу с точки зрения бизнес-модели. Например:

Team Members:
<# foreach (Person p in team.Members)
 { #>
    <#= p.Name #>
<# } #>

Рассмотрите возможность использования схем для моделей.

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

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

Вы также можете разработать собственный тип схемы в качестве языка для конкретного домена (DSL). Код можно создать как из UML, так и из DSLs. Дополнительные сведения см. в разделе "Анализ и моделирование архитектуры".