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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Перемещение общего материала в наследуемые шаблоны
    Для совместного использования методов и блоков текста текстовыми шаблонами T4 можно использовать наследование.Дополнительные сведения см. в разделе Директива Template 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-схему или схему базы данных, иногда полезно создать доменный язык.Преимущество доменного языка заключается в создании класса для представления каждого узла в схеме и свойств для представления атрибутов.Это означает, что при программировании можно оперировать терминами бизнес-модели.Примеры.

    Team Members:
    <# foreach (Person p in team.Members) 
     { #> 
        <#= p.Name #> 
    <# } #>
    
  • Оцените целесообразность использования схем для моделей.
    Представление многих моделей и управление ими эффективнее всего осуществлять, если представить их в виде текстовых таблиц, особенно есть речь идет об очень крупных моделях.

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

    Для этой цели легко адаптировать классы UML и схемы деятельности.Кроме того, можно создать собственный вид схемы в качестве доменного языка.Код можно создавать на обоих языках — UML и DSL.Дополнительные сведения см. в разделах Моделирование приложения и Моделирование приложения.

См. также

Основные понятия

Создание кода во время разработки с помощью текстовых шаблонов T4

Создание текста во время выполнения с помощью текстовых шаблонов T4