42
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea Calităţii ( Asigurarea Calităţii (QA QA) Automatizarea activit Automatizarea activităților de ăților de dezvoltare dezvoltare Generatoare Generatoare dezvoltare. dezvoltare. Generatoare Generatoare. Ciprian Dobre Ciprian Dobre [email protected] Instrumente pentru dezvoltarea programelor – Curs 9 1

Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Asigurarea Calităţii (Asigurarea Calităţii (QAQA))g ţ (g ţ ( ))Automatizarea activitAutomatizarea activităților de ăților de

dezvoltaredezvoltare GeneratoareGeneratoaredezvoltare. dezvoltare. GeneratoareGeneratoare..

Ciprian DobreCiprian [email protected]

Instrumente pentru dezvoltarea programelor – Curs 9 1

Page 2: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

SumarSumarSu aSu a

• Generatoare• Siguranţa generatoarelor

J E itt T l t (JET)• Java Emitter Templates (JET)• Exemple JETp

– Optimizare: Evaluare ParţialăŞabloane de Proiectare: Şablonul Factory– Şabloane de Proiectare: Şablonul Factory

– Algoritmi: Automate cu Stări Finite

2Instrumente pentru dezvoltarea programelor – Curs 9

Page 3: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

GeneratoareGeneratoareGeneratoareGeneratoare“The simplest scheme of The simplest scheme of

evolution is one that depends on two processes; a generator and

a test The task of the a test. The task of the generator is to produce variety,

new forms that have not existed previously whereas the existed previously, whereas the

task of the test is to cull out the newly generated forms so th t l th th t ll that only those that are well fitted to the environment will

survive.”

3

(Herbert Simon)

Instrumente pentru dezvoltarea programelor – Curs 9

Page 4: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

GeneratoareGeneratoare• Generatoarele sunt programe ce pot genera diverse

artefacteEl t ti ă t f t l t t ă• Ele automatizează crearea artefactelor ce au o structură bine înţeleasă şi regulată

• Artefactele generate variază cel mai adesea în funcţie deArtefactele generate variază cel mai adesea în funcţie de intrarea generatorului

• Exemple:Compilatorul: generează cod binar pornind de la codul sursă– Compilatorul: generează cod binar pornind de la codul sursă

– JavaDoc: generează pagini HTML pe baza comentariilor din codul sursăGreen: generează cod sursă pornind de la diagrame de clase– Green: generează cod sursă pornind de la diagrame de clase

– Servlets: generează pagini HTML– Java Server Pages (JSP): generează Servlets

GeneratorInput

(Parameter) Output

4

Generator(Parameter) p

Instrumente pentru dezvoltarea programelor – Curs 9

Page 5: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Programarea GenerativăProgramarea Generativăog a a ea Ge e at ăog a a ea Ge e at ă• Există “task-uri de rutină” de programare ce sunt

întotdeauna similareîntotdeauna similare• Doar mici variaţii în funcţie de anumiţi parametrii• Programarea generativă încearcă automatizarea acestor g g

task-uri folosind generatoare de program parametrizatepentru diverse părţi ale programului

• Generatoarele de program sunt meta-programe:Generatoarele de program sunt meta programe: programe ce lucrează cu alte programe

• Meta-programarea poate fi sofisticată şi potenţial nesigurăDi b dă i l ă ii ti• Diverse abordări ale programării generative– Instrumente externe: programe de sine stătătoare ce efectuează

un task particular de generare de program (e.g. compilator, t d il t )generator de compilator)

– Elemente generative de limbaj: construcţii pentru generarea integrată într-un limbaj de programareAd t f i t ţii d i l î lt î

5

Adesea transformare a unor noi construcţii de nivel înalt în construcţii de nivel scăzut (adesea numite ‘macrouri’)

Instrumente pentru dezvoltarea programelor – Curs 9

Page 6: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Tipare Tipare & & Aplicaţii ComuneAplicaţii Comunepa epa e && p caţ Co u ep caţ Co u e• Class extensions

Input: clasa ce trebuie extinsă & informaţii suplimentarep ţ pOutput: subclasa conţinând funcţionalităţi suplimentareE.g. clone, hashcode, equals, print, serialize, copy

