Sunteți pe pagina 1din 41

Platformă de e‐learning și curriculă

gș e‐content 
pentru învățământul superior tehnic

 Instrumente pentru Dezvoltarea Programelor
p g

7 Generatoare Siguranta generatoarelor.


7. Generatoare. Siguranta generatoarelor
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Sumar

 Generatoare
 Siguranţa generatoarelor
g ţ g
 Java Emitter Templates (JET)
 Exemple JET
Exemple JET
Optimizare: Evaluare Parţială
Şabloane
Şabloane de Proiectare: Şablonul Factory 
de Proiectare: Şablonul Factory
Algoritmi: Automate cu Stări Finite

IDP – Instrumente pentru Dezvoltarea Programelor 2
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Generatoare
“The simplest scheme of
evolution is one that depends
p on
two processes; a generator and
a test. The task of the
generator is to produce variety,
new fforms that
h have
h not
existed previously, whereas the
task of the test is to cull out
the newly generated forms so
that only those that are well
fitted to the environment will
survive ”
survive.
(Herbert Simon)
IDP – Instrumente pentru Dezvoltarea Programelor 3
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

G
Generatoare
t
 Generatoarele sunt programe ce pot genera diverse artefacte
 Ele automatizează crearea artefactelor ce au o structură bine înţeleasă şi 
regulată
 Artefactele generate variază cel mai adesea în funcţie de intrarea generatorului
 Exemple:
Compilatorul: generează cod binar pornind de la codul sursă
JavaDoc: generează pagini HTML pe baza comentariilor din codul sursă
g p g p
Green: generează cod sursă pornind de la diagrame de clase
Servlets: generează pagini HTML
Java Server Pages (JSP): generează Servlets

Input
Generator Output
(P
(Parameter)
)

IDP – Instrumente pentru Dezvoltarea Programelor 4
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

P
Programarea Generativă
G i ă
 Există “task‐uri de rutină” de programare ce sunt întotdeauna similare
p g
 Doar mici variaţii în funcţie de anumiţi parametrii
 Programarea generativă încearcă automatizarea acestor task‐uri 
folosind generatoare de program parametrizate pentru diverse părţi 
folosind generatoare de program parametrizate pentru diverse părţi
ale programului
 Generatoarele de program sunt meta‐programe: programe ce lucrează 
cu alte programe
 Meta‐programarea poate fi sofisticată şi potenţial nesigură
 Diverse abordări ale programării generative
Instrumente externe: programe de sine stătătoare ce efectuează un task 
Instrumente externe: programe de sine stătătoare ce efectuează un task
particular de generare de program (e.g. compilator, generator de compilator)
Elemente generative de limbaj: construcţii pentru generarea integrată într‐un 
limbaj de programare
Adesea transformare a unor noi construcţii de nivel înalt în construcţii de nivel 
Adesea transformare a unor noi construcţii de nivel înalt în construcţii de nivel
scăzut (adesea numite ‘macrouri’)

IDP – Instrumente pentru Dezvoltarea Programelor 5
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Ti
Tipare & Aplicaţii Comune
& A li ii C
 Class extensions
Input: clasa ce trebuie extinsă & informaţii suplimentare
Input: clasa ce trebuie extinsă & informaţii suplimentare
Output: subclasa conţinând funcţionalităţi suplimentare
E.g. clone, hashcode, equals, print, serialize, copy
 Proxies
Input: tipul şi metodele/câmpurile ce trebuie protejate
Output: subclasa conţinând semantici modificate
E.g. monitorizare, acces la distanţă, managementul resurselor, controlul accesului
 Wrappers
Input: tipuri, metode, câmpuri ce trebuie învelite
Output: clasa wrapper cu interfaţa corespunzătoare
E.g. Integrarea de componente legacy
 Interfaces
Input: descrierea interfeţei
Output: diverse tipuri de interfeţe
E g DB interface GUI web interface API
E.g. DB interface, GUI, web interface, API

IDP – Instrumente pentru Dezvoltarea Programelor 6
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

T
Templeturi
l i
 Codul ce generează cod poate fi complex
 Exemplu: construirea unui Abstract Syntax Tree (AST) pentru codul 
generatt
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ă: templeturi
class GeneratedClass extends @x@ {
I t
Integer myVar;
V
}

