Sdílet prostřednictvím


Pokyny pro tvorbu textových šablon T4

Tyto obecné pokyny můžou být užitečné, pokud generujete programový kód nebo jiné prostředky aplikace v sadě Visual Studio. Nejsou pevná pravidla.

Pokyny pro šablony T4 v době návrhu

Šablony T4 v době návrhu jsou šablony, které vygenerují kód v projektu sady Visual Studio v době návrhu. Další informace naleznete v tématu Generování kódu v době návrhu pomocí textových šablon T4.

Vygenerujte proměnné aspekty aplikace.

Generování kódu je nejužitečnější pro aspekty aplikace, které se můžou během projektu změnit, nebo se změní mezi různými verzemi aplikace. Tyto proměnné oddělte od invariantnějších aspektů, abyste mohli snadněji určit, co se má vygenerovat. Pokud například vaše aplikace poskytuje web, oddělte standardní funkce obsluhy stránek od logiky, která definuje navigační cesty z jedné stránky do druhé.

Zakódujte proměnné v jednom nebo více zdrojových modelech.

Model je soubor nebo databáze, které každá šablona čte, aby získala konkrétní hodnoty pro části proměnné kódu, které se mají vygenerovat. Modely můžou být databáze, soubory XML vlastního návrhu, diagramů nebo jazyků specifických pro doménu. Jeden model se obvykle používá k vygenerování mnoha souborů v projektu sady Visual Studio. Každý soubor se vygeneruje ze samostatné šablony.

V projektu můžete použít více než jeden model. Můžete například definovat model pro navigaci mezi webovými stránkami a samostatný model pro rozložení stránek.

Zaměřte model na potřeby uživatelů a slovní zásobu, ne na vaši implementaci.

Například v webové aplikaci byste očekávali, že model bude odkazovat na webové stránky a hypertextové odkazy.

V ideálním případě zvolte formu prezentace, která odpovídá druhu informací, které model představuje. Příkladem modelu navigačních cest procházejících webem může být diagram polí a šipek.

Otestujte vygenerovaný kód.

Pomocí ručních nebo automatizovaných testů ověřte, že výsledný kód funguje podle potřeby uživatelů. Vyhněte se generování testů ze stejného modelu, ze kterého se kód generuje.

V některých případech lze obecné testy provádět přímo v modelu. Můžete například napsat test, který zajistí, že každá stránka na webu bude přístupná pomocí navigace z libovolné jiné stránky.

Povolit vlastní kód: vygenerujte částečné třídy.

Kromě vygenerovaného kódu povolte také kód, který píšete ručně. Schéma generování kódu je neobvyklé, aby bylo možné zohlednit všechny možné varianty, které by mohly vzniknout. Proto byste měli očekávat, že přidáte nebo přepíšete některý vygenerovaný kód. Pokud je vygenerovaný materiál v jazyce .NET, jako je C# nebo Visual Basic, jsou užitečné zejména dvě strategie:

  • Vygenerované třídy by měly být částečné. Díky tomu můžete do vygenerovaného kódu přidat obsah.

  • Třídy by měly být generovány ve dvojicích, jeden dědí z druhého. Základní třída by měla obsahovat všechny generované metody a vlastnosti a odvozená třída by měla obsahovat pouze konstruktory. Díky tomu může váš ručně napsaný kód přepsat některou z vygenerovaných metod.

V jiných generovanýchch <#@include#> Ve složitějších případech možná budete muset napsat krok následného zpracování, který kombinuje vygenerovaný soubor s libovolnými ručně napsanými soubory.

Přesuňte běžný materiál do souborů nebo šablon za běhu.

Pokud se chcete vyhnout opakování podobných bloků textu a kódu ve více šablonách, použijte direktivu <#@ include #> . Další informace naleznete v tématu T4 Include – direktiva.

Můžete také vytvořit textové šablony za běhu v samostatném projektu a pak je volat ze šablony návrhu. K tomu použijte direktivu <#@ assembly #> pro přístup k samostatnému projektu.

Zvažte přesunutí velkých bloků kódu do samostatného sestavení.

Pokud máte velké bloky kódu a bloky funkcí tříd, může být užitečné některé z těchto kódů přesunout do metod, které kompilujete v samostatném projektu. Direktivu <#@ assembly #> můžete použít pro přístup k kódu v šabloně. Další informace naleznete v tématu T4 Assembly Direktiva.

Metody můžete vložit do abstraktní třídy, kterou může šablona dědit. Abstraktní třída musí dědit z Microsoft.VisualStudio.TextTemplating.TextTransformation. Další informace naleznete v tématu T4 Template – direktiva.

Vygenerujte kód, ne konfigurační soubory.