• ProxiesProxiesInput: tipul şi metodele/câmpurile ce trebuie protejateOutput: subclasa conţinând semantici modificateE.g. monitorizare, acces la distanţă, managementul resurselor, g ţ gcontrolul accesului

• WrappersInput: tipuri, metode, câmpuri ce trebuie înveliteO fOutput: clasa wrapper cu interfaţa corespunzătoareE.g. Integrarea de componente legacy

• InterfacesInput: descrierea interfeţeiOutput: diverse tipuri de interfeţeE.g. DB interface, GUI, web interface, API

6Instrumente pentru dezvoltarea programelor – Curs 9

Page 7: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

TempleturiTempleturie p etue p etu• Codul ce generează cod poate fi complex• Exemplu: construirea unui Abstract Syntax Tree (AST) p y ( )

pentru codul generat

JavaClass c = new JavaClass("GeneratedClass");c.extends = x;c.fields.add(new Field(TYPE_INTEGER, "myVar"));

– Greu de surprins exact ce se crează

• Abordare mai bună: templeturipclass GeneratedClass extends @x@ {

Integer myVar;

– Ieşirea este redată în forma ei naturalăÎ l il î i i il i ă t i d t

}

7

– În locurile în care ieşirile variază putem insera cod generator(e.g. @x@)

Instrumente pentru dezvoltarea programelor – Curs 9

Page 8: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

ExExeemplmpluu::GG G &SG &SGenerator Generator Getter&SetterGetter&Setter

• Convenţia Java: clasele furnizează metode getter şi setter pentru accesarea ariabilelor membreaccesarea variabilelor membre

• Poate fi util, e.g. pentru pattern-ul observer• Metodele simple getter şi setter reprezintă cel mai adesea muncă de

rutinărutină• Putem automatiza procesul folosind un generator:

class PersonWithGetterSetter {String name;int age;

class Person {String name;int age;

String getName() { return name; }void setName(String v) {

name = v;

int age;}

;}int getAge() { return age; }void setAge(int v) { age = v; }

8

void setAge(int v) { age = v; }}

Instrumente pentru dezvoltarea programelor – Curs 9

Page 9: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

ExExeemplmpluu::R t M th d C llR t M th d C llRemote Method CallsRemote Method Calls

• Apelarea de metode ale unor obiecte aflate pe alte fcalculatoare ca şi cum ele ar fi locale

• Necesită o nouă clasă: stubul clientului– Pentru obiectul reprezentând local obiectul de la distanţăPentru obiectul reprezentând local obiectul de la distanţă– Are aceeaşi semnătură ca şi obiectul aflat la distanţă (i.e. aceaşi

interfaţă)– Dar implementare diferită a metodelor:Dar implementare diferită a metodelor:

1. Trimiterea apelului cu încapsularea parametrilor la server2. Aşteaptă şi primeşte valoarea întoarsă de metodă

• În Java: stubul client şi alte clase sunt generate de către• În Java: stubul client şi alte clase sunt generate de către instrumentul de generare extern RMIC (Remote Method Invocation Compiler)

RMICClassOther classesrequired for

9

remoting

Instrumente pentru dezvoltarea programelor – Curs 9

Page 10: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Generator de StubGenerator de StubGe e ato de StubGe e ato de StubExemplu: înmulţire de matrici la distanţă

class Matrix implements MatrixInterface {...Matrix multiply(Matrix m) { ... }

}

class MatrixStub implements MatrixInterface {Url remoteObject;

Pseudo-cod:

Url remoteObject;...Matrix multiply(Matrix m) {

send(remoteObject REQUEST FOR MULTIPLY m);send(remoteObject, REQUEST_FOR_MULTIPLY, m);return (Matrix) receive(remoteObject);

}}

10

}

Instrumente pentru dezvoltarea programelor – Curs 9

Page 11: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Scopurile Generării de CodScopurile Generării de CodScopu e Ge e ă de CodScopu e Ge e ă de Cod1. Dezvoltare mai eficientă

Ad t bilit t i f l i– Adaptabilitate şi refolosire– Controlul complexităţii

• Structură mai clară (e.g. templeturi)Structură mai clară (e.g. templeturi)• O mai bună gestiune a variantelor multiple

(e.g. parametrizare)2 Evitarea erorilor de dezvoltare prin reducerea2. Evitarea erorilor de dezvoltare prin reducerea