Ieşirea
Ieşirea este redată în forma ei naturală
este redată în forma ei naturală
În locurile în care ieşirile variază putem insera cod generator
(e.g. @x@)
IDP – Instrumente pentru Dezvoltarea Programelor 7
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

E
Exemplu:
l Generator Getter&Setter
G t G tt &S tt
 Convenţia Java: clasele furnizează metode getter şi setter pentru accesarea 
variabilelor membre
 Poate fi util, e.g. pentru pattern‐ul observer
 Metodele simple getter şi setter reprezintă cel mai adesea muncă de rutină
 Putem automatiza procesul folosind un generator:

class Person { class PersonWithGetterSetter {


St i
String name; String name;
int age; int age;
} String getName() { return name; }
void setName(String v) {
name = v;
}
int getAge() { return age; }
void setAge(int v) { age = v; }
}
IDP – Instrumente pentru Dezvoltarea Programelor 8
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Exemplu: Remote Method Calls
Remote Method Calls
 Apelarea de metode ale unor obiecte aflate pe alte calculatoare ca 
şi cum ele ar fi locale
 Necesită o nouă clasă: stubul clientului
Pentru obiectul reprezentând local obiectul de la distanţă
Are
Are aceeaşi semnătură ca şi obiectul aflat la distanţă (i.e. aceaşi
aceeaşi semnătură ca şi obiectul aflat la distanţă (i e aceaşi interfaţă)
Dar implementare diferită a metodelor:
1.Trimiterea apelului cu încapsularea parametrilor la server
2 Aşteaptă şi primeşte valoarea întoarsă de metodă
2.Aşteaptă şi primeşte valoarea întoarsă de metodă

 În Java: stubul client şi alte clase sunt generate de către 
instrumentul de generare extern RMIC (Remote Method Invocation 
Compiler)
Other classes
Class RMIC required
q for
f
remoting
IDP – Instrumente pentru Dezvoltarea Programelor 9
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Generator de Stub
Generator de Stub
Exemplu: înmulţire de matrici la distanţă

class Matrix implements


p MatrixInterface {
...
Matrix multiply(Matrix m) { ... }
}

Pseudo-cod:

class MatrixStub implements MatrixInterface {


Url remoteObject;
...
Matrix multiply(Matrix m) {
send(remoteObject, REQUEST_FOR_MULTIPLY, m);
return (Matrix) receive(remoteObject);
}
}

IDP – Instrumente pentru Dezvoltarea Programelor 10
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

S
Scopurile Generării de Cod
il G ă ii d C d
1. Dezvoltare mai eficientă
 Adaptabilitate şi refolosire
Ad bili i f l i
 Controlul complexităţii
• Structură mai clară (e.g. templeturi)
• O mai bună gestiune a variantelor multiple
(e.g. parametrizare)

2. Evitarea erorilor de dezvoltare prin reducerea implicării 
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 
di
dinamică)
i ă)
4. Câştig de performanţă la runtime prin folosirea de 
componente adaptate (e.g. Generarea de cod optimizat)
componente adaptate (e.g. Generarea de cod optimizat)

IDP – Instrumente pentru Dezvoltarea Programelor 11
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Siguranţa Generatoarelor

Safety doesn't happen


by accident.

IDP – Instrumente pentru Dezvoltarea Programelor 12
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Si
Siguranţa Generatoarelor
G l
int m(String s) {
 Sistemele tip pot detecta potenţiale int y = s + 1;
erori de execuţie în mod static
erori de execuţie în mod static
m(y,3);
return s;
 Generatoarele sunt meta‐programe }
ce introduc noi surse de erori de
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
ce la rândul său poate cauza erori de execuţie
l â d l ă id i
 Necesare noi sisteme de verificare de tip pentru detectarea pă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 putea 
genera cod greşit
genera cod greşit
 Din păcate siguranţa generatoarelor de obicei nu este garantată…
IDP – Instrumente pentru Dezvoltarea Programelor 13
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

E id G
Erori de Generare
 Prin verificările de tip ale ieşirii generatorului putem detecta 
posibile erori de generare

class C(String ID) {


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

 Dar unele erori de generare produc cod greşit doar în cazul unor 
anumiţi parametri
iţi ti
class C(String ID) {
int x; Funcţionează
ţ corect pentru
p majoritatea
j
int @ID@; ID-urilor, dar nu şi pentru “x”
} (coliziune lexicală)

