Documente Academic
Documente Profesional
Documente Cultură
Oricarui element din metamodel (DslDefinition.dsl) de fapt corespunde o clasa cu proprietati, care
corespund proprietatilor si relatiilor definite in metamodel. Aceasta clasa este derivata dintr-o
anumita clasa (in dependenta de tipul elementului) predefinita si mosteneste un set de metode,
care permit accesarea, modificarea elementelor si proprietatilor lor, si navigarea in model.
Fiecare element din metamodel este legat cu notatia lui. Acestei notatiei tot corespunde o clasa
derivata dintr-o anumita clasa de prezentare (vezi fig.1 . roz – elemente model, albastru -
reprezentari)
Modelul particular creat in baza metamodelului reprezinta de fapt Instantele (obiectele) claselor
definite in metamodel :
Instantele claselor definite in DslDefinition.dsl sunt pastrate intr-o structura de date speciala numita
In-Memory Store (IMS) sau Store. Orice clasa definita in DSL preia Store ca argument al
constructorului. De exemplu:
Proprietati
Proprietatile claselor definite in metamodelul DSL, devin proprietatile claselor in codul de program
corespunzator:
Ion.Copii.Add(Maria);
// adaugarea relatiei intre obiect Ion si Maria, unde Maria este copil
Ion.Copii.Contains(Maria);
Maria.Parinti.Contains(Ion);
Maria.Parinti.Add(Ion);
Relatii
O relatie din metamodelul DSL poate avea instante intr-un model particular. Instantele relatiei se
numesc legaturi. O legatura intotdeauna are un element-sursa si un element-destinatie. Tipul lor
poate fi acelasi. Obiectul legaturii si proprietatile lui (sursa si destinatie) pot fi accesate in felul
urmator:
Daca in metamodel se permit legaturi multiple intre elemente, atunci aceste legaturi sun accesate cu
ajutorul GetLinks:
sau
In metamodelul (definitia DSL) la unele roluri particulare proprietatea Is Property Generated pot
avea valoarea false. Atunci pentru acest rol nu este generata proprietatea. Totusi si in acest caz
legaturile pot fi accesate si traversate, utilizand metodele clasei-relatie:
PresentationViewsSubject.GetPresentation(aPage)[0] as PageShape
Directoriu de elemente
Toate elementele din deposit Store pot fi accesate utilizand directoriu de elemente:
store.ElementDirectory.AllElements
store.ElementDirectory.FindElements(Persoana.DomainClassId);
store.ElementDirectory.GetElement(elementId);
Modificarea modelului
Oriche schimbare in model (in elemente, relatii, figuri, diagrame etc. ) trebuie facuta in asa numita
tranzactie. De exemplu:
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.
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.
Sabloane textuale sunt prelucrare in regimul experimental, cand depanati DSL, sau acolo unde veti
amplasa limbajul.
Sabloanele se pastreaza in fisiere textuale cu extensia .tt si contin urmatoarele tipuri de constructii :
Directivele sunt instructii generatorului despre cum, in baza carui model si unde va fi generat codul.
Exemplu de directiva (observati formatarea/marcajul) :
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!
<#
}
#>
Exista o variatie a blocurilor de control, utilizata pentru calcularea expresiilor si inserarea valorii in
text. Blocuri de control de tip expresie se delimiteaza prin simbolurile <#= ... #>
Exemplu:
De specificat procesorul de directive, care va permite accesarea tuturor claselor, relatiilor etc din
model si va incarca modelul din fisierul specificat
Exemplu:
<#@ template
inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransfor
mation" #>
<#@ output extension=".txt" #>
<#@ MyLanguage processor="MyLanguageDirectiveProcessor"
requires="fileName='Sample.myDsl1'" #>