implicării umane atunci când acest lucru nu este necesar

3. Folosire mai eficientă prin adaptabilitate (e.g. reflecţie dinamică)

4. Câştig de performanţă la runtime prin folosirea de componente adaptate (e.g. Generarea de cod optimizat)

11

cod optimizat)

Instrumente pentru dezvoltarea programelor – Curs 9

Page 12: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Siguranţa GeneratoarelorSiguranţa GeneratoarelorSiguranţa GeneratoarelorSiguranţa Generatoarelor

Safety doesn't happen by accident.y

12Instrumente pentru dezvoltarea programelor – Curs 9

Page 13: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Siguranţa GeneratoarelorSiguranţa GeneratoarelorS gu a ţa Ge e atoa e oS gu a ţa Ge e atoa e o• Sistemele tip pot detecta potenţiale

erori de execuţie în mod staticint m(String s) {

i t + 1erori de execuţie în mod static

• Generatoarele sunt meta-programe

int y = s + 1;m(y,3);return s;g

ce introduc noi surse de erori de execuţie: erori de generare

părţi ale programului generat ce pot genera potenţial cod greşit

}

– părţi ale programului generat ce pot genera potenţial cod greşit– ce la rândul său poate cauza erori de execuţie

• Necesare noi sisteme de verificare de tip pentru detectarea p ppărţilor în generatoare ce pot genera potenţial cod greşit (sisteme de verificare de tipuri pentru generatoare)Siguranţa generatorului: proprietatea unui generator de a nu• Siguranţa generatorului: proprietatea unui generator de a nu putea genera cod greşit

• Din păcate siguranţa generatoarelor de obicei nu este

13

Din păcate siguranţa generatoarelor de obicei nu este garantată…

Instrumente pentru dezvoltarea programelor – Curs 9

Page 14: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Erori de GenerareErori de Generareo de Ge e a eo de Ge e a e• Prin verificările de tip ale ieşirii generatorului putem

detecta posibile erori de generaredetecta posibile erori de generareclass C(String ID) {

String @ID@ = 1; Cod întotdeauna generat greşit

• Dar unele erori de generare produc cod greşit doar

String @ID@ = 1;}

Cod întotdeauna generat greşit

• Dar unele erori de generare produc cod greşit doar în cazul unor anumiţi parametri

l C(St i ID) {class C(String ID) {int x;int @ID@;

Funcţionează corect pentru majoritatea ID-urilor, dar nu şi pentru “x” (coliziune lexicală)

• Astfel de probleme îngreunează găsirea erorilor de

} (coliziune lexicală)

14

Astfel de probleme îngreunează găsirea erorilor de generare

Instrumente pentru dezvoltarea programelor – Curs 9

Page 15: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Erori de generareErori de generare1. Ieşirea e corectă doar

Erori de generareErori de generareclass C(String ID) {

void m() {dacă ID este egal cu “x”

() {int @ID@ = 1;x++;

} }

2. Ieşirea este corectă doar dacă T este un

} }

class C(Class T) {@T@ x = new Button(); doar dacă T este un

supertip al lui Button

@T@ x = new Button();}

class C(String X) { Button

3 Ieşirea este corectă

class C(String X) {@if(X.Equals("hello")) {

String y = "world";} 3. Ieşirea este corectă

doar dacă X este egal cu “hello”

}void m() {

Console.WriteLine(y);

15

} }

Instrumente pentru dezvoltarea programelor – Curs 9

Page 16: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Erori de generareErori de generare1. Corect doar dacă

Erori de generareErori de generareclass C(Type T) {

@T@ 1 1 este un element de tipul T

@T@ x = 1;}

2. Corect doar dacă

class C(Type S, Type T) {@foreach(F in S.GetFields()) {

@F.FieldType@ @F.FieldName@;

numele de câmpuri ale lui T

yp}void m() {@foreach(F in T.GetFields())

sunt subset al numelor de â i l l i S

@foreach(F in T.GetFields()) {

Console.WriteLine(this @F FieldName@); câmpuri al lui S

E g dacă T==S

[email protected]@);}

}}

16

E.g. dacă T==S}

Instrumente pentru dezvoltarea programelor – Curs 9