 Astfel de probleme îngreunează găsirea erorilor de generare
IDP – Instrumente pentru Dezvoltarea Programelor 14
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Erori de generare
Erori de generare
class C(String ID) {
void m() {
int @ID@ = 1; 1. Ieşirea e corectă doar 
x++; dacă ID este egal cu 
} } “x”

class C(Class T) {
@T@ x = new Button(); 2. Ieşirea este corectă 
}
doar dacă T este un 
doar dacă T este un
class C(String X) { supertip al lui Button
@if(X.Equals("hello")) {
String y = "world";
} 3. Ieşirea este corectă 
void m() {
doar dacă X este egal 
Console WriteLine(y);
Console.WriteLine(y);
} }
cu “hello”

IDP – Instrumente pentru Dezvoltarea Programelor 15
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Erori de generare
Erori de generare
class C(Type T) { 1. Corect doar dacă 1
@T@ x = 1;
}
este un element de
este un element de 
tipul T
class C(Type S, Type T) {
@f
@foreach(F
h( iin S.GetFields())
i ld ()) {
@F.FieldType@ @F.FieldName@;
2. Corect doar dacă 
}
void m() { p
numele de câmpuri 
@foreach(F in T.GetFields()) ale lui T sunt subset 
{ al numelor de 
Console.WriteLine( câmpuri al lui S
câmpuri al lui S
this.@F.FieldName@);
}
} E.g. dacă T==S
}

IDP – Instrumente pentru Dezvoltarea Programelor 16
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Java Emitter Templates (JET)

IDP – Instrumente pentru Dezvoltarea Programelor 17
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

J
Java Emitter Templates (JET)
E i T l (JET)
 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 D
1. Dezvoltatorul crează
lt t l ă templeturi
t l t i parametrizate 
ti t
(fişiere text având sufixul jet)
2. Fiecare templet este tranformat într‐o clasă Java 
(clasă de implementare a templetului)
3. Clasele pot fi folosite pentru a genera ceva, 
e.g. cod sursă
 Pot fi folosite pentru generarea oricărui tip de fişier text (nu doar cod sursă 
Java))
Arguments

JET Template Generated


JET Implementation
Template Output
Builder Class
IDP – Instrumente pentru Dezvoltarea Programelor 18
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Folosirea JET în Eclipse


Folosirea JET în Eclipse
1. Creare proiect nou Java 
2
2. Convertirea Proiectului într‐un Proiect JET
Convertirea Proiectului într‐un Proiect JET
• Click dreapta pe numele proiectului 
în explorer‐ul de pachete; 
N
New ‐> Other…
Oth
• Selectare “Convert Projects to JET…”; Next
• Selectare proiect; Finish
Acum proiectul are un folder “templates”

3. Pentru configurarea JET:
• Click dreapta pe numele proiectului în explorer‐ul de pachete; 
selectare Properties
• Selectare “JET Settings”
• Al
Alegerea folderelor
f ld l pentru  t
templeturi şi cod sursă Java
IDP – Instrumente pentru Dezvoltarea Programelor 19
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Generator “Hello World”
Creare Fişier Templet JET
1. Din meniu se alege File ‐> New ‐> File
2. Selectare director de templeturi ca folder părinte; 
ş
numim fişierul helloworld.txtjet j
3. 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!

îndată ce salvăm pachetul hello conţinând


De îndată ce salvăm, pachetul hello
De
clasa de implementare templet
HelloWorldTemplate este generată
ţ p
Convenţie: sufixul templetului j
este sufixul ieşirii + “jet”
ş
E.g. .txt ‐> .txtjet, .java ‐> .javajet, .xml ‐> .xmljet

IDP – Instrumente pentru Dezvoltarea Programelor 20
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

F l i
Folosirea Generatorului “Hello World”
G l i “H ll W ld”
Extras din HelloWorldTemplate:
protected final String TEXT
TEXT_1
1 = NL + "Hello,
Hello, world!
world!";
;

public String generate(Object argument)


{
fi l StringBuffer
final i ff stringBuffer
i ff = new StringBuffer();
i ff ()
stringBuffer.append(TEXT_1);
return stringBuffer.toString();
}

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);
} }

