Documente Academic
Documente Profesional
Documente Cultură
Proprietati
Proprietatile claselor definite in metamodelul DSL, devin proprietatile claselor in
codul de program corespunzator:
PageElement aPage = ... ;
if (aPage.isRoot == True) ... ;
if (aPage.Address.EndsWith(".html")) ... ;
Daca intre doua clase este definite o relatie, atunci instantele ambelor clase au
proprietati, care permit navigarea catre capatul opus al legaturii. Denumirile
proprietatilor apar in metamodel ca etichetele rolurilor asupra ambelor capetelor
relatiei. In dependenta de multiplicitatea rolului, tipul proprietatii
corespunzatoare va fi o clasa sau o colectie de clase. De exemplu, daca avem o
relatie numita ParintiAuCopii intre doua Persoane, capetele relatiei avand roluri
multiple Parinti si, respectiv, Copii, atunci poate fi scris codul urmator:
Ion.Copii.Add(Maria);
// adaugarea relatiei intre obiect Ion si Maria, unde Maria este copil
Relatii
O relatie din metamodelul DSL poate avea instante intr-un model particular.
Instantele relatiei se numesc legaturi. O legatura intotdeauna are un elementsursa si un element-destinatie. Tipul lor poate fi acelasi. Obiectul legaturii si
proprietatile lui (sursa si destinatie) pot fi accesate in felul urmator:
sau
foreach (ParintiAuCopii legatura in ParintiAuCopii.GetLinksToChildren(Ion)) {...}
Directoriu de elemente
Toate elementele din deposit Store pot fi accesate utilizand directoriu de
elemente:
store.ElementDirectory.AllElements
DomainRelationshipInfo relationship =
link.GetDomainRelationship();
DomainRoleInfo sourceRole = relationship.DomainRole[0];
Modificarea modelului
Oriche schimbare in model (in elemente, relatii, figuri, diagrame etc. ) trebuie
facuta in asa numita tranzactie. De exemplu:
using (Transaction t = store.TransactionManager.BeginTransaction("updates"))
{
// schimbari in depozit
t.Commit();
}
Daca o exceptie are loc in timpul schimbarilor, astfel incat metoda Commit() nu
este indeplinita, atunci depozitul Store va fi resetat in starea sa initiala. Astfel
modelul niciodata nu va fi inconsistent.
Cea mai buna metoda este utilizarea instructiunii try catch:
transaction.Commit(); // Important!
In cadrul tranzactiei poate fi facut orice numar de schimbari. Tranzactii noi pot fi
deschise in cadrul unei tranzactiei active. Apelul la metoda Commit la incheierea
tranzactiei face toate schimbarile permanente. In cazul unei exceptiei depozitul
restabileste starea precedenta.
Directivele sunt instructii generatorului despre cum, in baza carui model si unde
va fi generat codul. Exemplu de directiva (observati formatarea/marcajul) :
<#@ output extension=".txt" #>
Textul nu are nici o formatare speciala si se copie fara nici o schimbare, pastrand
pozitia initiala. In exemplu urmator va fi generat fisier txt care contine cuvantul
Hello :
<#@ output extension=".txt" #>
Hello
In sabloane t4 blocuri de control nu pot contine alte blocuri de control, dar pot fi
mixate cu blocuri de text :
<#
for(int i = 0; i < 4; i++)
{
#>
Hello!
<#
}
#>