Page 17: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Java Emitter Templates Java Emitter Templates (JET)(JET)(JET)(JET)

17Instrumente pentru dezvoltarea programelor – Curs 9

Page 18: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Java Emitter Templates (JET)Java Emitter Templates (JET)Ja a tte e p ates (J )Ja a tte e p ates (J )• Tehnologie de generare bazată pe templeturi• Parte a Eclipse Modeling Framework (EMF)• Parte a Eclipse Modeling Framework (EMF)• Sintaxa similară JSP-ului (de fapt, un subset al JSP)• Idea:

1. Dezvoltatorul crează templeturi parametrizate (fişiere text având sufixul jet)

2. Fiecare templet este tranformat într-o clasă Java ( l ă d i l t t l t l i)(clasă de implementare a templetului)

3. Clasele pot fi folosite pentru a genera ceva, e.g. cod sursă

Pot fi folosite pentr generarea oricăr i tip de fişier te t (n doar• Pot fi folosite pentru generarea oricărui tip de fişier text (nu doar cod sursă Java)

Arguments

JETJETTemplate

TemplateImplementation

GeneratedOutput

g

18

BuilderTemplate ImplementationClass

Output

Instrumente pentru dezvoltarea programelor – Curs 9

Page 19: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Folosirea JET în EclipseFolosirea JET în Eclipseo os ea J c pseo os ea J c pse1. Creare proiect nou Java 2 C ti P i t l i î t P i t JET2. Convertirea Proiectului într-un Proiect JET

• Click dreapta pe numele proiectului în explorer ul de pachete;în explorer-ul de pachete; New -> Other…

• Selectare “Convert Projects to JET…”; Nextj ;• Selectare proiect; FinishAcum proiectul are un folder “templates”

3. Pentru configurarea JET:• Click dreapta pe numele proiectului în explorer-ul de

h t l t P tipachete; selectare Properties• Selectare “JET Settings”• Alegerea folderelor pentru

19

Alegerea folderelor pentru templeturi şi cod sursă Java

Instrumente pentru dezvoltarea programelor – Curs 9

Page 20: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Generator “Hello World”Generator “Hello World”Creare Fişier Templet JET1. Din meniu se alege File -> New -> File2. Selectare director de templeturi ca folder părinte;

numim fişierul helloworld.txtjet3 După OK apare mesajul de eroare: “The jet directive is3. După OK apare mesajul de eroare: The jet directive is

missing…“; un mesaj normal, închideţi-l 4. Editare helloworld.txtjet

<%@ jet package="hello" class="HelloWorldTemplate" %>Hello, world!

De îndată ce salvăm, pachetul hello conţinândclasa de implementare templet HelloWorldTemplate este generatăHelloWorldTemplate este generată

Convenţie: sufixul templetului este sufixul ieşirii + “jet”E g txt > txtjet java > javajet xml >

20

E.g. .txt -> .txtjet, .java -> .javajet, .xml -> .xmljet

Instrumente pentru dezvoltarea programelor – Curs 9

Page 21: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Folosirea Generatorului “Hello World”Folosirea Generatorului “Hello World”o os ea Ge e ato u u e o o do os ea Ge e ato u u e o o dExtras din HelloWorldTemplate:protected final String TEXT 1 = NL + "Hello, world!";p g _ ,

public String generate(Object argument){{final StringBuffer stringBuffer = new StringBuffer();stringBuffer.append(TEXT_1);return stringBuffer.toString();

Crearea unei noi clase în pachetul hello ce îl foloseşte:

g g();}

Crearea unei noi clase în pachetul hello ce îl foloseşte:public class Test {

public static void main(String[] args) {HelloWorldTemplate t = new HelloWorldTemplate();String result = t.generate(null);System.out.println(result);

21

} }

Instrumente pentru dezvoltarea programelor – Curs 9

Page 22: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

SumarSumarSu aSu a

• Generatoarele sunt programe ce pot genera anumite artefacte

• Programarea generativă încearcă generarea g g ganumitor părţi de program, e.g. extensii de clase, proxies, interfeţe, wrappersp , ţ , pp

• Cu ajutorul templeturilor ieşirea generatoarelor poate căpăta o formă naturalăpoate căpăta o formă naturală

• Erorile de generare sunt părţi ale programului generat ce pot fi potenţial greşitegenerat ce pot fi potenţial greşite

• Java Emitter Templates (JET) este o tehnologie l ă d t E li

22

populară de generare pentru EclipseInstrumente pentru dezvoltarea programelor – Curs 9

Page 23: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Generatorul “Hello World”Generatorul “Hello World”Ge e ato u e o o dGe e ato u e o o dhelloworld.txtjet:<%@ jet package="hello" class="HelloWorldTemplate" %>

Generare HelloWorldTemplate:

<%@ jet package= hello class= HelloWorldTemplate %>Hello, world!

Generare HelloWorldTemplate:protected final String TEXT_1 = NL + " Hello, world!";

public String generate(Object argument)public String generate(Object argument){final StringBuffer stringBuffer = new StringBuffer();stringBuffer append(TEXT 1);stringBuffer.append(TEXT_1);return stringBuffer.toString();

}

Folosire:HelloWorldTemplate t = new HelloWorldTemplate();

23

String result = t.generate(null);

Instrumente pentru dezvoltarea programelor – Curs 9

Page 24: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Generatoare ParametrizateGeneratoare ParametrizateGe e atoa e a a et ateGe e atoa e a a et ate<%@ jet package="hello" class="HelloTemplate" %>Hello <%=argument%>!

Generare HelloTemplate:protected final String TEXT 1 = "Hello ";

Hello, <%=argument%>!

protected final String TEXT_1 = "Hello, ";protected final String TEXT_2 = "!";public String generate(Object argument) {

final StringBuffer stringBuffer new StringBuffer();final StringBuffer stringBuffer = new StringBuffer();stringBuffer.append(TEXT_1);stringBuffer.append(argument);t i B ff d(TEXT 2)stringBuffer.append(TEXT_2);return stringBuffer.toString();

}

Folosire:HelloTemplate t = new HelloTemplate();

24

String result = t.generate("Christof");

Instrumente pentru dezvoltarea programelor – Curs 9

Page 25: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Sintaxa JETSintaxa JETS ta a JS ta a J• Directiva JET <%@ jet package="hello" class="HelloTemplate" %>class= HelloTemplate %>Mai multe atribute pentru…– Importarea pachetelor imports="java.io.* java.util.*"

M difi ti h t l JET– Modificarea etichetelor JET startTag="<@" endTag="@>"• Expresii <%= argument+"xyz" %>• Scriptlets• Scriptlets<% int x=0; x++; %><% if (dayTime.isMorning()) {%> Good MorningMorning<% } else { %> Good Afternoon <% } %>

• Variabile predefinite:p– StringBuffer stringBuffer: ieşirea generatorului<% stringBuffer.append("Hello again!"); %>

– Object argument: parametru al metodei generate

25

Object argument: parametru al metodei generate

Instrumente pentru dezvoltarea programelor – Curs 9

Page 26: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemple Exemple JETJET

26Instrumente pentru dezvoltarea programelor – Curs 9

Page 27: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Evaluare Parţială (PE)Evaluare Parţială (PE)a ua e a ţ a ă ( )a ua e a ţ a ă ( )PE este o tehnică de optimizare

1. Evaluarea părţilor constante ale programului înainte de runtime1. Evaluarea părţilor constante ale programului înainte de runtime2. Înlocuirea lor prin rezultatul produs

E l d d ti i tExemplu de cod neoptimizat:public class Computation {

double x = Math.sqrt(21);qint[] a = sortedRandomArray(10000);

int[] sortedRandomArray(int n) {int[] sortedRandomArray(int n) {int [] a = new int[n];java.util.Random rnd = new java.util.Random();for(int i=0; i<n; i++) a[i] = rnd nextInt();for(int i=0; i<n; i++) a[i] = rnd.nextInt();java.util.Arrays.sort(a);return a;

}

27

}}

Instrumente pentru dezvoltarea programelor – Curs 9

Page 28: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Partial Evaluation (PE)Partial Evaluation (PE)Folosirea unui template pentru evaluarea parţială:

Partial Evaluation (PE)Partial Evaluation (PE)

<%@ jet class="ComputationTemplate" %>public class Computation {

double x = <%=Math.sqrt(21)%>;<% int[] a = sortedRandomArray(10000); %>int[] a = { <%=a[0]%><% for(int i=1; i<a.length; i++) { %><% for(int i 1; i<a.length; i++) { %>

, <%=a[i]%><%}%> };

}

Ieşirea Generatorului:

}

public class Computation {public class Computation {double x = 4.58257569495584;int[] a = { -7, -3, 1, 4, ... };

}

28

}

Instrumente pentru dezvoltarea programelor – Curs 9

Page 29: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Şablon de Proiectare FactoryŞablon de Proiectare FactoryF l i i bi t f t t d f t t• Folosirea unui obiect factory cu metode factory pentru crearea altor obiecte

• Abstracţia unui constructor pentru implementarea de ţ p pscheme flexibile de alocare

• O metodă factory pentru fiecare tip de obiect ce poate fi creat întorcând obiectul creatcreat, întorcând obiectul creat– Ar putea să aleagă clasa obiectului creat în mod dinamic– Ar putea să-l întoarcă dintr-un pool de obiecte

E l• Exemple: – Teme UI configurabile / look & feel – Back-end ajustabil (e.g. compiler: for Java, .net, x86, …)j ( g p )– Structuri de date configurabile (e.g. arbori cu diverse noduri)

• Generarea e utilă şi pentru alte şabloane de proiectare (e.g. proxies)proxies)

Fiecare buton e creat de către o altă clasă:

29Instrumente pentru dezvoltarea programelor – Curs 9

Page 30: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

GeneratorGenerator FactoryFactoryGenerator Generator FactoryFactoryDorim să generăm clase factory precum:class CoolTheme implements Theme {class CoolTheme implements Theme {

public JButton newJButton() {return new CoolButton();

}

Părţile verzi variazăde la factory lafactory.}

public JTextField newJTextField() {return new CoolTextField();

factory.

Ele reprezintă parametrii noştri}

...}

parametrii noştri.

Folosim următorul tip de argument pentru generator:class Factory {

Clasa Metatype poate reprezentao interfaţă Java

class Factory {String className;Class interf;Hashtable<String String> classes;

30

o interfaţă Java.Hashtable<String, String> classes;}

Instrumente pentru dezvoltarea programelor – Curs 9

Page 31: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

GeneratorGenerator FactoryFactoryGenerator Generator FactoryFactory<%@ jet class="FactoryTemplate"

imports="java.lang.reflect.*" %><% F t f (F t ) t %><% Factory f = (Factory) argument; %>class <%=f.className%>

implements <%=f.interf.getSimpleName()%> {<% f (M th d f i t f tM th d ()) { %><% for(Method m : f.interf.getMethods()) { %>

<% String tname = m.getReturnType().getSimpleName();%>public <%=tname%> new<%=tname%>() {

% f l ( )% ()return new <%=f.classes.get(tname)%>();}

<%}%>}

public String generate(Object argument) { …Factory f = (Factory) argument;Factory f = (Factory) argument; …for(Method m : f.interf.getMethods()) {

String tname = m.getReturnType().getSimpleName();stringBuffer append(tname);

31

… stringBuffer.append(tname); …}… }

Instrumente pentru dezvoltarea programelor – Curs 9

Page 32: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Folosirea GeneratoruluiFolosirea Generatorului FactoryFactoryFolosirea Generatorului Folosirea Generatorului FactoryFactoryimport java.util.*;import java.io.*; ...try {

Factory f = new Factory();f.className = "CoolTheme";f.interf = Class.forName("Theme");f.classes = new Hashtable<String, String>();f.classes.put("JButton", "CoolButton");f.classes.put("JTextField", "CoolTextField");

FactoryTemplate t = new FactoryTemplate(); String result = t.generate(f); Writer output = new BufferedWriter(p

new FileWriter(f.className+".java")); output.write(result);output.close();

32

p ()} catch(Exception ex) { ex.printStackTrace(); }

Instrumente pentru dezvoltarea programelor – Curs 9

Page 33: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Generator Getter/SetterGenerator Getter/SetterGe e ato Gette /SetteGe e ato Gette /Sette• Şablon comun: generarea extensiilor pentru clase existente (extensii

de class))• Generarea subclasei unei clase pe care dorim să o extindem,

i.e. Generatorul primeşte superclasa ca argument• Subclasa generată poate fi folosită în locul superclasei, dar g p p ,

încorporează funcţionalitate suplimentară• Exemplul nostru:

– Generarea clasei ce defineşte metodele getters/setters ale unor câmpuri ale unei superclase

– Dacă câmpurile trebuie să rămână read-only se generează doar metodele getterMetodele getter & setter sunt una dintre principalele caracteristici ale

class XBean extends X {String getA() { return a; }

– Metodele getter & setter sunt una dintre principalele caracteristici ale Java Beans

class X { String getA() { return a; } void setA(String value){ a = value; } int getB() { return b; }

class X {String a;final int b = 0;

}

33

int getB() { return b; }}

}

Instrumente pentru dezvoltarea programelor – Curs 9

Page 34: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Generator Generator Getter/SetterGetter/Setter<%@ jet class="BeanTemplate"

imports="java.lang.reflect.*" %><% Class c = (Class) argument; %>class <%=c.getSimpleName()%>Bean extends <%=c.getName()%>{<% for(Field f : c.getFields()) { %>

public <%=f.getType().getName()%> get<%=f.getName().substring(0,1).toUpperCase()

+ f.getName().substring(1)%>() {return <%=f.getName()%>;

}<% if(!Modifier.isFinal(f.getModifiers())) { %>public void set<%=f.getName().substring(0,1).toUpperCase()

+ f.getName().substring(1)%>(<%=f.getType().getName()%> value) {g yp g

<%=f.getName()%> = value;} <%}%>

34

}<%}%> }

Instrumente pentru dezvoltarea programelor – Curs 9

Page 35: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Generator de Automat cu Stări FiniteGenerator de Automat cu Stări FiniteGe e ato de uto at cu Stă teGe e ato de uto at cu Stă te• Generarea de cod algoritmic customizat pentru anumite

date (tailored code)( )• Exemplu: scanere, parsere, calcule numerice• Exemplul nostru: generarea de cod pentru un Automat cu

Stări Finite pornind de la o descriere a stărilor şi tranziţiilorStări Finite pornind de la o descriere a stărilor şi tranziţiilor• Automate cu Stări Finite:

– O stare de start– Săgeţi de ieşire reprezentând posibile alternative– Alegerea unei tranziţii şi trecerea la următoarea stare– Execuţia se opreşte într-una din stările terminaleExecuţia se opreşte într una din stările terminale

0 1 3 5

Go toswimming pool

GohomeWatch others dive

Climb updiving

platform

Climbdownagain

Ouch!!!

35

2 4

p gJump

Instrumente pentru dezvoltarea programelor – Curs 9

Page 36: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Modelul Automatului cu StăriModelul Automatului cu Stări FiniteFiniteModelul Automatului cu Stări Modelul Automatului cu Stări FiniteFinite• ASF: lista tuturor stărilor (de interes) şi referinţa

la starea iniţială class FSM {String name;

• Stare: lista tuturor posibilelor tranziţii• Tranziţie: eticheta şi starea destinaţie

N i tă tă i t i l tă il di

String name;State[] states;State start;

}• Nu există stări terminale: stările din care nu se mai poate înainta din lipsa unor tranziţii de ieşire

}