Jednou z metod zápisu proměnné aplikace je napsání obecného kódu programu, který přijímá konfigurační soubor. Aplikace napsaná tímto způsobem je velmi flexibilní a lze ji překonfigurovat při změně obchodních požadavků bez opětovného sestavení aplikace. Nevýhodou tohoto přístupu je ale to, že aplikace bude fungovat méně dobře než konkrétnější aplikace. Jeho programový kód bude také obtížnější číst a udržovat, částečně proto, že musí vždy řešit nejběžnější typy.

Naproti tomu aplikace, jejíž proměnné části jsou generovány před kompilací, mohou být silného typu. Díky tomu je mnohem jednodušší a spolehlivější psát ručně napsaný kód a integrovat ho s vygenerovanými částmi softwaru.

Pokud chcete získat úplnou výhodu generování kódu, zkuste místo konfiguračních souborů vygenerovat kód programu.

Použijte složku vygenerovaného kódu.

Šablony a vygenerované soubory umístěte do složky projektu s názvem Vygenerovaný kód, aby bylo jasné, že se nejedná o soubory, které by se měly upravovat přímo. Pokud vytvoříte vlastní kód pro přepsání nebo přidání do vygenerovaných tříd, umístěte tyto třídy do složky s názvem Vlastní kód. Struktura typického projektu vypadá takto:

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

Pokyny pro šablony T4 (předzpracované) za běhu

Přesuňte běžný materiál do zděděných šablon.

Dědičnost můžete použít ke sdílení metod a textových bloků mezi textovými šablonami T4. Další informace naleznete v tématu T4 Template – direktiva.

Můžete také použít soubory, které mají šablony za běhu.

Přesuňte velká těla kódu do částečné třídy.

Každá šablona za běhu generuje částečnou definici třídy, která má stejný název jako šablona. Můžete napsat soubor kódu, který obsahuje další částečnou definici stejné třídy. Tímto způsobem můžete do třídy přidat metody, pole a konstruktory. Tyto členy lze volat z bloků kódu v šabloně.

Výhodou je, že psaní kódu je snazší, protože technologie IntelliSense je k dispozici. Můžete také dosáhnout lepšího oddělení mezi prezentací a základní logikou.

Například v MyReportText.tt:

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

V souboru MyReportText-Methods.cs:

private string ComputeTotal() { ... }

Povolit vlastní kód: zadejte body rozšíření.

Zvažte generování virtuálních metod v <blocích funkcí třídy #+>. To umožňuje použití jedné šablony v mnoha kontextech beze změny. Namísto úprav šablony můžete vytvořit odvozenou třídu, která poskytuje minimální dodatečnou logiku. Odvozená třída může být buď běžný kód, nebo může být šablonou za běhu.

Například v MyStandardRunTimeTemplate.tt:

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

V kódu aplikace:

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

Pokyny pro všechny šablony T4

Oddělení shromažďování dat od generování textu

Snažte se vyhnout kombinování výpočtů a bloků textu. V každé textové šabloně použijte první <blok kódu #> k nastavení proměnných a provádění složitých výpočtů. Od prvního bloku textu dolů na konec šablony nebo prvního <bloku funkce třídy #>+, vyhněte se dlouhým výrazům a vyhněte se smyčkám a podmíněným postupem, pokud neobsahují textové bloky. Tento postup usnadňuje čtení a údržbu šablony.

Nepoužívejte .tt pro zahrnutí souborů.

Pro zahrnutí souborů použijte jinou příponu .ttinclude názvu souboru. Používejte .tt pouze soubory, které chcete zpracovat jako textové šablony za běhu nebo návrhu. V některých případech Sada Visual Studio rozpozná .tt soubory a automaticky nastaví jejich vlastnosti pro zpracování.

Spusťte každou šablonu jako pevný prototyp.

Napište příklad kódu nebo textu, který chcete vygenerovat, a ujistěte se, že je správný. Potom změňte jeho rozšíření na .tt a přírůstkově vložte kód, který upraví obsah čtením modelu.

Zvažte použití typových modelů.

I když pro své modely můžete vytvořit schéma XML nebo databáze, může být užitečné vytvořit jazyk DSL (Domain Specific Language). DSL má výhodu, že generuje třídu představující každý uzel ve schématu a vlastnosti představující atributy. To znamená, že můžete programovat z hlediska obchodního modelu. Příklad:

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

Zvažte použití diagramů pro vaše modely.

Mnoho modelů se nejúčelněji prezentuje a spravuje jednoduše jako textové tabulky, zejména pokud jsou velmi velké.

U některých typů obchodních požadavků je však důležité objasnit složité sady vztahů a pracovních toků a diagramy jsou nejvhodnějším prostředkem. Výhodou diagramu je, že je snadné diskutovat s uživateli a dalšími účastníky. Generováním kódu z modelu na úrovni obchodních požadavků můžete kód při změně požadavků usnadnit.

Můžete také navrhnout vlastní typ diagramu jako jazyk specifický pro doménu (DSL). Kód lze vygenerovat z UML i ze seznamů DSLS. Další informace najdete v tématu Analýza a modelování architektury.