IDP – Instrumente pentru Dezvoltarea Programelor 21
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Sumar

 Generatoarele sunt programe ce pot genera anumite artefacte
 Programarea generativă încearcă generarea anumitor părţi de 
program, e.g. extensii de clase, proxies, interfeţe, wrappers
 Cu ajutorul templeturilor ieşirea generatoarelor poate căpăta o 
f
formă naturală
ă t lă
 Erorile de generare sunt părţi ale programului generat ce pot fi 
potenţial greşite
potenţial greşite
 Java Emitter Templates (JET) este o tehnologie populară de 
ggenerare pentru Eclipse
p p

IDP – Instrumente pentru Dezvoltarea Programelor 22
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

G
Generatorul “Hello World”
l “H ll W ld”
helloworld.txtjet:
<%@ jet package="hello" class="HelloWorldTemplate" %>
Hello, world!
Generare HelloWorldTemplate:
protected final String TEXT_1 = NL + " Hello, world!";

public String generate(Object argument)


{
final StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(TEXT_1);
return stringBuffer.toString();
}

Folosire:
HelloWorldTemplate
p t = new HelloWorldTemplate();
p ();
String result = t.generate(null);

IDP – Instrumente pentru Dezvoltarea Programelor 23
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

G
Generatoare Parametrizate
P i
<%@ jet package="hello" class="HelloTemplate" %>
Hello <%=argument%>!
Hello,

Generare HelloTemplate:
protected final String TEXT_1 = "Hello, ";
protected final String TEXT_2 = "!";
public String generate(Object argument) {
final StringBuffer stringBuffer = new StringBuffer();
stringBuffer append(TEXT 1);
stringBuffer.append(TEXT_1);
stringBuffer.append(argument);
stringBuffer.append(TEXT_2);
return stringBuffer.toString();
}
Folosire:
HelloTemplate t = new HelloTemplate();
String result = t.generate("Christof");

IDP – Instrumente pentru Dezvoltarea Programelor 24
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Si
Sintaxa JET
JET
 Directiva JET 
<%@ jet package="hello"
package= hello class=
class="HelloTemplate"
HelloTemplate
%>
Mai multe atribute pentru…
Importarea pachetelor imports="java.io.* java.util.*"
Modificarea etichetelor JET startTag="<@" endTag="@>"
 Expresii <%= argument+"xyz" %>
 Scriptlets
S i tl t
<% int x=0; x++; %>
<% if (dayTime.isMorning()) {%> Good Morning
<% } else { %> Good Afternoon <% } %>
 Variabile predefinite:
StringBuffer stringBuffer: ieşirea generatorului
<% stringBuffer.append("Hello again!"); %>
Object argument: parametru al metodei generate

IDP – Instrumente pentru Dezvoltarea Programelor 25
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

E
Exemple JET
l JET

IDP – Instrumente pentru Dezvoltarea Programelor 26
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Evaluare Parţială (PE)


Evaluare Parţială (PE)
PE este o tehnică de optimizare
1. Evaluarea părţilor constante ale programului înainte de runtime
2. Înlocuirea lor prin rezultatul produs
Exemplu de cod neoptimizat:
public class Computation {
double x = Math.sqrt(21);
int[] a = sortedRandomArray(10000);

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

IDP – Instrumente pentru Dezvoltarea Programelor 27
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Partial Evaluation (PE)
Folosirea unui template pentru evaluarea parţială:
<%@ 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++) { %>
, <%=a[i]%>
<%}%> };
}

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

IDP – Instrumente pentru Dezvoltarea Programelor 28
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Şablon de Proiectare Factory


Şablon de Proiectare Factory
 Folosirea unui obiect factory cu metode factory pentru crearea altor obiecte
 Abstracţia unui constructor pentru implementarea de scheme flexibile de 
alocare
 O metodă factory pentru fiecare tip de obiect ce poate fi creat, întorcând 
obiectul creat
Ar putea să aleagă clasa obiectului creat în mod dinamic
Ar putea să‐l întoarcă dintr‐un pool de obiecte
 Exemple: 
Teme UI configurabile / look & feel 
Back‐end ajustabil (e.g. compiler: for Java, .net, x86, …)
Structuri de date configurabile (e.g. arbori cu diverse noduri)
 Generarea e utilă şi pentru alte şabloane de proiectare (e.g. proxies)
Fiecare buton e creat de către o altă clasă:

IDP – Instrumente pentru Dezvoltarea Programelor 29
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

G
Generator Factory
t F t
Dorim să generăm clase factory precum:
class CoolTheme implements Theme { Părţile
ţ albastre sunt
public JButton newJButton() { diferite de la factory
return new CoolButton(); la factory.
}
public
bli JTextField
i ld newJTextField()
i ld() { Ele reprezintă
return new CoolTextField(); parametrii noştri.
}
...
}

Folosim următorul tip de argument pentru generator:


class Factory {
String className; Clasa Metatype
Class interf; poate reprezenta
Hashtable<String String> classes;
Hashtable<String, o interfaţă
i t f ţă Java.
J
}

IDP – Instrumente pentru Dezvoltarea Programelor 30
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Generator Factory
Generator Factory
<%@ jet class="FactoryTemplate"
imports="java.lang.reflect.*" %>
<% Factory f = (Factory) argument; %>
class <%=f.className%>
implements <%=f.interf.getSimpleName()%> {
<% for(Method m : f.interf.getMethods()) { %>
<% String tname = m.getReturnType().getSimpleName();%>
public <%=tname%> new<%=tname%>() {
return new <%=f.classes.get(tname)%>();
}
<%}%>
}
public String generate(Object argument) { …
Factory f = (Factory) argument; …
for(Method m : f.interf.getMethods()) {
String tname = m.getReturnType().getSimpleName();
… stringBuffer.append(tname); …
}… }

IDP – Instrumente pentru Dezvoltarea Programelor 31
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

F l i
Folosirea Generatorului Factory
G t l iF t
import 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 l
f.classes.put("JTextField",
t("JT tFi ld" "C"CoolTextField");
lT tFi ld")

FactoryTemplate t = new FactoryTemplate();


String
g result = t.generate(f);
g
Writer output = new BufferedWriter(
new FileWriter(f.className+".java"));
output.write(result);
output close();
output.close();
} catch(Exception ex) { ex.printStackTrace(); }

IDP – Instrumente pentru Dezvoltarea Programelor 32
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

G
Generator Getter/Setter
G /S
 Şablon comun: generarea extensiilor pentru clase existente (extensii de class)
 Generarea subclasei unei clase pe care dorim să o extindem, 
b l i i l d i ă i d
i.e. Generatorul primeşte superclasa ca argument
 Subclasa generată poate fi folosită în locul superclasei, dar încorporează 
ţ p
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 getter
 Metodele getter & setter sunt una dintre principalele caracteristici ale Java Beans

class XBean extends X {


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

IDP – Instrumente pentru Dezvoltarea Programelor 33
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Generator Getter/Setter
Generator Getter/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()%>
g
get<%=f.getName().substring(0,1).toUpperCase()
g () g( , ) pp ()
+ f.getName().substring(1)%>() {
return <%=f.getName()%>;
}
<% if(!M
if(!Modifier.isFinal(f.getModifiers()))
difi i Fi l(f tM difi ())) { %>
public void
set<%=f.getName().substring(0,1).toUpperCase()
+ f.getName().substring(1)%>
g g
(<%=f.getType().getName()%> value) {
<%=f.getName()%> = value;
}
<%}%>
<%}%> }

IDP – Instrumente pentru Dezvoltarea Programelor 34
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

G
Generator de Automat cu Stări Finite
d A S ă i Fi i
 Generarea de cod algoritmic customizat pentru anumite date (tailored code)
 Exemplu: scanere, parsere, calcule numerice
p p
 Exemplul nostru: generarea de cod pentru un Automat cu Stări Finite 
pornind de la o descriere a stărilor şi tranziţiilor
 Automate cu Stări Finite:
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
g ţ ş
Execuţia se opreşte într‐una din stările terminale
Go to Go
swimming pool Watch others dive home
0 1 3 5
Climb up Climb
diving down Ouch!!!
platform again
Jump
2 4
IDP – Instrumente pentru Dezvoltarea Programelor 35
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Modelul Automatului cu Stări Finite


Modelul Automatului cu Stări Finite
 ASF: lista tuturor stărilor (de interes) şi referinţa la  class FSM {
starea iniţială String name;
 Stare: lista tuturor posibilelor tranziţii State[] states;
State start;
 Tranziţie:  eticheta şi starea destinaţie }
 Nu