class State {String label;String label;List<Transition>

transitions;}

State s0 = new State("0");State s1 = new State("1");… }

class Transition {String label;

FSM fsm = new FSM("SwimmingPool", new State[]{s0,s1,s2,s3,s4,s5}, s0);

s0.transitions.add(new Transition( gState target;

}

( ("Go to swimming pool", s1));

s1.transitions.add(new Transition("Watch others dive", s3));

36

Watch others dive , s3));…

Instrumente pentru dezvoltarea programelor – Curs 9

Page 37: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Generator Automat cu Stări Generator Automat cu Stări FiniteFinite<%@ jet class="FSMTemplate" imports="java.util.*" %><% FSM fsm = (FSM) argument;

int stateNum = 0;Hashtable<State, Integer> numForState

= new Hashtable<State, Integer>(); e as tab e State, tege ();%>import java.io.*;class <%=fsm name%> {class <%=fsm.name%> {<% for(State s : fsm.states) { %>

public void<% if(!numForState containsKey(s)) { %><% if(!numForState.containsKey(s)) { %>

<%="state"+stateNum%><% numForState.put(s, stateNum); stateNum++; %>

<% } else { %><%="state"+numForState.get(s)%>

<%}%> () { /* …corpul metodei pe următorul slide… */ }

37

<%}%>}

Instrumente pentru dezvoltarea programelor – Curs 9

Page 38: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Generator Automat cu Stări Generator Automat cu Stări FiniteFiniteSystem.out.println("<%=s.label%>");<% for(int i=0; i<s.transitions.size(); i++) { %>

System out println(System.out.println("<%=i%>...<%=s.transitions.get(i).label%>");

<%}%>try {try {

String input = new BufferedReader(new InputStreamReader(System.in)).readLine();

<% for(int i=0; i<s transitions size(); i++) {<% for(int i=0; i<s.transitions.size(); i++) { State target = s.transitions.get(i).target; %>if(input.equals("<%=i%>"))<% if(!numForState containsKey(target)) { %><% if(!numForState.containsKey(target)) { %><%="state"+stateNum %> <% numForState.put(target,stateNum); stateNum++; %><% } else { %><% } else { %><%="state"+numForState.get(target)%><%}%>();

<%}%>

38

<%}%>} catch(IOException ex) { ex.printStackTrace(); }

Instrumente pentru dezvoltarea programelor – Curs 9

Page 39: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu de ieşire a generatorului ASFExemplu de ieşire a generatorului ASFpublic void state0() {

System.out.println("0");

p ş gp ş g

System.out.println("0...Go to swimming pool"); try {

String input = new BufferedReader(…).readLine(); St g put e u e ed eade (…). ead e();if(input.equals("0")) state1();

} catch(IOException ex) { ex.printStackTrace(); }}}public void state1() {

System.out.println("1");System out println("0 Watch others dive");System.out.println("0...Watch others dive"); System.out.println("1...Climb up diving platform"); try {

String input = new BufferedReader(…).readLine(); if(input.equals("0")) state2();if(input.equals("1")) state3();

39

} catch(IOException ex) { ex.printStackTrace(); }} …

Instrumente pentru dezvoltarea programelor – Curs 9

Page 40: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Folosirea ASFFolosirea ASFPornirea ASF-ului generat:

Folosirea ASFFolosirea ASF

SwimmingPool sp = new SwimmingPool();sp.state0();

Execuţia ASF-ului (output abreviat):0...Go to swimming pool

00...Watch others dive1...Climb up diving platform

10...Climb down againg1...Jump

10 Ouch!!!

40

0...Ouch!!!

Instrumente pentru dezvoltarea programelor – Curs 9

Page 41: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

SumarSumarSu aSu a

• Sintaxa JET– Expresii– Scriptlets– Variabile predefinite (argument, stringBuffer)

• Generatoarele pot rezolva diverse probleme– Evaluarea parţială a codului programuluiEvaluarea parţială a codului programului– Suport pentru şabloane de proiectare– Generarea de extensiiGenerarea de extensii– Generarea de cod algoritmic customizat– Altele (e g generarea de interfeţe)

41

– Altele (e.g. generarea de interfeţe)

Instrumente pentru dezvoltarea programelor – Curs 9

Page 42: Asigurarea Calităţii (QA) Automatizarea activităților de dezvoltare. … · 2021. 4. 6. · Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare Asigurarea

Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Temă pentru acasăTemă pentru acasăTema constă în răspunsul la următoarele întrebări:

Temă pentru acasăTemă pentru acasă

• Daţi exemple în pseudocod pentru trei erori de generator diferite.Ce reprezintă o directivă JET? Ce sunt expresiile şi• Ce reprezintă o directivă JET? Ce sunt expresiile şi scriplets din JET?

• Descrieţi cum gestionează generatorul AFS stările ţ g gmetodelor.

• Descrieţi o altă aplicaţie a şabloanelor/template-urilor JET(în afară de exemple prezentate) Descrieţi printr-un(în afară de exemple prezentate). Descrieţi printr un exemplu cum este aplicat JET în acest caz.

Ră il i i l i i i di lRăspunsurile se trimit electronic, prin intermediul http://curs.cs.pub.ro, până în data de 11.04.2012, ora 23.55 (următorul curs).

42

( )Temele trimise cu întârziere nu sunt luate în considerare.

Instrumente pentru dezvoltarea programelor – Curs 9