IMHO dwa najważniejsze pojęcia pisząc skomplikowanych szablonów jest
- Oddzielenie modelu i widoku - Ułatwia utrzymywanie logiki szablonu do minimum (często przyczyną problemu technicznego). Osobiście uważam, że nie wymaga to ram, wymaga to tylko tego.
- Częściowo jest twoim przyjacielem - Używam generalnie T4 do generowania kodu szkieletu z modelu. Konkretne zachowanie może nie być warte wysiłku, aby wprowadzić model, lepiej często pozwalać, aby takie zachowanie pojawiło się poprzez użycie częściowych klas lub metod.
Nie tak ważne, ale ładny
- uczynić kod przeszukiwać - nie polegać na T4 Addons ponieważ uważam, żaden z nich na tyle dobra, z braku IntelliSense aby nawigować kod, który muszę wprowadzić do przeszukiwania kodu. Może być tak proste, jak zamiast wywoływania właściwości Column Name, nazywam ją ColumnName.
- Wstawianie "znaczników" na wyjściu - Ułatwia znajdowanie kodu, który wygenerował tę część danych wyjściowych.
Przykład oddzielenie modelu/Wygląd:
<#
// Model for Dependency Pooperties
Model = new []
{
new ClassDefinition ("MyDataGrid")
{
P ("CultureInfo" , "CultureInfo"),
P ("Pen" , "CellBorderPen"),
P ("IEnumerable<object>" , "Rows"),
C ("WColumnDefinition" , "Columns"),
},
};
#>
// Include the view
<#@ include file="..\T4\DependencyProperties.ttinclude" #>
Widok następnie przechodzi nad i tworzenia modelu właściwości zależności.
Zachowanie właściwości uzależniających są następnie realizowane jako metody częściowych
partial void Changed_Columns(
ObservableCollection<WColumnDefinition> oldValue,
ObservableCollection<WColumnDefinition> newValue
)
{
HookUpColumns(oldValue, null);
HookUpColumns(newValue, this);
}
Należy zauważyć, że wprowadzenie tego specyficzne zachowanie w modelu znacznie komplikuje modelu.
Wreszcie; Potrzeba czasu, aby kompetentny programista mógł kompetentnie pisać metaprogramy.Zajęło mi kilka prób, zanim dotarłem do stylu, który uważam za możliwy do utrzymania, ale dla mnie było to warte wysiłku, ponieważ jestem w stanie szybciej przesyłać jakość.
Mam nadzieję, że to pomoże ...
PS. Nie sądzę, by ktokolwiek twierdził, że T4 jest zawsze elegancki, ale mimo to jest to przydatne.
To może nie być opcja, ale ja wolę szablony Resharpera (http://www.jetbrains.com/resharper/features/code_templates.html) niż szablony T4. Ponadto, [Resharper] (http://www.jetbrains.com/resharper/) jest niesamowitym narzędziem do innych zastosowań. Warto kosztów. – TylerOhlsen
Resharper jest dobrym narzędziem, ale IMHO porównujące szablony Resharper z T4 porównuje jabłka i pomarańcze. Szablony Resharper promują anty-wzór "kopiuj-wklej" dzięki obsłudze narzędzi, co prowadzi do coraz więcej zbędnego kodu, który trzeba utrzymywać, zwiększając w ten sposób koszty utrzymania. T4 (i inne narzędzia) minimalizuje redundancję polegającą na tym, że piszesz meta-program (który ma niską redundancję), który generuje artefakty kodu (z dużą ilością redudancji). Kluczem jest to, że zwykłe połączenie meta-programu z wygenerowanym kodem nie zostanie utracone. – FuleSnabel