Nu există stări terminale: stările din care nu se mai 
există stări terminale: stările din care nu se mai class State {
poate înainta din lipsa unor tranziţii de ieşire String label;
State s0 = new State("0"); List<Transition>
State s1 = new State("1");
State( 1 ); transitions;
… }
FSM fsm = new FSM("SwimmingPool",
new State[]{s0,s1,s2,s3,s4,s5}, s0); class Transition {
s0.transitions.add(new Transition( String label;
"Go to swimming pool", s1)); State target;
s1.transitions.add(new Transition( }
"W t h others
"Watch th dive",
di " s3));
3))

IDP – Instrumente pentru Dezvoltarea Programelor 36
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

G
Generator Automat cu Stări Finite
t A t t Stă i Fi it
<%@ jet class="FSMTemplate" imports="java.util.*" %>
<% FSM fsm = (FSM) argument;
i t stateNum
int t t N = 0;
0
Hashtable<State, Integer> numForState
= new Hashtable<State, Integer>();
%>
import java.io.*;
class <%=fsm.name%> {
<% for(State s : fsm.states) { %>
public void
<% if(!numForState.containsKey(s)) { %>
<%="state"+stateNum%>
<% numForState.put(s, stateNum); stateNum++; %>
<% } else { %>
<%="state"+numForState.get(s)%>
<%}%> () { /* …corpul metodei pe următorul slide… */ }
<%}%>
}

IDP – Instrumente pentru Dezvoltarea Programelor 37
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Generator Automat cu Stări Finite


Generator Automat cu Stări Finite
System.out.println("<%=s.label%>");
<% for(int i=0; i<s.transitions.size(); i++) { %>
System.out.println(
"<%=i%>...<%=s.transitions.get(i).label%>");
<%}%>
try {
String input = new BufferedReader(
new InputStreamReader(System.in)).readLine();
<% for(int i=0; i<s.transitions.size(); i++) {
State target = s.transitions.get(i).target; %>
if(input.equals("<%=i%>"))
<% if(!numForState.containsKey(target)) { %>
<%="state"+stateNum %>
<% numForState.put(target,stateNum); stateNum++; %>
<% } else { %>
<%="state"+numForState.get(target)%>
<%}%>();
<%}%>
%}%
} catch(IOException ex) { ex.printStackTrace(); }

IDP – Instrumente pentru Dezvoltarea Programelor 38
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Exemplu de ieşire a generatorului ASF


Exemplu de ieşire a generatorului ASF
public void state0() {
System.out.println("0");
System out println("0
System.out.println("0...Go
Go to swimming pool");
try {
String input = new BufferedReader(…).readLine();
if(input.equals("0")) state1();
} catch(IOException ex) { ex.printStackTrace(); }
}
public void state1() {
System out println("1");
System.out.println( 1 );
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();
} catch(IOException ex) { ex.printStackTrace(); }
} …

IDP – Instrumente pentru Dezvoltarea Programelor 39
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Folosirea ASF
Pornirea ASF-ului generat:

SwimmingPool sp = new SwimmingPool();


sp.state0();

Execuţia ASF-ului (output abreviat):

0...Go to swimming pool


0
0...Watch others dive
1...Climb up diving platform
1
0...Climb down again
1...Jump
1
0
0...Ouch!!!
O h!!!

IDP – Instrumente pentru Dezvoltarea Programelor 40
Platformă de e‐learning și curriculă e‐content pentru 
învățământul superior tehnic

Sumar
 Sintaxa JET
Expresii
Scriptlets
Variabile predefinite (argument, stringBuffer)
 Generatoarele pot rezolva diverse probleme
p p
Evaluarea parţială a codului programului
Suport pentru şabloane de proiectare
Generarea de extensii
Generarea de cod algoritmic customizat
Altele (e.g. generarea de interfeţe)
IDP – Instrumente pentru Dezvoltarea Programelor 41

S-ar putea să vă placă și

  • Proiectul de An
    Proiectul de An
    Document43 pagini
    Proiectul de An
    Rosca Doinita
    Încă nu există evaluări
  • ExamAC Ro
    ExamAC Ro
    Document16 pagini
    ExamAC Ro
    Rosca Doinita
    100% (1)
  • Amoo Partea I
    Amoo Partea I
    Document20 pagini
    Amoo Partea I
    Rosca Doinita
    Încă nu există evaluări
  • Proiect de An
    Proiect de An
    Document23 pagini
    Proiect de An
    Cristina Florea
    Încă nu există evaluări
  • Ac Răspunsuri
    Ac Răspunsuri
    Document19 pagini
    Ac Răspunsuri
    Rosca Doinita
    Încă nu există evaluări
  • Raspunsuri AMSI
    Raspunsuri AMSI
    Document11 pagini
    Raspunsuri AMSI
    Cristina Florea
    Încă nu există evaluări
  • Lab10 11 12 13BDC
    Lab10 11 12 13BDC
    Document7 pagini
    Lab10 11 12 13BDC
    Rosca Doinita
    Încă nu există evaluări
  • Lab4 Aplicatii Web Ro
    Lab4 Aplicatii Web Ro
    Document1 pagină
    Lab4 Aplicatii Web Ro
    Rosca Doinita
    Încă nu există evaluări
  • Examen PS
    Examen PS
    Document45 pagini
    Examen PS
    Rosca Doinita
    Încă nu există evaluări
  • BDC Laborator 13
    BDC Laborator 13
    Document5 pagini
    BDC Laborator 13
    Rosca Doinita
    Încă nu există evaluări
  • Teza Licenta Magazin Online
    Teza Licenta Magazin Online
    Document26 pagini
    Teza Licenta Magazin Online
    KristinutzaProdan
    0% (1)
  • Examen TIDPP
    Examen TIDPP
    Document3 pagini
    Examen TIDPP
    Rosca Doinita
    Încă nu există evaluări
  • Orar Examen FR IV
    Orar Examen FR IV
    Document3 pagini
    Orar Examen FR IV
    Rosca Doinita
    Încă nu există evaluări
  • Lab3 Gen Doc Ro
    Lab3 Gen Doc Ro
    Document1 pagină
    Lab3 Gen Doc Ro
    Rosca Doinita
    Încă nu există evaluări
  • Lab2 Studiu IDE Ro
    Lab2 Studiu IDE Ro
    Document1 pagină
    Lab2 Studiu IDE Ro
    Rosca Doinita
    Încă nu există evaluări
  • Prezentare 10
    Prezentare 10
    Document12 pagini
    Prezentare 10
    Rosca Doinita
    Încă nu există evaluări
  • PR 7
    PR 7
    Document41 pagini
    PR 7
    Rosca Doinita
    Încă nu există evaluări
  • Prezentare 3
    Prezentare 3
    Document10 pagini
    Prezentare 3
    Rosca Doinita
    Încă nu există evaluări
  • Lab1 Git Ro
    Lab1 Git Ro
    Document17 pagini
    Lab1 Git Ro
    Rosca Doinita
    Încă nu există evaluări
  • PR 5
    PR 5
    Document67 pagini
    PR 5
    Rosca Doinita
    Încă nu există evaluări
  • PR 6
    PR 6
    Document110 pagini
    PR 6
    Rosca Doinita
    Încă nu există evaluări
  • Prezentare 11
    Prezentare 11
    Document16 pagini
    Prezentare 11
    Rosca Doinita
    Încă nu există evaluări
  • Prezentare 7
    Prezentare 7
    Document8 pagini
    Prezentare 7
    Rosca Doinita
    Încă nu există evaluări
  • Prezentare 8
    Prezentare 8
    Document34 pagini
    Prezentare 8
    Rosca Doinita
    Încă nu există evaluări
  • Prezentare 7
    Prezentare 7
    Document8 pagini
    Prezentare 7
    Rosca Doinita
    Încă nu există evaluări
  • Prezentare 7
    Prezentare 7
    Document8 pagini
    Prezentare 7
    Rosca Doinita
    Încă nu există evaluări
  • PR 7
    PR 7
    Document41 pagini
    PR 7
    Rosca Doinita
    Încă nu există evaluări
  • pr8 PDF
    pr8 PDF
    Document113 pagini
    pr8 PDF
    Rosca Doinita
    Încă nu există evaluări
  • Prezentare 2
    Prezentare 2
    Document9 pagini
    Prezentare 2
    Rosca Doinita
    Încă nu există evaluări
  • PR 6
    PR 6
    Document110 pagini
    PR 6
    Rosca Doinita
    Încă nu există evaluări