licenta - final - cipri
DESCRIPTION
Final thesisTRANSCRIPT
Universitatea „Politehnica” din Timişoara Facultatea de Automatică şi Calculatoare
Departamentul Calculatoare
Analiza semantică a calității proiectării în sisteme orientate pe obiecte
Ciprian LUCACI
Proiect de diplomă
Iunie 2012
Conducător științific
Conf. Dr. Ing. Radu MARINESCU
5 CUPRINS
Cuprins
Capitolul 1. Introducere ............................................................................................................ 8
1.1. Context ....................................................................................................................8 1.2. Contribuție ..............................................................................................................9 1.3. Organizarea lucrării................................................................................................ 10
Capitolul 2. Fundamente .........................................................................................................11
2.1 Calitate ................................................................................................................... 11 2.2 Analizabilitatea ....................................................................................................... 11 2.3. Predispoziția la schimbare ..................................................................................... 12 2.4. Tag Cloud ............................................................................................................... 13 2.5. Coeziune ................................................................................................................ 14 2.6. Analiză formală ...................................................................................................... 14 2.7. Mentenanța........................................................................................................... 15 2.8. Lizibilitatea ............................................................................................................ 16 2.9. Metrici ................................................................................................................... 18 2.10. Tool-uri ................................................................................................................ 18
2.10.1. iPlasma ................................................................................................. 18 2.10.2. WordNet .............................................................................................. 19 2.10.3. eRCA .................................................................................................... 19 2.10.4. inFusion................................................................................................ 20 2.10.5. jHotDraw .............................................................................................. 20 2.10.6. ProGuard .............................................................................................. 20 2.10.7. GraphViz .............................................................................................. 20 2.10.8 OpenCloud ............................................................................................ 21
Capitolul 3. Stadiu actual.........................................................................................................22
3.1. Vizualizări .............................................................................................................. 22 3.2. Coeziune ................................................................................................................ 22 3.3. Claritate ................................................................................................................. 23
Capitolul 4. Concepte ................................................................................................................25
4.1. Semantica și Calitatea ............................................................................................ 25 4.2. Word Cloud ........................................................................................................... 26 4.3. Coeziunea semantică ............................................................................................. 27 4.4. Claritatea codului................................................................................................... 28
Capitolul 5. Implementare ......................................................................................................30
5.1. WordCloud ............................................................................................................ 30 5.1.1. Procesarea identificatorilor .................................................................... 30 5.1.2. Method WordCloud ............................................................................... 32 5.1.3. Class WordCloud .................................................................................... 33 5.1.4. Package WordCloud ............................................................................... 34 5.1.5. System WordCloud ................................................................................. 35
5.2. Coeziune Semantică ............................................................................................... 36 5.2.1. Contextul simplu .................................................................................... 36 5.2.2. Contextul extins ..................................................................................... 37 5.2.3. Coeziunea conceptelor ........................................................................... 39
6
5.2.4. Conceptele cheie .................................................................................... 41
5.3. Claritatea Codului .................................................................................................. 43 5.3.1. Claritatea identificatorilor ...................................................................... 43 5.3.2. Claritatea metodelor .............................................................................. 44 5.3.3. Claritatea claselor ................................................................................... 48
Capitolul 6. Studiu experimental ..........................................................................................50
6.1. WordCloud ............................................................................................................ 50 6.1.1. Metode .................................................................................................. 50 6.1.2. Clase ...................................................................................................... 54 6.1.3. Pachete .................................................................................................. 57 6.1.4. Sistem .................................................................................................... 58
6.2. Coeziune ................................................................................................................ 60 6.2.1. jHotDraw vs. ProGuard ........................................................................... 60 6.2.2 Concepte cheie........................................................................................ 61
6.3. Claritate ................................................................................................................. 65 6.3.1. Metode .................................................................................................. 65 6.3.2. Clase ...................................................................................................... 69
Capitolul 7. Concluzii ................................................................................................................70
7.1. WordCloud ............................................................................................................ 70 7.2. Coeziune semantică ............................................................................................... 70 7.3. Claritate ................................................................................................................. 70
Capitolul 8. Dezvoltări ulterioare .........................................................................................72
8.1. WordCloud ............................................................................................................ 72 8.2. Coeziunea semantică ............................................................................................. 72 8.3. Claritatea Codului .................................................................................................. 72
Capitolul 9. Bibliografie ...........................................................................................................74
Anexa A. Claritatea Metodelor ...............................................................................................77
Anexa B. Claritatea Claselor ...................................................................................................78
Anexa C. jHotDraw System Overview...................................................................................79
Anexa D. ProGuard System Overview ..................................................................................80
Anexa E. jHotDraw vs. ProGuard – coeziunea semantică a pachetelor ......................81
Anexa F. jHotDraw vs. ProGuard – claritate .......................................................................82
7 INDEX FIGURI
Index figuri Figura 2.1 – Tag Cloud .................................................................................................................................... 13
Figura 2.2 – Formal context ............................................................................................................................. 15
Figura 3.1 – Tipuri de coeziune sintactică ........................................................................................................ 23
Figura 5.1 – Expresiile regulate pentru divizarea identificatorilor ..................................................................... 30
Figura 5.2 – Procesarea identificatorilor .......................................................................................................... 31
Figura 5.3 – WordCloud pentru metodă ........................................................................................................... 33
Figura 5.4 – WordCloud pentru clasă ............................................................................................................... 34
Figura 5.5 – WordCloud pentru pachet ............................................................................................................ 35
Figura 5.6 – WordCloud pentru sistem ............................................................................................................. 36
Figura 5.7 – NodeFigure – contextul formal simplu .......................................................................................... 37
Figura 5.8 – NodeFigure – contextul formal extins ........................................................................................... 38
Figura 5.9 – RectangleFigure – laticea de concepte ......................................................................................... 40
Figura 5.10 – NodeFigure – laticea de concepte filtrată ................................................................................... 41
Figura 5.11 – NodeFigure – conceptele cheie .................................................................................................. 42
Figura 5.12 – Claritatea metodelor .................................................................................................................. 48
Figura 5.13 – Claritatea claselor ...................................................................................................................... 49
Figura 6.1 – getCappedPath – WordCloud-ul metodei ...................................................................................... 51
Figura 6.2 – fromPathData – WordCloud-ul metodei ....................................................................................... 52
Figura 6.3 – XMLElement – WordCloud-ul clasei .............................................................................................. 55
Figura 6.4 – AttributeKeys – WordCloud-ul clasei ............................................................................................. 56
Figura 6.5 – org.jhotdraw.draw – WordCloud-ul pachetului ............................................................................. 57
Figura 6.6 – org.jhotdraw.gui – WordCloud-ul pachetului ................................................................................ 58
Figura 6.7 – jHotDraw – WordCloud-ul sistemului ............................................................................................ 59
Figura 6.8 – ProGuard – WordCloud-ul sistemului ............................................................................................ 59
Figura 6.9 – jHotDraw vs. ProGuard – coeziune ............................................................................................... 61
Figura 6.10 - AbstractFigure – laticea de bază a conceptelor ............................................................................ 62
Figura 6.11 – AbstractFigure – laticea conceptelor filtrată și conceptele cheie.................................................. 63
Figura 6.12 – RectangleFigure – laticea de bază .............................................................................................. 63
Figura 6.13 – RectangleFigure – laticea filtrată și conceptele cheie .................................................................. 64
Figura 6.14 – codul metodei DoubleStroke.getCappedPath .............................................................................. 66
Figura 6.15 – codul metodei GenericListener.raiseToPublicClass ...................................................................... 66
Figura 6.16 – Distribuția problemelor metodelor în funcție de lizibilitate .......................................................... 67
Figura 6.17 – Distribuția problemelor metodelor în funcție de complexitate ..................................................... 68
Figura 6.18 – Distribuția problemelor metodelor în funcție de claritate ............................................................ 68
Figura 6.19 – Distribuția problemelor claselor în funcție de claritate ................................................................ 69
8 1.1. Context
Capitolul 1. Introducere Sistemele software de astazi sunt intr-o continuă evoluție care duce la o
creștere a complexității lor. Lehman [31] spunea că sistemele software pentru a
trăi într-un mediu care este într-o continuă schimbare trebuie să se adapteze.
Mentenanța și costurile mentenanței sistemelor software sunt o constantă de
neevitat la orice produs software iar calitatea unui produs este cea care
influențează dramatic costurile întreținerii.
1.1. Context
Pentru început încercând să folosim industria auto ca o analogie pentru
industria software am putea să realizăm un studiu legat de diferența de calitate
între două mărci auto. De exemplu, care este diferența dintre Dacia și Mercedes? În
fond și la urma urmei ambele au un singur motor, ambele au patru roți, transportă
tot atâția pasageri, ambele „implementează” aceleași funcționalități esențiale.
Care este totuși diferența? Răspunsul ar fi probabil destul de simplu și ar consta în
diferența dintre numărul de „feature”-uri implementate și „optimizarea
algoritmilor”.
Dacă în cazul celor două mărci diferențele ar fi destul de evidente atunci ce
am putea să spunem în cazul unei comparații între autoturismele VW Golf și
Renault Megane? Ambele automobile fac parte din aceeași categorie, ambele au un
preț apropiat, se adresează aceleași piețe și „implementează” în principiu aceleași
funcționalități. Atunci cum am putea să le diferențiem din perspectiva calității?
Răspunsul se găsește în „detalii”. Ce ați spune dacă la modelele din anul 2008, o
simplă sarcină cotidiană cum ar fi schimbarea unui bec la faza scurtă la faruri ar
dura la una dintre ele 1 minut și la alta 30 de minute chiar și pentru un mecanic
profesionist? Ce ați spune de „arhitectura acelui sistem”, dacă la o mașină ar
trebui pur și simplu ridicată capota, luat un căpăcel și schimbat becul? Dar dacă în
cazul alteia ar trebui ridicată mașina pe cric, dată jos roata din față de pe partea
cu becul, înghesuită mâna printr-un orificiu mic, schimbat becul, pusă roata înapoi
și apoi dată mașina jos de pe cric? Fără a încerca să favorizăm o anumită marcă
auto, aceasta este una dintre diferențele dintre VW Golf și Renault Megane, la VW
schimbarea becului durează un minut iar la Renault durează câteva zeci de
minute.1
Dificultatea mentenaței se datorează în primul rând arhitecturii neinspirate a
componentelor mecanice. În al doilea rând, niciun om obișnuit nu s-ar gândi să
schimbe un bec dând jos roata. Acest lucru se datorează și faptului că cele două
componente, în mod normal nu au legătură unele cu altele. Din punct de vedere
1 Experiment realizat la emisiunea FifthGear, sezonul 14, episodul 2 [Online 01.06.2012
http://www.youtube.com/watch?v=nXCZ2v-nIF4 ]
9 INTRODUCERE
semantic, cele două cuvinte „bec” și „roată” nu sunt foarte apropiate atunci când
este vorba de întreținerea sistemului de iluminare.
Revenind la industria software calitatea unui sistem constă și în ușurința cu
care un sistem poate fi întreținut. Dacă pentru a schimba un „bec” trebuie să
demontăm „roata” am avea suficiente motive să credem că este foarte probabil ca
și în alte locuri să întâlnim carențe de design. În al doilea rând sistemele software
sunt scrise pornind de la cuvinte care au un anumit sens iar rapiditatea cu care se
poate asigura mentenața sistemului depinde și cât de rapid se pot identifica
punctele prin care se face schimbarea.
Când încercăm să comparăm două sisteme software, numărul de feature-uri
implementate și optimizările pot fi evaluate și comparate relativ ușor dar la fel
cum diferențele de calitate se fac până la nivelul detaliilor, la fel este și în
industria software, detaliile fac diferența.
1.2. Contribuție
Pentru că, într-un mod simplist spus, sistemele software pornesc de la cuvinte
scrise într-un editor de text în această lucrare ne-am propus să studiem relația
dintre semantica identificatorilor folosiți în scrierea codului și calitatea sistemului.
Există vreo relație între cuvintele folosite în scrierea codului și calitatea unui
sistem? Sensul cuvintelor și ușurința cu care pot fi înțelese de către un utilizator
uman fac parte din detaliile unui sisttem.
Cuvintele folosite în construirea identificatorilor ar putea fi considerate doar o
preferință și o chestiune legată doar de aspect, fără o funcționalitate directă
asupra sistemului. De asemenea ne-am propus să investigăm dacă alegerea
cuvintelor are vreun impact asupra înțelegerii sistemului și dacă acestea oferă
informații suplimentare utile procesului de mentenanță.
Lucrarea de față urmărește trei obiective. În primul rând, pentru că procesul
de mentenanță este mare consumator de timp, primul obiectiv este investigarea
unei posibile soluții de eficientizare a timpului consumat pornind de la semantica
identificatorilor, „pe unde trebuie schimbat becul?”. În al doilea rând, ne-am
propus să identificăm care este coeziunea semantică a unei clase, care sunt
cuvintele care îi dau „sens” și care este legătura dintre acestea, „ce relație este
între roată și bec, dar capotă și bec”. În al treilea rând, pentru că felul în care sunt
folosite cuvintele într-un text dau claritate acestuia, ne-am propus să construim o
modalitate de a cuantifica numeric claritatea codului unui sistem, „este ușor de
înțeles cum trebuie schimbat becul?”. De asemenea a fost studiată relația dintre
claritatea metodelor și claselor și problemele lor de arhitectură, dacă există vreo
corelație între cele două.
Cele trei tematici sunt abordate sub numele de WordCloud, Coeziune și
Claritate, toate trei bazându-se pe semantica identificatorilor.
10 1.3. Organizarea lucrării
1.3. Organizarea lucrării
Această lucrare este structurată în următoarele capitole:
Capitolul 2 - Fundamente descrie câteva concepte fundamentale folosite pe
parcursul lucării. Baza teoretică constă într-o descriere a elementelor ce constituie
calitatea sistemelor software. Este definit conceptul WordCloud. Sunt prezentate
câteva elemente ale analizei formale și cum este ea folosită în combinație cu
semantica cuvintelor. De asemenea sunt definite câteva metrici folosite pe
parcusul lucrării. În ultimul rând sunt prezentate tool-urile folosite și sistemul
analizat.
Capitolul 3 – Studiu actual prezintă soluții alternative moderne și alte abordări
legate de semantica identificatorilor în domeniul software. De asemenea este
prezentată o scurtă critică la adresa acestora justificând în același timp noile
abordări.
Capitolul 4 – Concepte prezintă conceptual modul de abordare și soluțiile
propuse la obiectivele identificate în introducere.
Capitolul 5 – Implementare continuă prin a detalia modul de implementare a
soluțiilor și particularitățile acestora în funcție de nivelul de analiză al codului,
respectiv metodă, clasă, pachet sau întreg sistemul.
Capitolul 6 – Studiu experimental prezintă rezultatele studiului efectuat
asupra sistemului jHotDraw. De asemenea prezintă observațiile și relațiile
particulare care se pot observa pornind de la datele obținute.
Capitolul 7 – Concluzii prezintă concluziile generale obținute în urma
studiului. Sunt prezentate relațiile și impactul semanticii asupra calității sistemelor
software.
Capitolul 8 – Dezvoltări ulterioare încheie lucrarea prin a prezenta viitoare
direcții de studiu în contextul semanticii și sistemelor software. De asemenea se
prezintă și idei practice pentru posibile funcționalități noi pentru tool-uri deja
existente.
11 FUNDAMENTE
Capitolul 2. Fundamente În acest capitol vor fi prezentate conceptele teoretice fundamentale de la care
s-a pornit în realizarea studiului din lucrarea de față. De asemenea vor fi
prezentate și instrumentele software folosite pentru realizarea studiului.
2.1 Calitate
În cartea sa, Quality Code, Spinnelis [20] spune că putem privi calitatea
software-ului din mai multe perspective. Un punct de plecare poate fi specificațiile
și definirea calității în funcție de conformarea la acele cerințe sau putem lua în
considerare oamenii și să definim calitatea ca măsura în care software-ul satisface
dorințele și așteptările clienților și utilizatorilor. Indiferent cum privim calitatea,
ea este importantă. Calitatea, timpul și costul sunt cei trei factori fundamentali ce
determină succesul sau eșecul oricărui proiect software iar calitatea este doar unul
dintre acei factori care nu pot fi schimbați pe moment de un decret managerial.
Standardul ISO/IEC 9126 [21] definește modelul calității pentru produsele
software pornind de la următoarele categorii de caracteristici interne sau externe
ale calității software-lului: funcționalitate, fiabilitate, utilizabilitate, eficiență,
mentenabilitate și portabilitate.
Spinnelis [20] este de părere că mentenabilitatea unui produs software este
probabil elementul care poate fi cel mai bine abordat la nivel de design și
implementare efectivă a codului. Când vorbim de mentenabilitatea unui sistem,
suntem interesați de analizabilitatea lui, cât de ușor este pentru noi să localizăm
elementele pe care vrem să le îmbunătățim sau să le reparăm; capacitatea de
schimbare, câtă muncă este necesară pentru implementarea unei modificări;
stabilitate, cât de puține lucruri se strică după schimbarea noastră; și
testabilitate, abilitatea de a valida noile modificări.
2.2 Analizabilitatea
Un element important în mentenabilitatea software-ului este analizabilitatea.
Spinnelis [20] afirmă că această proprietate are în vedere două aspecte: când
lucrurile merg rău, vrem să localizăm cauzele erorii iar când vin noi specificații,
vrem să fim capabili să localizăm părțile din software care urmează să fie
modificate.
Multe elemente ale analizabilității unui program sunt legate în mod intim de
procesele cognitive ce se desfășoară în mințile noastre pe măsură ce încercăm să
înțelegem o porțiune de cod. Un element cognitiv de bază ce afectează modul în
care lucrăm cu programele pare a fi numărul limitat de „registre mașină” pe care
le avem în creierele noastre; psihologii le numesc pe acestea memoria de scurtă-
durată. Într-o lucrare clasică intitulată The Magical Number Seven, Plus or Minus
12 2.3. Predispoziția la schimbare
Two: Some Limits on Our Capacity for Processing Information (Numărul magic
șapte, plus sau minus doi: câteva limitări ale capacității noastre de a procesa
informația) [22], George Miller a arătat printr-un număr de experimente că
memoria noastră imediată sau de scurtă durată poate reține aproximativ șapte
(plus sau minus două) elemente discrete.
Pornind de la noua înțelegere dobândită a felului în care mințile noastre
analizează software-ul, Spinnelis [20] spune că acum suntem pregătiți să studiem
analizabilitatea unui sistem la diferite nivele. Când ne uităm la cod în cel mai
restrâns sens posibil vorbim despre lizibilitatea codului. Stilul joacă un rol central
în lizibilitatea unui program; acesta cuprinde formatarea expresiilor și
instrucțiunilor, indentarea, denumirea fișierelor și identificatorilor și comentariile.
Odată ce ne ridicăm ochii de la copaci pentru a vedea pădurea design-ului
sistemului, putem vorbi despre gradul de înțelegere a codului (ușurința de a fi
priceput de procesele noastre cognitive).
În această lucrare soluția propusă pentru a identifica locurile în care un sistem
trebuie schimbat și cât de ușor poate fi această schimbare implementată va porni
de la particularitățile lizibilității codului și particularitățile creierului uman.
Semantica, sensul cuvintelor este un concept intrinsec gândirii și raționamentului
uman. De aceea semantica identificatorilor, sensul cuvintelor care descriu diferite
porțiuni de cod vor fi cruciale în analiza lizibilității unei porțiuni de cod.
2.3. Predispoziția la schimbare
Pe lângă analizabilitatea unui sistem, dificultatea sau ușurința unui sistem de a
se adapta la schimbări este o altă caracteristică a mentenabilității, deci a calității.
Predispoziția unui sistem la schimbare se referă la cât de ușor putem implementa
anumite modificări specifice [20]. Există un număr de proprietăți asociate ce
contribuie la această predispoziției a sistemului: cât de ușor putem identifica
elementele care trebuie schimbate, cât de mult se extind modificările în
comparație cu modificările prevăzute în specificație și în ce măsură implementarea
noastră a modificărilor afectează restul sistemului.
Spinnelis [20] prezintă două procedee pentru identificarea locului unde trebuie
implementată noua funcționalitate. Când vrem să schimbăm un element al unui
sistem software, putem să îl localizăm fie începând de sus în jos (top-down), fie de
jos în sus (bottom-up). Lucrând de sus în jos implică înțelegerea de ansamblu a
structurii pentru a identifica subsistemul unde schimbarea trebuie implementată și
apoi aplicată modificarea în mod recursiv aplicând aceeași tehnică până
identificăm codul care trebuie modificat. Ușurința cu care putem îndeplini această
sarcină depinde de cât de inteligibil este sistemul.
Majoritatea sistemelor sunt mult prea complicate iar sarcinile de mentenanță
sunt mult prea mici pentru a justifica efortul de a învăța întreaga structură a
13 FUNDAMENTE
Figura 2.1 – Tag Cloud
sistemului la un nivel de detaliu care să ne permită identificarea codului care
trebuie schimbat într-o manieră de sus în jos (top-down). În majoritatea cazurilor
este mult mai profitabil adoptarea tehnicii de jos în sus (bottom-up), în care sunt
folosite tehnici euristice și intuiția programatorului pentru a identifica porțiunea
de cod ce trebuie schimbată. Uneori sunt combinate cele două tehnici pentru a
traversa porțiuni mari de cod [20].
Un alt element foarte util pentru identificarea elementelor care trebuie
schimbate este folosirea intuitivă și consistentă a numelor pentru toate elementele
sistemului: pachete, spații de nume, fișiere, clase, metode și funcții [20].
Ținând cont de aceste afirmații legate de schimbarea unui sistem și cum să
identificăm locul, putem să identificăm câteva aspecte despre cum trebuie să
identificăm soluția optimă la obiectivul definit. Pentru a îmbina cele două
procedee, top-down și bottom-up, în identificarea locului unde trebuie făcută o
schimbare vom utiliza conceptul de tag cloud pentru metoda top-down iar apoi
inspectarea vizuală a codului, linie cu linie, pentru bottom-up.
2.4. Tag Cloud
Un tag cloud2 (word
cloud, sau listă ponderată
în design-ul visual) este o
reprezentare vizuală
pentru datele sub formă de
text folosite pentru a
descrie metadate cuvinte
cheie (tags) în pagini web
sau pentru a vizualiza text
liber. Tag-urile sunt de
obicei cuvinte singulare iar
importanța fiecărui tag
este evidențiată prin dimensiunea și culoarea fontului. Acest format este foarte util
pentru observarea rapidă a celor mai proeminenți termeni și pentru a localiza un
termen alfabetic și apoi a determina proeminența lui relativă [23]. Codul fiind în
esență un simplu text se pretează la o astfel de vizualizare.
2 Figura 2.1 reprezintă tag cloud-ul format din cuvintele principale conținute în lucrarea de față în funcție
de ponderea lor. Imaginea a fost generată cu www.wordle.net
14 2.5. Coeziune
2.5. Coeziune
Un alt concept utilizat este cel de coeziune. Din punct de vedere lexical și
gramatical, coeziunea3 reprezintă o relație în cadrul unui text sau unei propoziții.
Coeziunea poate fi definită ca legăturile ce țin un text împreună și îi dau sensul.
Coeziunea este legată de conceptul mai larg coerență.
În programarea calculatoarelor, coeziunea4 este o măsură a cât de strâns
legate sunt fiecare dintre funcționalitățile exprimate de codul sursă al unui modul
software. Coeziunea este o măsurătoare de tip ordinal și este exprimată uzual sub
forma „coeziune ridicată” sau „coeziune scăzută”. Modulele cu o coeziune ridicată
tind să fie de preferat pentru că o coeziune ridicată este asociată cu câteva
trăsături dorite de software ce includ robustețe, fiabilitate, reutilizare și grad de
înțelegere ridicat, în timp ce un grad de coeziune scăzut este asociat cu trăsături
nedorite cum ar fi dificultatea procesului de mentenanță, dificultate ridicată la
testare, reutilizare scăzută și chiar dificultate de înțelegere.
Aplicată în programarea orientată pe obiecte, dacă metodele ce deservesc o
anumită clasă tind să fie similare în multe aspecte, atunci clasa are coeziune
ridicată. Într-un sistem cu o coeziune ridicată, gradul de lizibilitate și de reutilizare
a codului sunt ridicate în timp ce complexitatea este ținută sub control.
Modalitățile de a măsura coeziunea variază de la măsurători calitative ce
clasifică textul sursă analizându-l din punct de vedere hermeneutic până la
măsurători cantitative ce măsoară caracteristicile textuale ale codului sursă pentru
a ajunge la un scor numeric al coeziunii.
2.6. Analiză formală
Pentru coeziunea semantică a fost utilizat conceptul de analiză formală5. În
știința informației, analiza formală [41] a conceptelor este o modalitate de a
deriva ierarhia unui concept sau ontologia formală dintr-o colecție de obiecte și
proprietățile lor. Fiecare concept din ierarhie reprezintă un set de obiecte care
partajează aceleași valori pentru un anumit set de proprietăți și fiecare subconcept
din ierarhie conține un subset de obiecte ale conceptelor superioare.
Din punct de vedere filozofic, un concept este o unitate de idei constând din
două componente, extensia și intenția. Extensia cuprinde toate obiectele care
aparțin conceptului iar intenția cuprinde toate atributele valide pentru acele
obiecte. Prin urmare, obiectele și atributele joacă un rol important alături de
câteva relații între concepte, cum ar fi relațiile ierarhice de tipul „subconcept-
3 Cohesion (linguistics) - http://en.wikipedia.org/wiki/Cohesion_(linguistics) [Online 14.06.2012] 4 Cohesion (computer science) - http://en.wikipedia.org/wiki/Cohesion_(computer_science) [Online
14.06.2012] 5 FCA – Formal Concept Analysis (eng.)
15 FUNDAMENTE
Figura 2.2 – Formal context
superconcept”, relații tip implicație între atribute și relația de tip incidență, „un
obiect are un atribut” [42].
Un tabel cu X-uri reprezintă un tip de date foarte
simplu și des întâlnit. Structura matematică
folosită pentru a descrie formal aceste tabele
este numită un context formal (pe scurt un
context). Vorbind în termeni logici umani,
fiecare concept este reprezentat de un mic cerc
în așa fel încât extensia (intenția) constă din
toate obiectele (atributele) ale căror nume pot
atinse pe o cale ce coboară (urcă) din acel cerc
[42]. Pornind de la un tabel în care sunt descrise
obiecte și proprietățile lor se poate genera un
graf iar pe baza grafului generat, în care fiecare
punct este un concept, prin explorarea lui se
poate ajunge la descoperirea de noi cunoștințe,
cunoștințe care inițial erau implicite (vezi Figura
2.2).
2.7. Mentenanța
Dr. Chong Ho Yu [2] afirmă că există două aspecte ale eficienței. În primul
rând, afirmă el, este vorba de folosirea eficientă a resurselor computaționale.
Definiția eficienței computaționale este următoarea: considerându-se egale
rezultatele a două segmente de programe, un program mai bun este unul care
utilizează mai puține resurse computaționale, ce includ cicluri CPU, RAM sau
utilizarea discului. În al doilea rând, este vorba de folosirea eficientă a resurselor
umane. Dr. Chong definește cel de-al doilea tip de eficiență în felul următor: dacă
două seturi de programe consumă în mod egal aceleași resurse și produc același
rezultat, dar una necesită mai puțin efort uman (scriere, modificare, mentenanță
etc), acel program este considerat mai eficient.
Buse and Wimer [1] rezumă câteva axiome legate de mentenabilitatea unui
produs software. În mod tipic, mentenanța va consuma peste 70% din costul total al
unui produs [5]. Aggarwal afirmă că lizibilitatea, ușurința de a citi codul sursă și
lizibilitatea documentației, ambele sunt critice pentru mentenabilitatea unui
proiect [3]. Alți cercetători au notat faptul că citirea codului este cea mai
costisitoare componentă din punctul de vedere al timpului dintre toate activitățile
de mentenanță [29, 36, 38]. Mai mult, mentenabilitatea software-ului deseori
înseamnă evoluția software-ului și modificarea codului existent înseamnă o mare
parte a ingineriei software moderne [35].
16 2.8. Lizibilitatea
Rober L. Glass [4] afirma că mentenanța software este ...
Complexă intelectual – necesită inovație în timp ce impune constrângeri
severe asupra inovatorului
Dificilă tehnic – responsabilul trebui să fie capabil să lucreze cu un concept,
cu un design cât și cu întreg codul sursă și toate acestea în același timp
Nedreaptă – responsabilul cu mentenanța niciodată nu primește toate
lucrurile de care are nevoie, cum ar fi documentația
Fără câștig – responsabilul cu mentenanța vede doar oameni care au
probleme
Muncă murdară – responsabilul trebuie să lucreze la detalii de implementare
Trăire în trecut – codul a fost scris de cineva înainte de a deveni bun la
codare
Conservatoare – motto-ul mentenanței este „dacă nu este defect, nu repara”
Mentenanța software este foarte complexă și este o activitate istovitoare. Pentru
că lizibilitatea unui program este legată de mentenabilitatea lui, avem motive să
credem că îmbunătățind lizibilitatea în mod implicit se îmbunătățește calitatea
programului.
2.8. Lizibilitatea
Dacă este să ne întrebăm cum își folosește timpul un programator, supriza pe
care o descoperim din practică este faptul că marea parte a timpului nu este
folosită nici pentru scrierea de nou cod, nici pentru modificarea codului existent.
Atunci unde se utilizează resursa timp? Statistic vorbind, din practică se observă că
doar 5% din timp este folosit pentru scrierea de cod nou, 25% din timp este folosit
pentru modificarea codului
existent iar restul de 70% este
folosit pentru înțelegerea codului.
Modificarea codului consumă mult
mai mult din timpul unui
dezvoltator profesionist decât
scrierea de nou cod. Attwood [6] și
Hallam [7] întreabă „De ce este
folosit de 3x mai mult timp în
înțelegerea codului decât în
modificarea codului?” Răspunsul
[7] este că înainte de a modifica în
cod trebuie înțeles ce face exact acesta. Acest lucru este adevărat și despre
refactorizarea codului existent – trebuie să înțelegi comportamentul codului înainte
17 FUNDAMENTE
să poți garanta că refactorizarea nu a schimbat nimic neintenționat. Înțelegerea
codului este de departe activitatea în care dezvoltatorii profesioniști investesc cea
mai mare parte a timpului.
Spinellis [14] remarca faptul că cu patruzeci de ani în urmă, când programarea
calculatorului era o experiență individuală, nevoia unui cod ușor de citit nu era pe
lista de priorități. Însă astăzi, programarea este o activitate de echipă și scrierea
unui cod pe care alții să îl înțeleagă a devenit o necesitate.
O sarcină reprezentativă [7], tipică industriei software, este trimiterea unui
programatator în mijlocul unui cod deja existent pe care nu l-a mai văzut
niciodată, nedocumentat, scris urât, cu o arhitectură deficitară și cu câteva bug-uri
existente. Apoi să i se ceară acestuia adăugarea unei funcționalități încercând să
mențină pe cât posibil comportamentul deja existent. Motivul pentru care
programatorii cred despre codul vechi că este un haos se datorează unei legi
cardinale, fundamentale a programării: este mai greu să citești cod decât să îl scrii
[8].
Martin Fowler [9] afirma că „orice prostănac poate scrie cod pe care
computerul să îl poată înțelege. Programatorii buni scriu cod în așa fel ca oamenii
să îl poată înțelege.” Chiar și așa, cu un cod dificil de citit programul continuă să
funcționeze. Dar, întreabă Fowler, lizibilitatea codului nu este doar o judecată
legată de estetică, o simplă repulsie față de cod urât? Este așa până încercăm să
schimbăm sistemul. Compilatorului nu îi pasă de faptul că sursele sunt murdare,
inestetice sau curate, clare. Dar când schimbăm sistemul, acolo este implicată o
ființă umană și oamenilor le pasă. Un sistem cu un design deficitar este greu de
schimbat. Greu de modificat pentru că este greu de descifrat unde trebuie făcute
schimbările. Pentru că este dificil de identificat ce trebuie schimbat este o șansă
mare ca programatorul să facă o greșeală și să introducă erori [9].
Nakashian [12] afirmă că până la urmă convențiile de formatare a codului sunt
doar convenții. Oricât am dezbate între tab-uri și spații, acestea rămân subiective
și strâns legate de preferințe personale. Totuși sunt unele convenții care chiar
îmbunătățesc calitatea generală a codului. El continuă afirmând că nu doar
calitatea codului contează ci factori importanți sunt de asemenea oboseala ochiului
și citirile accidentale greșite a codului. Fără îndoială ambele sunt de asemenea
factori care afectează calitatea codului în general. Nakashian [12] argumentează
acest fapt pornind de la realitatea că sunt deseori întâlnite situațiile când
programatorii sunt extenuați din cauza unei greșeli care dacă nu s-ar fi datorat
grabei și citirii greșite ar fi putut fi cu totul evitată.
Pe lângă îmbunătățirea utilizării timpului și evitarea greșelilor, Nakashian [12]
aduce și un al treilea argument în favoarea unei lizibilități cât mai bune. El afirmă
că lizibilitatea ridicată facilitează găsirea rapidă a unor biblioteci care
implementează bine o funcționalitate folosită în mod repetat, facilitând astfel
18 2.9. Metrici
reutilizarea codului. Efectul benefic al lizibilității codului este identificarea unor
bug-uri, raportarea lor sau repararea lor pe loc. Astfel, în loc de a crea noi surse de
bug-uri, reutilizarea codului reduce duplicarea de cod și posibil rezolvă vechi
probleme [12].
De fapt, lizibilitatea este atât de importantă, încât Elshoff și Marcotty au propus
adăugarea unei faze de dezvoltare în care programul să fie făcut mai lizibil [11].
Knight și Meyers au sugerat că o fază a inspecției software ar trebui să fie
verificarea codului sursă din perspectiva lizibilității [26]. Haneef a propus
adăugarea la echipa de dezvoltare a unui grup dedicat lizibilității și documentării
[19].
2.9. Metrici
Pentru claritatea codului în implementarea metricii clarității au fost folosite
datele furnizate de câteva metrici deja consacrate în domeniul software. Câteva
dintre acestea sunt:
CYCLO – Complexitatea ciclomatică [25] se referă la numărul total de căi
posibile adunate de la toate operațiile din sistem. Este suma numărului
ciclomatic al lui McCabe [32] pentru toate operațiile. Folosim această
metrică pentru a cuantifica complexitatea funcțională intrinsecă a unui
sistem.
LOC – Numărul de linii de cod
NOA – Numărul atributelor unei clase
NOM – Numărul metodelor unei clase
NOAM – Numărul de metode accesate de o metodă
NOLV – Numărul variabilelor locale pentru o metodă
2.10. Tool-uri
Pentru extragerea datelor unui sistem, pentru analiza codului și problemelor
arhitecturale, pentru generarea de grafului de concepte și diferitelor vizualizări au
fost folosite următoarele tool-uri disponibile online.
2.10.1. iPlasma
iPlasma [28] este un mediu integrat pentru analiza calității sistemelor
orientate pe obiecte, mediu ce include suport pentru toate fazele necesare
analizei: de la extragerea modelului (parsare scalabilă pentru C\C++ și Java) până
la analiză de nivel înalt bazată pe metrici sau detecția de duplicare de cod.
iPlasma a fost dezvoltat în centrul de cercetare LOOSE6 din cadrul Universității
Politehnica Timișoara.
6 http://www.loose.upt.ro/reengineering
19 FUNDAMENTE
Implementarea soluțiilor a fost făcută direct în
iPlasma, soluțiile devenind astfel noi facilități
disponibile plajei de analize disponibile.
2.10.2. WordNet
WordNet® [30] este o mare bază de date lexicală cu cuvinte din limba engleză.
Substantive, verbe, adjective și adverbe sunt grupate în mulțimi de sinonime
cognitive (synsets), fiecare exprimând un concept distinct. Synset-urile sunt
interconectate prin relații lexicale și conceptual-semantice. Structura WordNet
face biblioteca să fie o unealtă folositoare pentru limbajele computaționale și
procesarea limbajelor naturale.
În mod superficial WordNet se aseamănă cu un lexicon prin faptul că grupează
cuvintele pe baza sensului lor. Cu toate acestea, există câteva distincții
importante. În primul rând, WordNet interconectează nu doar forma cuvintelor –
șiruri de litere – ci sensuri specifice ale cuvintelor. Ca rezultat, cuvintele care se
află în proximitate unele față de altele în rețea sunt distinse prin sensul semantic.
În al doilea rând, WordNet identifică relațiile semantice dintre cuvinte, în timp ce
gruparea cuvintelor într-un tezaur nu urmează nici un tipar explicit în afara
similarității cuvintelor.
WordNet a fost creat și continuă să fie dezvoltat în cadrul Laboratorului de
Științe Cognitive al Universității Princeton.
Pentru utilizarea Wordnet s-a utilizat biblioteca RiWordnet [27]. Ea oferă acces
ușor la ontologia WordNet pentru procesarea în Java, oferă distanțe metrice între
termenii ontologiei și asignează ID-uri unici pentru fiecare cuvânt, sens și poziție.
2.10.3. eRCA
eRCA [43] este o bibliotecă gratuită oferită de Google ce
ușureză folosirea Analizei conceptuale formale și relaționale
(eng. Formal and Relational Concept Analysis) și facilitează
tehnicile de clustering.
Câteva facilități oferite de eRCA sunt importarea ușoară a contextelor formale
direct din fișiere .CSV, posibilitatea de a descrie contexte formale direct din cod,
algoritmi pentru construirea laticei de concepte a unui context formal și, pe lângă
altele, exportarea grafului în fișiere cu formatul .DOT.
20 2.10. Tool-uri
eRCA, Eclipse's Relational Concept Analysis, a fost dezvoltată în cadrul
institutului de cercetare fracez LIRMM7.
2.10.4. inFusion
inFusion [45] este un mediu integrat ce execută review-uri de
cod și arhitecturale pentru sisteme orientate pe obiecte și
procedurale. inFusion agregă metrici, vizualizări și alte tipuri de
analize statice pentru a genera recomandări de refactorizare și interpretări legate
de identificarea și adresarea unor probleme de design structural.
Modelul de calitate [45] al inFusion este o unealtă ce oferă mijloacele pentru a
evalua într-un mod cantitativ calitatea design-ului unui sistem. Modelul este
comprehensiv și echilibrat pentru că ia în considerare atât aspecte generale de
design, cum ar fi complexitatea, încapsularea și cuplajul, cât și aspecte ce țin
doar de anumite limbaje, cum ar fi caracteristicile ierarhiilor de clase. inFusion
permite măsurarea calității atât dintr-o perspectivă generală cât și fiecare aspect
individual al calității și oferă o modalitate de monitorizare a evoluției sistemului în
timp.
2.10.5. jHotDraw
JHotDraw [39, 40] este o aplicație Java cu interfață grafică orientată pentru
Grafice structurate și tehnice. A fost dezvoltat ca un „exercițiu de design” dar deja
este foarte dezvoltat. Design-ul său se bazează puternic pe câteva modele de
design (eng. design patterns) foarte bine cunoscute.
2.10.6. ProGuard
ProGuard [47] este un produs opensource gratuit Java ce comprimă fișierele
class, optimizează, obfuschează codul și efectuează o verificare inițială.
Detectează și îndepărtează clasele nefolosite, câmpurile, metodele și atributele.
Optimiează bytecode-ul și îndepărtează instrucțiunile nefolosite. Redenumește
clasele rămase, câmpurile și metodle folosind nume scurte fără nici un sens. În
final, preprocesează codul pentru Java 6 sau pentru Java Micro Edition.
Proguard este un sistem software de dimensiuni similare cu jHotDraw. De
aceea, el va fi folosit în mod comparativ cu jHotDraw în unele analize.
2.10.7. GraphViz Graphviz [33] este un software opensource pentru vizualizarea grafurilor.
Vizualizarea grafurilor este un mod de a reprezenta informația structurală sub
formă de diagrame a grafurilor abstracte sau rețelelor.
7 Laboratoire d'Informatique, de Robotique et de Microélectronique de Montpellier (LIRMM) -
http://www.lirmm.fr/xml/fr/lirmm.html [Online 13.06.2012]
21 FUNDAMENTE
Graphviz preia descrierile grafurilor sub formă de text simplu și construiește
diagrame în formate utile, cum ar fi imagini, SVG pentru pagini web, PDF sau
Postscript pentru includerea în alte documente, sau pentru afișarea ca graf
interactiv într-un browser. (Graphviz de asemenea suportă GXL, un dialect XML).
Graphviz oferă o multitudine de opțiuni pentru diagrame concrete, opțiuni cum ar
fi culori, fonturi, diferite stiluri de linii, hyperlink și altele.
Graphviz a fost folosit pentru a vizualiza laticea de concepte furnizată de erca
pentru clasele analizate pornind de la fișiere .dot generate pentru fiecare clasă.
2.10.8 OpenCloud
Pentru implementarea vizualizării sub forma TagCloud am utilizat biblioteca
gratuită OpenCloud [24]. OpenCloud este o bibliotecă Java pentru generarea de tag
clouds, cunoscute și sub numele de liste ponderate. Cele două clase principale ale
bibliotecii sunt clasa Tag, ea reprezintă un singur tag (în esență un string asociat cu
un URL) și clasa Cloud, ea reprezintă norul de cuvinte în întregime. Clasa Cloud se
comportă ca o colecție pe care o populezi adăugând obiecte Tag.
Fiecare tag are un scor asociat ce reprezintă importanța tag-ului. Tag-urilor cu
un scor mai mare vor avea asociată o pondere mai mare. Când un tag este adăugat
în obiectul Cloud, dacă deja este prezent un tag cu același nume, cele două scoruri
sunt adunate. Clasa Cloud convertește scorurile în ponderi utilizând o transformare
liniară. Utilizatorul poate alege plaja de valori pe care ponderea o poate lua,
așadar ponderile pot fi folosite în mod convenabil în vizualizări [24].
22 3.1. Vizualizări
Capitolul 3. Stadiu actual În acest capitol vor fi prezentate câteva tehnologii și concepte noi din
domeniul ingineriei software care sunt tangențiale tematicii semanticii
identificatorilor.
3.1. Vizualizări
În industria software vizualizările de cod sunt o tematică nouă într-o continuă
schimbare. Acestea au apărut ca o consecință a creșterii din ce în ce mai mult a
complexității sistemelor software și necesității înțelegerii acestora cât mai ușor.
Dacă un sistem are sute de mii de linii de cod și deseori chiar milioane, o citire
linie cu line a codului este total neadecvată.
În [25] sunt descrise mai multe tipuri de vizualizări. Un tip de vizualizare este
Overview Pyramid8 definită în [25] care oferă o imagine de ansamblu a
complexității sistemului. De asemenea există System Complexity View care
afișează ierarhiile claselor din sistem sub formă de arbore. Pentru o clasă în [25] a
fost definită vizualizarea Class blueprint care afișează interacțiunea între diferitele
componente ale clasei în funcție de apelurile efectuate.
Aceste tipuri de vizualizări și altele asemănătoare sunt foarte utile pentru a oferi o
imagine de ansamblu asupra unui sistem. Dar neajunsul lor constă în faptul că
metodele sau clasele sunt porțiuni de text iar vizualizarea este o abstractizare a
entităților prin diferite forme poligonale având diferite caracteristici ale codului
reprezentate prin diferiți parametrii ai poligonului, fără a avea text. Utilizatorul
trebuie să cunoască de la început aceste convenții pentru a putea utiliza în mod
eficient aceste vizualizări și trebuie să creeze mental puntea între cod și
abstractizarea sa.
Alternativa propusă la acest impediment este folosirea cuvintelor din codul
sursă pentru a evidenția anumite caracteristici ale entităților din sistem. Mai mult,
aceste cuvinte cheie sunt reprezentate pe diferite categorii ale informațiilor
afișate și în mod dependent de importanța rolului pe care îl au. Atunci când este
necesară o perspectivă superficială asupra porțiunii unui cod cuvintele pot fi
instrumente foarte utile în a surprinde acele caracteristici.
3.2. Coeziune
În practică există mai multe modalități de evaluare a coeziunii. Majoritatea
acestora evaluează arhitectura sistemului din punctul de vedere al interacțiunii
obiectelor9. Acest tip de coeziune se numeste coeziune sintactică [51]. În Figura
3.1 sunt prezentate principalele tipuri de coeziune sintactică ordonate în funcție
8 vezi Anexa C și D
9 Cohesion metrics - http://www.aivosto.com/project/help/pm-oo-cohesion.html [Online 16.06.2012]
23 STADIU ACTUAL
de calitatea pe care ele o definesc. De exemplu, un modul care are coeziune
funcțională înseamnă că îndeplinește o singură funcționalitate bine definită și are
un scop precis. Din perspectiva coeziunii sintactice codul poate fi scris într-un mod
total neinteligibil pentru programator și totuși să fie coeziv.
Pentru coeziunea unui text au fost
dezvoltate mai multe moduri de măsurare
a similarității semantice bazate pe
taxonomia Wordnet. Aceste măsurări
abordează problema numărând muchiile
ce leagă cuvintele [48], sau ajustează
numărul muchiilor cu altă informație cum
ar fi adâncimea taxonomiei [49] sau
informația calcultată dintr-un obiect [50].
Pentru coeziunea semantică a codului sursă există metrici definite ce
evaluează ierarhia conceptelor unui sistem din punct de vedere semantic [52].
Pentru coeziunea semantică a unei entități în [53] este definită o metrică ce ia în
considerare părțile de vorbire folosite pentru identificatori și folosește o bază de
date lingvistică pentru extragerea părților de vorbire.
În această lucrare, pentru coeziunea semantică abordarea diferă față de
metricile prezentate în primul rând prin faptul că este folosită baza de date
lingvistică oferită de WordNet. De asemenea, pentru construirea grafului de
concepte pentru o entitate se apelează la analiza formală generându-se în mod
automat posibilele sensuri ale entității. Din variantele generate sunt selectate cele
care au coeziunea semantică cea mai bună.
3.3. Claritate
În practică există câteva metrici implementate pentru a măsura lizibilitatea
textului în limbaj natural [1]. Modelul Flesch-Kincaid Grade Level [15], modelul
Gunning-Fox Index [16], modelul SMOG Index [17] și modelul Automated Readability
Index [18] sunt doar câteva dintre exemplele de metrici ale lizibilitatății textului
care au fost dezvoltate pentru text ordinar. Aceste metrici toate sunt bazate pe
factori simpli cum ar fi numărul mediu de silabe pe cuvânt și lungimea medie a
propoziției. În ciuda simplicității lor relative, s-au dovedit a fi chiar foarte utile în
practică [1].
Există un consens asupra faptului că lizibilitatea este o caracteristică esențială
a calității codului [3, 5, 10, 11, 19, 29, 34, 35, 37, 38, 44], dar nu asupra căror
factori contribuie cel mai mult asupra noțiunii umane de lizibilitate a software-ului
[1].
În contextul codului sursă al programelor este important de notat că
lizibilitatea nu este la fel ca și complexitatea, pentru care există câteva metrici
Figura 3.1 – Tipuri de coeziune sintactică
24 3.3. Claritate
despre care s-a demonstrat în mod empiric că sunt folositoare [44,1]. În opinia lui
Brooks, complexitatea este o proprietate „esențială” a software-ului; ea se naște
din cerințele proiectului și nu poate fi eliminată [13]. Pe de altă parte, afirmă
Brooks, lizibilitatea este pur „accidentală”. În modelul lui Brooks, inginerii
software pot doar spera să controleze dificultățile accidentale: lizibilitatea
accidentală poate fi adresată mult mai ușor decât complexitatea intrinsecă.
Buse și Weimer [1] au propus o metrică ce ia în considerare anumite
particularități ale codului în funcție de formatarea lui. Diferite aspecte ale
formatării (ex. numărul mediu și numărul maxim de identificatori pe linie pe o
anumită linie) sunt verificate pe fragmente de cod de dimensiuni în jur de 7 linii
fiecare. Pe baza acestora și comparând cu răspunsul dat de mai mulți utilizatori
umani, aceștia au ajuns la un model ce poate evalua cât de frumos este scrisă o
porțiune de cod.
Spinellis [14] afirmă că singurul factor rezultat ce poate fi citit sau observat
ușor în cod este stilul. El continuă făcând analogia între un cod bun și o proză
bună. Deși un scriitor probabil a învățat că este important să își mențină
propozițiile scurte și să folosească metaforele, făcând acest lucru nu implică în
mod necesar că va rezulta un roman de prima clasă. Autorii excepționali știu
regulile prozei bune dar de asemenea ei știu când să le încalce.
Din moment ce lizibilitatea și complexistatea sunt în principiu două aspecte
diferite, o metrică ce se bazează în primul rând pe formatarea textului codului
sursă considerăm că nu este suficient de sensibilă în a surprinde posibilele
particularități (claritatea identificatorilor, apeluri de metode, căi de execuție) ale
unei anumite porțiuni de cod ce pot îngreuna înțelegerea ei de către un cititor
uman. De exemplu, o porțiune de cod poate fi scrisă într-un mod foarte lizibil,
având o formatare foarte bună dar complexitatea ei să fie ridicată. Un utilizator
uman chiar dacă ar citi ușor porțiunea respectivă de cod, va întâmpina dificultăți în
înțelegerea ei. Cealaltă extremă este cazul în care complexitatea codului nu este
ridicată dar codul este scris în așa manieră încât este foarte greu de descifrat care
este funcționalitatea implementată. Prin urmare am ales să luăm în considerare
simultan ambele aspecte, atât ușurința citirii cât și complexitatea, în construirea
unei noi metrici. În continuare vom propune o nouă soluție, metrica denumită
claritatea codului, care să ia în considerare aceste aspecte.
25 CONCEPTE
Capitolul 4. Concepte În acest capitol vom defini noile conceptele utilizate în studiul impactului
semanticii asupra calității unui sistem. De asemenea va fi prezentat rolul și
importanța fiecărui concept în studiul calității.
4.1. Semantica și Calitatea
Un sistem de calitate este un sistem relativ ușor de întreținut. Este cunoscut
faptul că mentenabilitatea este legată în mod intrinsec de lizibilitatea sistemului și
de arhitectura lui. Mentenabilitatea implică proprietatea unui sistem de a fi
schimbat ușor. Prin urmare cu cât se identifică mai rapid locul în care trebuie
făcută schimbarea cu atât un sistem poate fi considerat mai calitativ. În sistemele
orientate pe obiecte schimbarea se face în primul rând la nivel de metodă, aceasta
având efecte la nivel de clasă pentru ca apoi noile schimbări să se propage la nivel
de pachet și în cele din urmă la nivel de sistem.
Sistemele contemporane se întind de la zeci de mii de linii de cod până la
milioane de linii de cod. Dacă citirea unei singure linii de cod s-ar face într-o
secundă, parcurgerea unui sistem cu un milion de linii de cod ar implica un cost în
termeni de timp mult prea mare pentru cineva care ar trebui să asigure
mentenanța acelui sistem. De aceea avem nevoie de o metodă ca într-un timp cât
mai scurt să reducem numărul de potențial candidați la schimbare la doar câțiva pe
care să îi inspectăm vizual linie cu linie.
Ținând cont de aceste premise pentru a evalua calitatea unui sistem și
impactul semanticii identificatorilor asupra acesteia am abordat problema din trei
perspective. În primul rând, pentru a identifica locul în care trebuie făcută o
schimbare am utilizat vizualizările de cod. În al doilea rând, pentru a înțelege
arhitectura unui sistem și legătura ei cu semantica am construit o metrică ce
reflectă coeziunea din punct de vedere semantic al unei clase. În al treilea rând,
am definit conceptul de claritate a codului ce reflectă ușurința sau greutatea cu
care un programator poate înțelege codul programului. Utilizând acest concept se
va studia impactul semanticii identificatorilor asupra calității.
26 4.2. Word Cloud
4.2. Word Cloud
Sight is a faculty; seeing, an art. Vederea este o înzestrare naturală; a vedea, este o artă.
— George Perkins Marsh
Pentru identificarea aspectelor legate de arhitectura și funcționarea unui
sistem am ales metoda de vizualizare de cod. Marinescu în [25] afirmă că oamenii
sunt învățați să recunoască semnele și pozele, de aceea vizualizarea este o unealtă
excelentă pentru înțelegerea și identificarea aspectelor ascunse în sistemele
software mari.
Vizualizarea de cod este extrem de utilă pentru că într-o singură imagine pot fi
cuprinse o mulțime de informații. Așa cum spune un proverb, „o imagine este cât o
mie de cuvinte”, la fel o imagine poate valora cât o mie de linii de cod. Pentru
ajunge la acest deziderat am folosit conceptul de „tag cloud” sau „word cloud”, în
traducere liberă „nor de cuvinte”. În continuare vom folosi acești termeni în mod
interschimbabil pentru același concept.
Codul programelor este scris în așa manieră încât fiecare identificator
comunică o anumită informație. Chiar dacă pentru mașină caracterele care descriu
un identificator nu au nici o funcționalitate, pentru utilizatorul uman acestea sunt
vehicule ce transportă informație, informație ce la rândul ei descrie
funcționalitatea și arhitectura sistemului. Aceste informații pot fi utilizate în mod
eficient pentru a identifica mult mai rapid unele particularități ale unei porțiuni de
program.
Codul sursă al programelor este în esență un text format din anumite cuvinte cheie
specifice limbajului de programare și alte cuvinte cărora programatorul le atribuie
un anumit sens. În mod special în programele orientate pe obiecte, identificatorii
sunt cuvinte uzuale, deseori compuse, pe care aproape orice persoană le poate
înțelege chiar dacă nu este familiară cu domeniul respectiv.
Pornind de la această premiză din identificatorii prezenți în cod au fost extrase
cuvintele cheie și au fost construți tag cloud-uri pentru metodă, pentru clasă,
pentru pachet și pentru un întreg sistem sistem. Norii rezultați au fost denumiți
NameCloud, TypeCloud, MethodCloud și DataCloud. Categoriile față de care au
fost structurate informațiile sunt:
o name – numele identificatorilor
o type – tipul identificatorilor
o method – metodele, funcțiile apelate
o data – toate informațiile anterioare agregate
Aceste informații afișate pe diferite categorii și la diferite nivele de abstractizare a
sistemului ne vor ajută să combinăm într-un mod eficient abordările top-down și
bottom-up atunci când dorim să identificăm anumite particularități ale unei
27 CONCEPTE
porțiuni de cod. De exemplu, care sunt colaboratorii principali ai metodei
respective? Care sunt cuvintele cheie ce descriu funcționalitatea clasei? În ce
pachet găsim clasele care au în comun un anumit identificator? Care sunt
conceptele de bază cu care lucrează acest sistem? Toate aceste întrebări își pot
găsi răspunsul pornind având ca punct de pornire word cloud-ul descris anterior.
4.3. Coeziunea semantică
Clasele care conțin funcționalități bine relaționate între ele sunt considerate
ca având coeziune ridicată iar scopul inginerului software este să construiască
entități cât mai coezive posibil. McConnell, în cartea consacrată Code Complete
[46], afirmă despre coeziune că este o unealtă utilă pentru a ține sub control
complexitatea pentru că cu cât mai mult cod dintr-o clasă suportă scopul central al
clasei, cu atât este mai ușor pentru creierul programatorului să își amintească tot
ce face codul clasei respective.
Marsic [51] afirmă că este posibil să existe o clasă cu o coeziune sintactică
internă foarte bună dar cu o coeziune semantică scăzută. Clase individuale coezive
din punct de vedere semantic pot fi puse împreună pentru a crea o nouă clasă fără
sens din punct de vedere semantic în timp ce coeziunea sintactică internă este
păstrată. El continuă cu următorul exemplu. Să ne imaginăm o clasă care include
aspecte ce aparțin atât de o persoană cât și de mașina deținută de acea persoană.
Să presupunem că fiecare persoană poate avea doar o singură mașină și că fiecare
mașină poate avea doar un singur proprietar (o asociere de tipul unu-la-unu).
Atunci person_id <—> car_id ar fi echivalentul normalizării datelor. Cu toate
acestea, clasele nu au doar date ci și operații care desfășoară anumite acțiuni. Ele
oferă tipare comportamentale pentru (1) persoană și (2) pentru mașină, ambele
fiind concepte implementate de clasa propusă. Presupunând că nu există nici o
intersecție între funcționalitatea Persoanei și Mașinii, atunci care este înțelesul
clasei, probabil denumită Mașină_Persoană? O asemenea clasă poate fi coezivă
intern și totuși din punct de vedere semantic ca întreg văzut din exterior noțiunea
exprimată (în cazul descris o entitate persoană-mașină) este un non-sens [51].
În lucrarea de față coeziunea a fost studiată în detaliu doar la nivelul de clasă
și din punct de vedere semantic. Coeziunea semantică a unei clase se referă la
identificatorii folosiți în interiorul clasei pentru metode și atribute iar relația
dintre cuvintele folosite în formarea identificatorilor va fi cea care va da formă
conceptului de coeziune semantică. Fiecare identificator fiind compus din unul sau
mai multe cuvinte, scopul studiului semantic este identificarea cuvintelor cheie
față de care toate celelalte cuvinte se relaționează. Cu alte cuvinte, coeziunea
clasei este dată de cuvintele cheie care se relaționează cel mai bine cu cât mai
mulți identificatori ai clasei iar valorea numerică a metricii coeziunii semantice
este numărul acestor cuvinte.
28 4.4. Claritatea codului
Folosind modelul definit de analiza formală, pentru fiecare clasă au fost
extrase atributele și metodele ei și a fost construit contextul formal corespunzător.
Identificatorii compleți ai atributelor și metodelor reprezintă entitățile iar
cuvintele care compun identificatorii reprezintă proprietățile. Între fiecare
entitate și proprietate există un anumit grad de relaționare semantic iar această
relație a fost utilizată pentru construirea contextului formal. Dacă relația de
apropiere dintre o entitate și o proprietate nu depășește un anumit prag atunci
relația dintre cele două nu este introdusă în context.
Pornind de la contextul formal construit se generează laticea de concepte unde
fiecare concept are un număr de entități și un anumit număr de proprietăți.
Extensia conceptului este compusă din identificatorii metodelor și atributelor iar
intenția conceptului este compusă din cuvintele față de care sunt relaționate
metodele și atributele din extensie. Din laticea de concepte sunt eliminate acele
concepte care nu îndeplinesc anumite condiții.
După ce laticea de concepte este filtrată sunt selectate într-un mod cât mai
optim conceptele pentru care reunind entitățile lor cuprind întreaga clasă, adică
implică toate metodele și toate atributele clasei. Toate proprietățile acestor
concepte sunt cuvintele care definesc coeziunea clasei, aceste cuvintele sunt
cuvintele cel mai puternic legate de majoritatea atributelor și metodelor din clasă.
Numărul necesar de concepte reprezintă valoarea metricii pentru coeziunea
semantică.
4.4. Claritatea codului
În acest subcapitol vom explora conceptul de lizibilitate a codului și vom
investiga relația lui cu cel al calității software-ului. Folosind [1] definim
„lizibilitatea” ca o judecată umană a cât de ușor este un text de înțeles, în cazul
de față textul fiind reprezentat de codul sursă.
Pentru că lizibilitatea unui text și complexitatea lui sunt în principiu două
aspecte diferite vom încerca să găsim o soluție de a aduce cele două aspecte
împreună pentru a da funcționalitate unei metrici care să reflecte într-un mod cât
mai fidel cât de greu sau cât de ușor este de citit o anumită porțiune de cod sursă.
Lizibilitatea codului va fi dată de claritatea identificatorilor, ce cuvinte sunt
folosite, dacă acestea pot fi înțelese la o simplă citire. Cuvintele care compun
identificatorii sunt cele care dau claritatea unui identificator. Dacă ele sunt
cuvinte din dicționar atunci identificatorul va avea o claritate mai ridicată.
Complexitatea din punctul de vedere al lizibilității se referă la numărul
identificatorilor. Dacă numărul identificatorilor care trebuie ținuți minte simultan
de către programator este mai mare de un anumit prag (de exemplu, șapte - bazat
pe articolul lui Miller [22]) atunci claritatea va avea de suferit. De asemenea
29 CONCEPTE
complexitatea ciclomatică, numărul de căi posibile ale unui cod influențează
timpul în care programatorul va înțelege acea porțiune de cod.
Am ales conceptul de metrică pentru că, așa cum spune și [25], metricile sunt
foarte eficiente în a rezuma aspectele particulare ale lucrurilor și în a detecta
extremitățile în mulțimi mari de date. Metricile scalează bine și sunt un fundament
bun pentru o sinteză a multor detalii din software.
Având ca punct de plecare metricile putem să ajungem la o strategie de detecție
pentru anumite particulariți ale unei porțiuni de cod. O strategie de detecție [25]
este o condiție compusă logică, bazată pe metrici, ce identifică ce identifică acele
fragmente de design ce îndeplinesc condiția. O strategie de detecție poate fi
utilizată pentru a exprima în mod cantitativ deviațiile de la un set de reguli pentru
un design armonios.
Folosindu-ne de aceste concepte, în continuare va fi descrisă implementarea
unei metrici ce poate fi folosită ulterior ca o bază de pornire pentru o strategie de
detecție a codului scris într-un mod neclar. Pornind de la anumite caracteristici
fundamentale ale unui cod lizibil metrica implementată va identifica acele porțiuni
de cod ce suferă la capitolul ușurința citirii și înțelegirii lui de către un utilizator
uman. Porțiunile de cod studiate au fost analizate la nivel de metodă și la nivel de
clasă. Numărul returnat de metrică va reflecta gradul de claritate al porțiunii de
cod analizate.
30 5.1. WordCloud
Capitolul 5. Implementare În acest capitol vom prezenta soluțiile de implementare pentru conceptele
definite anterior. Prezentarea implementării va fi făcută la nivel de idee
încercându-se cât mai mult o separare de particularitățile limbajului ales deși
implementarea a fost făcută în limbajul Java.
5.1. WordCloud
WordCloud este o modalitate eficientă de afișare sintetizată a informațiilor
oferite de identificatorii unei anumite porțiuni de cod. În acest subcapitol vom
prezenta cum am ales și extras cuvintele care formează identificatorii. Apoi vom
prezenta particularitățile vizualizării pentru fiecare nivel de abstractizare ales,
metodă, clasă, pachet sau sistem.
5.1.1. Procesarea identificatorilor
Codul orientat pe obiecte este scris pornind de la ideea că pentru a descrie
rolul lor, identificatorii pot fi compuși prin alăturarea mai multor cuvinte.
Compunerea acestor identificatori diferă de la o convenție la alta. În Java este
utilizată convenția de a denumi numele de clase începând cu literă mare iar apoi
toate cuvintele alipite încep și ele la rândul lor cu litere mari (ex.
AbstractAttributedRoundFigure). Pentru atribute, metode și variabile este folosită
aceeași convenție cu excepția că numele metodei începe cu literă mică iar restul
cuvintelor încep cu literă mare (ex. getFigureBounds, lowerLimit).
Pentru că identificatorii sunt vehicule transportatoare de informație ce
reflectă funcționalitatea unei anumite părți dintr-un sistem, această informație
trebuie extrasă. Extragerea informației începe cu fracționarea identificatorilor.
Identificatorii fiind construiți din mai multe cuvinte vom considera un tag ca fiind
Figura 5.1 – Expresiile regulate pentru divizarea identificatorilor
31 IMPLEMENTARE
un cuvânt de bază ce poate fi fie singular, fie componentă a unui identificator.
Separarea identificatorilor se face pe baza expresiilor regulate disponibilie în
limbajul Java. Expresiile regulate folosite pentru separarea identificatorilor sunt
descrise în Figura 5.1 iar în Tabelul 5.1 sunt prezentate câteva exemple de divizare
a identificatorilor.
După fracționarea identificatorilor, cuvintele extrase sunt filtrate pentru a
elimina acele entități care nu contribuie cu informație utilă vizualizării. Cu alte
cuvinte, aplicăm un filtru de intrare înainte de construirea efectivă a cloud-ului.
Tabelul 5.1 – Divizarea identificatorilor
Prima condiție este ca un cuvânt să fie definit prin minim două caractere alfa-
numerice, eventual cu o cratimă între ele. Pentru cea de-a doua condiție avem
definită o „listă neagră” de cuvinte care deși îndeplinesc prima condiție nu vor fi
inserate în cloud. Câteva cuvinte din această „listă neagră” sunt: int, string, char,
double, void, integer, to, boolean, float. În principiu „lista neagră” cuprinde tipuri
de date elementare și conjucții, prepoziții din limba în care a fost scris codul
(uzual limba engleză). Fiecare cuvânt ce urmează a fi introdus este testat în
prealabil pentru a nu exista în „lista neagră”.
Identificator întreg Identificator divizat C1C2_MASK {C1, C2, Mask}
IXMLReader {IXML, Reader}
JcolorChooser {J, Color, Chooser}
AttributeKey[] {Attribute, Key}
iconNameM16 {icon, Name, M16}
jToolBar1 {j, Tool, Bar, 1}
_name {name}
_fileID {file, ID}
Object[][] {object}
Figura 5.2 – Procesarea identificatorilor
32 5.1. WordCloud
Construirea tag cloud-ului se face trecând prin mai multe etape, pași
reprezentați în Figura 5.2. În primul pas se extrag identificatorii de interes în
funcție de tipul vizualizării (metodă, clasă, pachet sau sistem). În al doilea pas se
divizează identificatorii în cuvintele componente. Al treilea pas constă în
distribuirea lor în liste ce corespund informației pe care o poartă (nume, tip sau
metodă). Pasul patru constă în construirea listei cu toate datele generate. Pasul
cinci constă în construirea norilor corespunzători celor patru tipuri de informații
extrase ținând cont de filtrele de intrare pentru cuvintele cheie.
În final, vizualizarea tag-cloud-ului se face cu ajutorul bibliotecii OpenCloud
[24]. Tag-urile vor avea ponderi normalizate pentru fiecare categorie în parte.
Cuvintele vor fi afișate în ordine descrescătoare a frecvenței lor. Astfel că în
partea stângă va fi cel mai mare cuvânt din tag cloud, ceea ce înseamnă că pentru
acea categorie acel cuvânt are ponderea cea mai mare, adică este cel mai
important cuvânt din categoria respectivă.
5.1.2. Method WordCloud
Având modelul general pentru vizualizare, în continuare vom descrie modelul
particular al vizualizării pentru o metodă. Pentru o metodă, în primul rând este
extras numele metodei, sunt analizate cuvintele extrase din identificatorul
metodei, apoi cuvintele extrase sunt introduse în norul DataCloud, nor ce va
cuprinde totalitatea datelor extrase. Este ales identificatorul metodei pentru că în
mod uzual prin numele metodei este transmis scopul acelei metode.
În al doilea pas sunt extrase variabilele locale și pentru variabilele locale sunt
luate în considerare numele lor și tipul lor. Din acestea sunt extrase cuvintele de
bază ce formează identificatorii și tipul variabilelor iar acestea sunt inserate în
NameCloud, respectiv TypeCloud. Variabilele locale oferă informații despre tipul
datelor cu care se operează în metoda respectivă.
În al treilea pas sunt extrași parametrii metodelor și este luată în considerare
informația oferită de numele și tipul lor. Aceste informații, după extragere, sunt
inserate în NameCloud și TypeCloud. Parametrii metodelor în mod evident oferă
informații despre colaboratorii unei metode, care sunt tipurile de date cu care
metoda în cauză colaborează.
În al patrulea pas sunt extrase informațiile oferite prin procesarea tuturor
metodelor apelate în interiorul metodei în cauză. Sunt luați în considerare doar
identificatorii metodelor apelate iar cuvintele extrase sunt inserate în
MethodCloud. Metodele apelate oferă un plus de informații legat de ce fel de
operații se efectuează într-o anumită metodă, dacă sunt operații elementare sau
metoda colaborează cu alte obiecte care îi furnizează servicii.
În ultimul pas sunt extrase informațiile din atributele accesate de metoda
analizată. Sunt luate în considerare identificatorul atributului și tipul său.
33 IMPLEMENTARE
Cuvintele extrase sunt inserate în NameCloud, respectiv TypeCloud. Atributele
accesate din nou oferă informații despre tipul de date care sunt procesate în
interiorul unei metode.
Toate datele extrase pentru cele trei tipuri de informaționale sunt agregate în
DataCloud. Pentru fiecare categorie tag-urile sunt afișate în ordine descrescătoare
în funcție de ponderea lor în cadrul cloud-ului. Figura 5.3 este rezultatul procesării
metodei addFontButtonsTo din clasa org.jhotdraw.action.ToolbarFactory din
sistemul jHotDraw. Metoda are 127 de linii de cod și complexitate ciclomatică 10 și
14 variabile locale.
5.1.3. Class WordCloud
Pentru o clasă procesul de construire a norilor de cuvinte este similar cu cel al
vizualizării pentru metode. În primul rând este extras numele clasei, divizăm
identificatorul, aplicăm filtrele de intrare iar apoi introducem datele în DataCloud.
Numele clasei este ales pentru că numele clasei oferă informații pentru un
utilizator uman despre tipul de date procesat și ce fel de operații ar putea fi
implementate.
În al doilea rând sunt procesate datele pentru metodele clasei. Informațiile din
metode sunt luate în considerare pentru că metodele reprezintă de fapt
„inteligența” clasei, ele reprezintă funcționalitatea ei. Pentru fiecare metodă
obținem DataCloud-ul construit așa cum a fost descris pentru Method WordCloud.
Fiecare DataCloud este inserat în MethodCloud astfel că MethodCloud va conține
toate datele agregate din toate metodele clasei.
Figura 5.3 – WordCloud pentru metodă
34 5.1. WordCloud
În al treilea rând sunt extrase informațiile conținute în atributele clasei.
Atributele sunt cele ce dau sens obiectelor pentru că încapsulează informația
creând noi entități, noi tipuri de date, noi concepte. Pentru fiecare atribut luăm în
considerare informațiile oferite de identificatorul atributului și tipul atributului.
Identificatorul procesat este inserat în NameCloud iar tipul procesat este inserat în
TypeCloud.
În final, toate datele din NameCloud, TypeCloud și MethodCloud sunt agregate
în DataCloud. Figura 5.4 este rezultatul procesării clasaei DefaultDrawingView din
pachetul org.jhotdraw.draw din sistemul jHotDraw. Clasa are 759 linii de cod, 66
metode și 17 atribute.
5.1.4. Package WordCloud
Pachetele sunt procesate din nou în același mod. În primul rând este procesat
numele pachetului și inserat în DataCloud. Apoi, în al doilea pas sunt procesate
toate clasele pachetului.
Pentru fiecare clasă a pachetului sunt extrase mai puține informații ca în cazul
unui cloud dedicat clasei. În acest caz sunt luate în considerare atributele, fiind
procesați identificatorii lor și tipul lor iar informațiile sunt stocate în NameCloud,
respectiv TypeCloud. Apoi sunt luate în considerare și metodele clasei, fiind
procesate numele metodei și tipul returnat. Acestea sunt stocate la rândul lor în
MethodCloud, respectiv TypeCloud.
În cazul metodelor sunt luate în considerare doar numele și tipul returnat al
metodei pentru că dacă ar fi considerată toată informația din interiorul metodei în
Figura 5.4 – WordCloud pentru clasă
35 IMPLEMENTARE
primul rând acest lucru ar cauza ca informația oferită de atribute să fie mult
depășită cantitativ de cea din metode și, în al doilea rând, informația oferită de
atribute ar fi duplicată pentru că metodele cu siguranță vor folosi cel puțin o dată
un atribut. Renunțând la informația oferită de implementarea metodelor poate fi
extrasă mai bine informația despre funcționalitatea unei clase, ce face clasa și nu
cum face ceea ce face clasa respectivă.
În final, din nou toate informațiile sunt agregate în DataCloud și rezultatul este
afișat sub forma a patru tag cloud-uri. Figura 5.5 este rezultatul procesării
pachetului org.jhotdraw.draw, pachet ce conține 134 de clase și conține toată
ierarhia de figuri de bază pentru funcționalitatea sistemului jHotDraw.
5.1.5. System WordCloud
Pentru un sistem sunt considerate toate pachetele conținute. Astfel că pentru
fiecare pachet sunt extrase MethodCloud, TypeCloud și NameCloud definite la
Package WordCloud și toate datele sunt insertate în cloud-ul corespunzător
sistemului. Pentru fiecare pachet este extras și numele său pentru a fi inserat în
DataCloud.
În final toată informația este agregată în DataCloud-ul sistemul și rezultă o
privire de ansamblu a cuvintelor cheie din întreg sistemul. Figura 5.6 este
rezultatul procesării pentru sistemul jHotDraw, sistem format din 25 de pachete,
229 de clase și aproape 30000 de linii de cod.
Figura 5.5 – WordCloud pentru pachet
36 5.2. Coeziune Semantică
Figura 5.6 – WordCloud pentru sistem
Pentru toate nivelele de vizualizare, metodă, clasă, pachet sau sistem,
numărul cuvintelor afișate a fost limitat la 20 din rațiuni estetice. Mai mult de 20
de cuvinte per categorie ar fi făcut afișarea aglomerată cu multe cuvinte prea mici
pentru ochiul uman și care au o pondere scăzută în informația furnizată.
5.2. Coeziune Semantică
În continuare va fi prezentată soluția propusă pentru implementarea metricii
coeziunii semantice. Pentru manipularea conceptelor definite de analiza formală a
fost utilizată biblioteca eRCA [43]. Metrica a fost implementată folosindu-se
modelul codului furnizat de iPlasma, astfel ea devenind o nouă metrică disponibilă
în paleta de metrici implementate în iPlasma.
5.2.1. Contextul simplu
În prima etapă este construit un context formal care inițial nu conține nici o
entitate și nici o proprietate. Contextul formal este reprezentat printr-un tabel în
care prima coloană reprezintă entitățile (atribute și metode) iar prima linie
reprezintă proprietățile (toate cuvintele distincte care formează toți identificatorii
atributelor și metodelor).
După ce a fost creat contextul, urmează a fi extrase atributele clasei analizate.
Atributele clasei au două tipuri de indentificatori: indentificatorul numelui
atributului și identificatorul tipului atributului. Numele atributului este inserat în
lista de entități a clasei și este inserat în context ca o entitate. Apoi identificatorul
numelui și identificatorul tipului atributului sunt fragmentați în cuvintele
componente. Regulile de divizare sunt aceleași ca cele utilizate la formarea
WordCloud-ului (vezi 5.1.1. Procesarea identificatorilor) cu precizarea că sunt
adăugate la „lista neagră” cuvintele „get” și „set”. Acestea sunt eliminate pentru
că ele sunt foarte des întâlnite într-o clasă dar în general nu descriu conceptul
implementat de clasă ci în sunt doar o convenție pentru inserția sau extragerea
datelor încapsulate de acea clasă. După ce cuvintele componente sunt filtrate, ele
37 IMPLEMENTARE
Tabelul 5.2 – distanța dintre cuvinte
sunt inserate în context ca proprietăți ale entității din care au fost extrase.
Ulterior atributelor sunt procesate și metodele. În cazul metodelor sunt procesați
doar identificatorii lor, numele metodei, fără tipul returnat sau parametri.
Identificatorii metodelor sunt procesați în aceeși manieră ca identificatorii
atributelor.
După acest pas contextul formal conține toate entitățile și toate proprietățile care
vor fi folosite în generarea conceptelor și în analizarea coeziunii semantice. Pentru
clasa NodeFigure din sistemul jHotDraw, contextul formal în acest pas arată ca cel
din Figura 5.7.
5.2.2. Contextul extins
A doua etapă este cea de construire a relațiilor, pe
baza apropierii semantice dintre cuvinte, între fiecare
proprietate din context și fiecare entitate în parte. Acest
lucru este făcut cu ajutorul bibliotecii RitaWordNet [27]
ce asigură accesul la dicționarul WordNet. RitaWordNet pune la dispoziție o metodă
ce returnează distanța minimă10 dintre două cuvinte în funcție de sensul lor și
distanța în arborele de cuvinte. Metoda localizează părintele comun al celor două
cuvinte și verifică dacă ele există căutând sensul lor. Dacă unul nu este găsit se
returnează 1.0 (distanța maximă). Dacă există, se calculează cea mai scurtă cale
posibilă de la oricare cuvânt la părintele comun. Apoi se calculează lungimea căii
de la părintele comun la rădăcina ontologiei și se returnează distanța normalizată
cu formula:
Figura 5.7 – NodeFigure – contextul formal simplu
10
http://www.rednoise.org/rita/wordnet/documentation/riwordnet_method_getdistance.htm [Online 14.06.2012] - getDistance(lemma1, lemma2, pos);
38 5.2. Coeziune Semantică
Folosindu-se distanța dintre două cuvinte, între fiecare entitate și fiecare
proprietate în parte se va calcula o distanță ce va reflecta apropierea sau
depărtarea lor. Dacă există e entități și p proprietăți, se vor calcula (e*p) distanțe.
Distanța dintre dintre o entitate și o proprietate este media distanțelor dintre
cuvintele ce formează entitatea și cuvântul desemnat ca proprietate. Reamintim
faptul că pentru distanța dintre două cuvinte valoarea 1.0 reprezintă distanța
maximă, cuvintele sunt foarte îndepărtate semantic, iar valoarea 0.0 reprezintă
distanța minimă, cuvintele sunt identice sau sinonime. După ce noua distanță
dintre entitate și proprietate este calculată, ea este comparată cu o valoare de
prag, numită minimumWordDistance. Dacă valoarea distanței entitate-proprietate
este sub acel prag atunci în context este introdusă o nouă intrare, un nou X, ce va
marca relația de asociere dintre cele două componente ale distanței. Dacă
valoarea distanței este mai mare sau egală cu minimumWordDistance atunci între
cele două componente se consideră că nu există nici o relație.
Figura 5.8 – NodeFigure – contextul formal extins
Noul context pentru clasa NodeFigure este cel din Figura 5.8 unde X-urile marcate
cu cercuri roșii sunt noile relații calculate. Toate valorile folosite pentru praguri au
fost memorate în clasa FilterConstants sub formă de atribute statice.
În cazul în care sunt procesate mai multe cuvinte, calcularea distanței dintre
cuvinte folosind RitaWordNet este destul de constisitoare din punct de vedere al
timpului. Ținând cont de faptul că distanța este calculată între cuvintele deja
existene în dicționar, pentru a optimiza procesarea distanțelor dintre cuvinte, s-a
recurs la memorarea acestora într-un fișier extern. Astfel, la prima lansare a
metricii, se va încărca în memorie toată baza de date cu distanțele calculate. Dacă
distanța între două cuvinte nu este găsită, atunci ea este calculată cu RitaWordNet
și inserată în baza de date. Fișierul bazei de date este actualizat doar în cazul în
care sunt mai mult de 100 de distanțe noi calculate, în caz contrar noile distanțe
39 IMPLEMENTARE
rămân doar în memorie. În urma rulării analizei pe mai multe sisteme cum ar fi
jHotDraw, ProGuard, Azureus și altele, baza de date conține peste 350000 de
intrări. Utilizând această metodă timpul de calculare a distanței este neglijabil
chiar și atunci când analiza este rulată pentru zeci de clase simultan.
5.2.3. Coeziunea conceptelor
Următorul pas constă în generarea laticei de concepte, grafului de concepte
pornind de la contextul formal. Fiecare concept are cele două componente,
extensia și intenția, formate din entități (atribute și metode) respectiv proprietăți
(cuvintele). eRCA [43] folosește conceptele de bază obținute din context și le
combină generând noi concepte care au o combinări diferite de entități și
proprietăți, noile concepte fiind legate de conceptele de bază.
Pentru fiecare concept va fi calculată coeziunea semantică. Aceasta este definită
ca media distanțelor dintre fiecare entitate și fiecare proprietate în parte.
∑ ∑
Graful generat pe baza contextului clasei NodeFigure este cel din Figura 5.9.
Conceptele cu fundal gri reprezintă conceptele de bază, extrase direct din
contextul formal iar conceptele cu fundal albastru sunt conceptele noi generate.
Vârful grafului este conceptul care are toate entitățile dar nu are nici o
proprietate. Acest lucru se datorează faptului că toate entitățile nu au în comun o
proprietate în același timp. De asemenea la baza grafului să află conceptul care
are toate proprietățile dar nici o entitate iar aceasta din cauză că nu exită nici o
entitate care să aibă toate proprietățile din context. Vizualizarea grafului a fost
făcută cu GraphViz [33].
Odată ce graful conceptelor este generat următorul pas este filtrarea grafului și
ștergea din graf a conceptelor care nu îndeplinesc anumite condiții impuse. Prima
condiție impusă este aceea ca fiecare concept din graf să aibă cel puțin o
proprietate. Această condiție va șterge vârful grafului. A doua condiție este ca
fiecare concept să aibă o anumită coeziune. Toate conceptele care nu depășesc un
anumit prag al coeziunii impus sunt șterse din graf. eRCA permite adăugarea unui
număr nelimitat de filtre la alegere și în același timp permite programatorului să își
definească filtre particularizate. Cele două filtre menționate anterior au fost
definite specific pentru a deservi studiul coeziunii, nefăcând parte din suita de
filtre oferite de eRCA. Odată cu ștergerea conceptelor care nu îndeplinesc
condițiile cerute graful de concepte va fi reactualizat și legăturile refăcute. Figura
5.10 reprezintă laticea conceptelor filtrată și restructurată.
41 IMPLEMENTARE
Figura 5.10 – NodeFigure – laticea de concepte filtrată
5.2.4. Conceptele cheie
Ultima etapă constă în selectarea conceptelor care determină coeziunea
clasei. Toate conceptele valide sunt sortate în ordine descrescătoare în funcție de
de dimensiunea extensiei lor. Odată conceptele sortate, primul concept este
inserat în lista conceptelor care acoperă clasa. Apoi aplicând un algoritm de tip
greedy, se parcurg conceptele în ordinea descrescătoare a entităților conținute
selectându-se conceptul care are cele mai multe entități ale clasei neinserate încă
42 5.2. Coeziune Semantică
în lista conceptelor care acoperă clasa. Algoritmul parcurge în mod repetat
conceptele până când toate entitățile clasei se găsesc în lista conceptelor care
acoperă clasa. În Figura 5.11 se observă conceptele cheie care acoperă clasa
NodeFigure. Conceptele au fost numerotate în funcție de ordinea inserării în lista
conceptelor cheie.
Figura 5.11 – NodeFigure – conceptele cheie
Numărul de concepte care conțin toate entitățile clasei reprezintă valoarea
metricii coeziunii semantice. Cu cât numărul este mai mare cu atât clasa este mai
necoezivă din punct de vedere semantic. Proprietățile conceptelor cheie sunt
cuvintele cel mai bine înrudite cu atributele și metodele clasei, ele sunt cele de
care depinde coeziunea clasei. Pentru un pachet coeziunea semantică reprezintă
media coeziunii semantice a tuturor claselor din pachet iar pentru sistem,
coeziunea semantică este media coeziunii semantice tuturor pachetelor din sistem.
43 IMPLEMENTARE
5.3. Claritatea Codului
Claritatea codului depinde de lizibilitatea și de complexitatea lui. Când vorbim
de lizibilitatea codului, cerințele pentru denumirea identificatorilor sunt relativ
modeste. Vrem ca numele identificatorilor să ne ajute să recunoaștem cât mai
rapid rolul lor și vrem ca lungimea lor să fie proporțională cu aria de utilizare a lor
[20]. Un nume scurt de variabilă, cum ar fi i și un nume lung de clasă, cum ar fi
WildcardSessionAttributeMatcherFactory sunt ambele nume acceptabile. În primul
caz, variabila contor pentru ciclu cel mai probabil va fi folosită într-un segment
scurt de cod: vrem să fie scurtă pentru a nu încărca codul și nu ne interesează
descrierea ei, pentru că definiția ei va fi foarte apropiată de utilizarea ei și oricum,
i prin convenție este numele variabilei de control. În cel de-al doilea caz, vrem ca
numele să fie descriptiv, pentru că va fi folosit (ideal doar de câteva ori) într-un
context străin, mult depărtat de locul de definire.
De asemenea, când citim o singură expresie, vrem ca cel puțin să putem
recunoaște măcar rolul unor identificatori ce apar în expresie – acest fapt ne ajută
pe noi oamenii să interpretăm în mod corect expresia fără a ține în minte întreaga
structură a programului.
Ținând cont de câteva dintre aceste convenții larg răspândite în domeniul
programării, în continuare vom descrie modalitatea de implementare a metricii de
claritate a codului metodelor și claselor. Pentru pachete, claritatea pachetului
este implementată ca media clarității claselor conținute de acel pachet. Claritatea
sistemului este media clarității pachetelor acelui sistem.
Valoarea numerică returnată va fi normalizată, astfel că valoarea 1 semnifică
faptul că porțiunea de cod are claritatea maximă iar valoarea 0 semnifică faptul că
porțiunea de cod are claritatea la cote minime. În iPlasma, din cauza unor
constrângeri de afișare și aproximare această valoare a fost înmulțită cu 1000,
astfel că valoarea maximă este 1000 iar cea minimă este 0.
5.3.1. Claritatea identificatorilor
Claritatea unei porțiuni de cod este strâns legată de claritatea
identificatorilor. Considerăm un identificator ca fiind cu atât mai clar cu cât un
utilizator uman poate înțelege scopul acelui identificator într-un timp cât mai
scurt. Pentru că sensul unui identificator este comunicat de cuvintele care
alcătuiesc acel identificator vom analiza cuvintele care compun acel identificator
și pe baza lor vom defini o măsură a clarității identificatorului.
În primul pas identificatorul este divizt în cuvintele componente așa cum s-a
făcut deja la subcapitolul WordCloud (vezi 5.1.1. Procesarea identificatorilor)
folosind aceleași constrângeri pentru cuvinte, folosind aceleași expresii regulate
dar fără alte filtre suplimentare.
44 5.3. Claritatea Codului
În al doilea pas, pornind de la lista de cuvinte extrase este calculată o valoare
normalizată ce va descrie claritatea unui identificator. În cazul în care nu există
nici un cuvânt extras și insertat în lista cuvintelor ce formează identificatorul
considerăm valoarea maximă, 1.00 pentru acel identificator. Biblioteca
RitaWordnet [27] pune la dispoziție o metodă pentru a testa existența unui cuvânt
în dicționarul instalat.
Pentru fiecare cuvânt vom avea un scor în funcție de existența lui. Dacă există,
scorul său este de 1.00, dar dacă există și lungimea lui este mai mică de 3
caractere, atunci scorul său este de 0.25. Am considerat acest caz pentru situația
în care identificatorii sunt acronime sau prescurtări ale altor identificatori mai
lungi. Dacă acest tip de identificatori reprezintă excepția și nu regula atunci
impactul lor asupra clarității nu va fi unul mare. Un utilizator uman poate reține
semnificația unui număr restrâns de acronime fără un efor mare pentru o perioadă
scurtă de timp. Dacă nu există cuvântul în dicționar, atunci scorul său va fi 0.
După ce este calculat scorul fiecărui cuvânt din identificator, se calculează
media aritmetică a acelor valori. Rezultatul obținut este valoarea metricii ce
reflectă claritatea unui anumit identificator. Această metrică este numită în
continuare claritatea identificatorului.
5.3.2. Claritatea metodelor
Metodele sunt porțiuni de cod cu o anumită funcționalitate specifică ce în mod
uzual au doar câteva linii de cod, rareori depășesc câteva zeci de linii dar sunt și
excepții care se pot întinde până peste o sută de linii de cod.
Așa cum am văzut deja, complexitatea și lizibilitatea unei porțiuni de cod sunt
în principiu două aspecte diferite. De aceea am definit două concepte care, din
perspectiva clarității codului, să extragă și să oferă o măsură a calității codului. Am
definit două concepte pentru că o porțiune de cod poate să fie foarte ușor de citit
din perspectiva clarității identificatorilor dar să fie foarte complexă în termeni de
operații efectuate și căi de execuție, sau invers. Ambele aspecte influențează
claritatea unei porțiuni de cod.
Primul concept este cel de Reading Lisibility11. Acest concept urmărește
aspectele ce țin de ușurința citirii și înțelegerii codului din prisma clarității
identificatorilor, numelor metodelor și variabilelor folosite. Acest concept este de
fapt o metrică ce ține cont de următoarele particularități:
o Numele metodei analizate
o Variabilele locale
o Metodele apelate
11 Reading Lisibility – lizibilitatea textului, gradul ușurinței de citire a unui text
45 IMPLEMENTARE
Al doilea concept este numit Reading
Complexity12. Acest concept urmărește
aspectele ce țin de complexitatea unei
porțiuni de cod și influențează claritatea
codului, adică ușurința cu care poate fi
citit și înțeles. Reading Complexity ia în
considerare următoarele aspecte:
o complexitatea ciclomatică
o numărul de metode accesate
o numărul de linii de cod
o numărul de variabile locale
În continuare vom descrie detaliile ce stau la baza conceptului de Reading
Lisibility și modului în care este construită metrica. În primul rând este calculată
claritatea identificatorului metodei, adică este calculată claritatea numelui
metodei folosind metrica claritatea identificatorului. Acest scor va avea o pondere
de 0.1 din rezultatul final. Este considerată această valoare pentru coeficient
deoarece cantitatea de informație utilă din numele unei metode este mult mai
restrânsă comparat cu codul ei atunci când doar metrica este luată în calcul.
În al doilea rând, sunt procesați identificatorii metodelor apelate din corpul
metodei analizate. Pentru numele fiecărei metode este calculată claritatea
identificatorului iar apoi rezultatul este media aritmetică a rezultatelor. În cazul
în care nu există metode apelate, rezultatul este 1.0, ceea ce înseamnă că din
perspectiva metodelor apelate claritatea este maximă pentru că înțelegerea
funcționalității metodei nu este redirectată spre nici o altă porțiune de cod. În
metrica finală, acest scor parțial va avea ponderea de 0.4. Este considerată
această pondere pentru că în general informația utilă necesară înțelegerii este
aproape la același nivel cu informația utilă furnizată de variabilele locale și
atributele locale accesate.
În al treilea rând, sunt procesate variabilele locale. Pentru variabile locale sunt
procesați atât identificatorii variabilelor, numele lor cât și identificatorii tipurilor
lor, tipul declarat al variabilei. Atât pentru identificatorul numelui cât și pentru cel
al tipului este calculat scorul furnizat de claritatea identificatorului. Pentru o
variabilă locală scorul clarității sale va fi compus din 0.25 scorul tipului și 0.75
scorul numelui. Sunt aleste aceste valori pentru coeficienți deoarece în general
numele variabilei este cea care apare în mod repetat în cadrul unei metode și
poartă cea mai multă informație în cadrul procesului din interiorul metodei. Scorul
final al variabilelor locale este media aritmetică a clarității pentru fiecare variabilă
în parte. Dacă nu există variabile locale, atunci scorul este maxim, 1.0, adică
utilizatorul nu trebuie să rețină și să urmărească informații suplimentare oferite și
12 Reading Complexity – complexitate textuală, gradul de complexitate structurală a unui text
Reading Lisibility = 0.1 * claritatea identificatorului metodei + 0.4 * claritatea metodelor apelate + 0.5 * claritatea varirabilelor locale
46 5.3. Claritatea Codului
de variabile pe lângă operațiile
propriu-zise din metodă. Scorul
final pentru variabilele locale va
avea ponderea 0.5 în scorul
clarității metodei.
În final, ultimul pas constă în agregarea informației oferită de numele metodei,
operațiile externe sau interne apelate și variabilele locale. Metrica Reading
Lisibility este așadar compusă din 0.1 claritatea identificatorului metodei, 0.4
claritatea identificatorilor metodelor apelate și 0.5 claritatea variabilelor locale.
Reading Complexity este și ea la rândul ei compusă din mai multe elemente
ce influențează lizibilitatea unei porțiuni de program. În primul rând am luat în
considerare complexitatea ciclomatică (CYCLO) a metodei (vezi 2.9. Metrici). În
urma studiilor din [25] a mai multor sisteme software considerate ca având un
design bun și pe baza valorii complexității ciclomaticii medii descoperite în
limbajul Java în iPlasma [28] s-a considerat că o metodă are complexitate
ciclomatică ridicată dacă are valoarea peste 20. În cazul nostru am considerat
pragul superior, HIGH_cyclo la valoarea 15 pentru că am considerat că o metodă cu
peste 15 căi de execuție distincte posibile este suficient de greu de urmărit și
înțeles într-un timp relativ scurt de către un utilizator uman. Valoarea
complexității ciclomatice este calculată de iPlasma. Dacă valoarea complexității
ciclomatice este peste 15 atunci scorul clarității parțiale este 0.1, în caz contrar
scorul este
. Ponderea complexității
ciclomatice în scorul final este de 0.45 deoarece la citirea unei porțiuni de cod
multitudinea căilor de execuție sunt cele care crează cea mai mare dificultate în
înțelegerea logicii procesului executat.
În al doilea rând am luat în considerare numărul de metode accesate (NOAM –
number of accessed methods) ca o măsură a clarității. În procesul de înțelegere a
unei porțiuni de cod putem considera o metodă apelată din porțiunea analizată ca
un furnizor de servicii și ca o redirectare a procesului de înțelegere a
funcționalității implementate. Prin urmare, cu cât numărul de metode apelate este
mai mare cu atât cel care citește codul va avea mai multe operații secundare de
înțeles, deci codul va fi mai dificil de înțeles din prisma complexității. Dacă nu
există nici o metodă apelată atunci scorul este 1.00. Pentru celelalte cazuri am
considerat pragul superior, HIGH_noam la valoarea 20. Dacă există mai mult de 20
de metode distincte apelate atunci scorul este 0.1, în caz contrat rezultatul este
. Ponderea scorului metodelor
apelate este 0.15 în scorul final.
În al treilea rând am luat în considerare numărul de linii de cod (LOC – lines of
code) al metodei. În iPlasma [28] este considerată o metodă ca fiind lungă dacă ea
are peste 80 de linii de cod. În cazul complexității din prisma lizibilității am
Reading Complexity = 0.45 * raport complexitate ciclomatică + 0.15 * raport număr de operații apelate + 0.20 * raport număr linii de cod + 0.20 * raport număr variabile locale
47 IMPLEMENTARE
considerat pragul superior, HIGH_loc la valoarea 70.
Dacă numărul de linii de cod este mai mare de 70
atunci rezultatul clarității parțiale este 0.1, în caz
contrar valoarea este
. Ponderea acestei caracteristici în scorul
final este de 0.20.
În al patrulea rând am luat în considerare numărul de variabile locale (NOLV –
number of local variables). Ținând cont de faptul că
atunci când este vorba de procesarea codului
mintea umană poate reține un număr limitat de
entități distincte (șapte, plus sau minus doi, spune Miller în [22]) am stabilit pragul
superior, HIGH_nolv la valoarea 10. Dacă există mai mult de 10 variabile locale
distincte procesarea informației oferite de textul codului este făcută cu greutate,
prin urmare vom considera rezultatul acestei caracteristici 0.1. Pe lângă pragul
superior am definit și un prag inferior, LOW_nolv la valoarea 3. Aceasta valoare
reflectă faptul că un număr de maxim 3 variabile locale pot fi reținute și procesate
cu mare ușurință de creierul uman, prin urmare rezultatul va fi 1.0. Dacă numărul
de variabile locale se situează între cele două praguri, atunci rezultatul va fi
. Ponderea acestei caracteristici în
scorul final este de 0.20.
Ultimul pas constă din agregarea scorurilor parțiale pentru a calcula scorul
clarității metodei prin prisma complexității. Metrica Reading Complexity este
așadar compusă din 0.45 scorul complexității ciclomatice, 0.15 scorul numărului
metodelor accesate, 0.20 scorul numărului liniilor de cod și 0.20 scorul numărului
variabilelor locale. Ponderile pentru fiecare componentă au fost alese în mod
orientativ pornind de la cantitatea de informație furnizată atunci când
programatorul citește codul.
După ce am definit cele două concepte acum este foarte ușor să definim
conceptul de claritate pentru o metodă, metrică numită Reading Clarity. Pentru
că dorim să ținem cont atât de lizibilitatea codului cât și de complexitatea codului,
claritatea codului unei metode va consta în agregarea informațiilor oferite de
Reading Lisibility și Reading Complexity. Astfel rezultatul final va fi format din 0.5
Reading Lisibility și 0.5 Reading Complexity. Noua metrică astfel definită
surprinde ambele aspecte definitorii pentru claritatea codului. În Figura 5.12 sunt
surprinse toate caracteristicile care influențează claritatea codului. În capitolul
Studiu experimental vor fi prezentate câteva exemple specifice de cod și valoarea
clarității astfel calculate.
HIGH_cyclo = 15 HIGH_noam = 20 HIGH_loc = 70 HIGH_nolv = 10 LOW_nolv = 3
Tabel 5.1 – Pragurile clarității metodei
48 5.3. Claritatea Codului
Figura 5.12 – Claritatea metodelor
5.3.3. Claritatea claselor
Clasele sunt entitățile fundamentele în orice program orientat pe obiecte. În
principiu ele sunt formate din atribute și metode. Putem spune că atributele sunt
cele care rețin informația în clasă, ele sunt cele care asigură ce-ul clasei, iar
metodele sunt cele care asigură inteligența clasei, funcționalitatea ei, cum. De
aceea atunci când vorbim de claritatea unei clase trebuie să avem în vede ambele
aspecte.
Pentru construcția clarității unei clase am luat în considerare următoarele
aspecte:
o lizibilitatea metodelor
o claritatea atributelor
o numărul de linii de cod
În primul rând, a fost luată în considerare claritatea codului metodelor. Pentru
studiul a fost luată în calcul doar lizibilitatea metodelor, Reading Lisibility,
definită la capitolul anterior. În această situație metrica finală va depinde în
principal de cuvintele folosite, înțelegerea fiind influențată de sensul cuvintelor
folosite. Pentru că o clasă are mai multe metode, scorul lizibilității metodelor este
suma ponderată a lizibilității fiecărei metode, unde ponderea este numărul de linii
de cod a metodei respective raportat la numărul total de linii de cod a tuturor
metodelor. Ponderea acestei valori în rezultatul final este de 0.55.
În al doilea rând, a fost luată în considerare claritatea atributelor. Claritatea
identificatorilor depinde de claritatea numelui atributelor și claritatea tipului lor.
Rezultatul parțial pentru claritatea tipului este media aritmetică a clarității tipului
tuturor atributelor iar rezultatul parțial pentru claritatea numelui este media
49 IMPLEMENTARE
aritmetică a clarității numelui tuturor identificatorilor. Ponderile celor două
rezultate parțiale sunt de 0.25 pentru tip și 0.75 pentru nume, prin însumarea lor
cu aceste ponderi rezultând valoarea asociată clarității identificatorilor. În
claritatea clasei, ponderea pentru claritatea atributelor este de 0.25.
În al treilea rând, a fost luat în considerare numărul de linii de cod (LOCC) pentru
o clasă. Pornind de la pragurile considerate în iPlasma, pentru claritatea clasei am
considerat pragul superior al liniilor de cod, HIGH_loc la valoarea 500. Astfel o
clasă care va avea peste 500 linii de cod va avea în mod direct scorul 0.1. În caz
contrar, rezultatul va fi de forma
. Ponderea
scorului pentru liniile de cod este de 0.2 în rezultatul final.
În ultimul pas nu mai rămâne de făcut altceva decât agregarea rezultatelor
parțiale. Valoarea metricii Claritatea clasei este compusă, așa cum se poate
observa în Figura 5.13, din 0.55 lizibilitatea metodelor, 0.25 claritatea atributelor
și 0.2 numărul liniilor de cod. Similar cu alegerea făcută în cazul clarității
metodelor, ponderile pentru fiecare componentă au fost alese în mod orientativ în
funcție de cantitatea de informție furnizată atunci când programatorul citește
codul.
Figura 5.13 – Claritatea claselor
50 6.1. WordCloud
Capitolul 6. Studiu experimental În acest capitol vor fi prezentate o parte din rezultatele obținute și concluziile
la care s-a ajuns în urma studiului efectuat pe diferite porțiuni și la diferite nivele
de cod din sistemul jHotDraw. Vizualizările și caracteristicile entităților (linii de
cod, complexitate etc.) au fost obținute cu ajutorul iPlasma iar problemele de
arhitectură au fost identificate cu ajutorul inFusion. Structura capitolului reflectă
cele trei abordări (WordCloud, Coeziune și Claritate) la diferite nivele de
componente determinate de porțiunea de cod studiat (metode, clase, pachete și
sisteme).
6.1. WordCloud
6.1.1. Metode
În continuare vor fi prezentate informațiile care pot fi extrase pornind de la
vizualizarea WordCloud aplicată pe o metodă și de asemenea vor fi enunțate și
beneficiile utilizării unei astfel de vizualizări.
Pentru primul caz analizat la nivel de metodă am luat în considerare metoda
getCappedPath din clasa BezierFigure, din pachetul org.jhotdraw.draw. Metoda
este cea mai lungă din clasă, are 46 linii de cod și are complexitatea ciclomatică
10, cea mai mare din clasa respectivă. Din punctul de vedere al liniilor de cod nu
este o metodă mare dar în urma analizei clarității ea a obținut un scor de 596.50,
penultimul scor comparat cu cel al celorlalte metode din clasă. Acest lucru ne
conduce la indiciul că această metodă s-ar încadra la categoria metodelor dificil de
înțeles.
Pornind de la vizualizarea metodei, Figura 6.1, putem extrage câteva proprietăți
ale metodei fără a fi nevoiți să citim în totalitate codul ei. NameCloud, categorie
compusă din cuvintele scrise cu verde, conține cuvintele cheie care compun
identificatorii variabilelor. Pornind de la aceste cuvinte cheie putem intui ce fel de
concepte sunt folosite de variabile. Doar citind acești identificatori putem observa
că pe lângă primele două cuvinte foarte proemiente, metoda mai are în vedere o
anumită lungime a căii și o anumită rază, detalii oferite de identificatorii length și
radius.
Class Method Loc Cyclo Clarity Complexity Lisibility 1. BezierFigure getCappedPath 46 10 596.50 385 808.09
2. AttributedFigure fromPathData 235 67 422 100 744.44
51 STUDIU EXPERIMENTAL
Figura 6.1 – getCappedPath – WordCloud-ul metodei
Dacă analizăm TypeCloud, categorie compusă din cuvintele scrise cu albastru pe al
treilea rând, putem observa care sunt tipurile predominate cu care această metodă
interacționează. Tipurile proeminente sunt bezier, path și node. Aceste cuvinte
descriu fie un tip distinct fie împreună determină identificatorul unui anumit tip.
Indiferent de situație, ne putem aștepta ca această metodă să returneze un tip
apropiat de aceste cuvinte sau să îi fie transmiși ca parametrii obiecte de tipul
respectiv. Dacă citim codul metodei vom descoperi că tipul returnat este
BezierPath, identificatori care ambii fac parte din tipurile principale identificate în
vizualizare.
În al treilea rând, MethodCloud, categorie compusă din cuvintele scrise cu roșu,
oferă informații legate de operațiile executate de metodă. Pentru că dimensiunea
cuvintelor este direct proporțională cu frecvența lor de apariție în cadrul metodei,
putem trage concluzia că metoda analizată înainte de a returna rezultatul apelează
și la alte surse pentru a construi rezultatul final deoarece cuvântul get este cel mai
proeminent cuvânt, diferența dintre el și restul fiind foarte evidentă. Următoarele
două cuvinte, control și point, au dimensiuni similare, ceea ce ne conduce la
concluzia că probabil sunt fie descriu împreună o acceeași operație, fie descriu
operații diferite dar care se apelează în tandem. Inspectând codul observă că într-
adevăr ele formează împreună identificatorul unei metode. Restul cuvintelor având
o dimensiune a fontului mult mai redusă descriu operații singulare ce intervin
probabil în diverse etape de construire a rezultatului final.
În final, DataCloud, categorie compusă din cuvintele scrise cu negru pe prima linie
din Figura 6.1, conține toate cuvintele cheie extrase din codul metodei. Se observă
faptul faptul că distribuția cuvintelor din cele trei categorii este echilibrată în
DataCloud. Astfel cuvintele cheie din fiecare categorie apar cu un font mai mare
decât restul, cele mai mari cuvinte din NameCloud, TypeCloud și MethodCloud apar
ca având o pondere ridicată și în DataCloud. De asemenea se observă faptul că cele
mai proemintente cuvinte din DataCloud se găsesc și în identificatorul metodei, în
52 6.1. WordCloud
numele metodei. Acest fapt conduce la concluzia că metoda a fost bine denumită.
În caz contrar ar exista dubii că numele metodei reflectă într-adevăr
funcționalitatea ei.
Din perspectiva clarității se observă că rezultatul este mult influențat de
complexitatea metodei. Lizibilitatea identificatorilor folosiți au condus la un scor
ridicat influențând pozitiv nota obținută pentru claritate. Dificultatea înțelegerii
metodei influențată de complexitatea ei poate fi contracarată pornind de la
vizualizarea metodei și informațiile care pot fi extrase din aceasta. Odată ce
utilizatorul uman are bine definite conceptele cheie care trebuie să le urmărească
în codul metodei, acestui îi va fi mult mai ușor să urmărească funcționalitatea de
bază și să nu se „piardă în detalii”.
În cel de-al doilea caz analizat am ales metoda fromPathData din clasa
SVGUtil din pachetul org.jhotdraw.samples.svg. Această metodă, având 235 linii de
cod, este cea mai lungă metodă din întreg sistemul. Complexitatea ciclomatică
este 67, din nou cea mai mare din întreg sistemul. Datele obținute pentru această
figură sunt cele din Figura 6.2.
Figura 6.2 – fromPathData – WordCloud-ul metodei
Spre deosebire de metoda anterioară această metodă are distribuția informațiilor
diferită. NameCloud evidențiază primul cuvânt iar restul cuvintelor sunt toate la
aceeași dimensiune. Acest fapt conduce la concluzia că identificatorii variabilelor
sunt folosiți toți în mod repetat în același număr. TypeCloud are același tipar,
primul cuvânt este mai proeminent ca restul cuvintelor și restul cuvintelor toate
sunt afișate la aceeași dimensiune. În MethodCloud se observă același tipar dar cu
unele variații. În acest caz sunt patru cuvinte care pot fi considerate cuvinte cheie,
ele au aceeși dimensiune iar fontul este mult mai mare în comparație cu celelalte
cuvinte. Diferența dintre cele două seturi de fonturi este una foarte mare ceea ce
conduce la ipoteza că în metodă operațiile descrise de cuvintele exception, io,
53 STUDIU EXPERIMENTAL
next și token sunt cele care asigură funcționalitatea de bază a metodei iar
celelalte cuvinte descriu doar operații în principal singulare în corpul metodei.
Odată agregată toată informația în DataCloud, se observă că informația extrasă
din metodele apelate domină informația extrasă din numele identificatorilor sau
din tipul datelor folosite. O altă particularitate a acestei metode este faptul că
numele ei nu conține nici un cuvânt cheie.
Pentru a intui funcționalitatea metodei se observă faptul că metoda apelează
aceleași operații în mod repetat dar probabil cu parametrii diferiți iar existența
cuvintelor path, stream, tokenizer în categoria tipurilor conduce la ipoteza că
metoda este un parser, este o metodă ce procesează date de mai multe tipuri
dintr-o sursă externă programului. Exception și io sunt cuvinte cheie care se referă
la excepții și la metode de intrare/ieșire. Ipoteza că metoda s-ar putea să fie un
parser este întărită și de complexitatea ciclomatică foarte mare, multitudinea
căilor de execuție fiind explicată de existența mai multor tipuri de date posibile.
Claritatea metodei este influențată puternic în mod negativ de complexitatea
ei, acest fapt conducând la o înțelegere dificilă a funcționalității clasei. Dar
combinând informația extrasă din vizualizare și ipoteza că metoda este un parser,
la inspectarea codului timpul de înțelegere este mult îmbunătățit pentru că
utilizatorul uman se așteaptă la o structură repetitivă, în blocuri a metodei și
presupune o anumită funcționalitate urmărind identificatorii cheie. La inspecția
codului ipoteza se dovedește a fi adevărată, metoda procesează datele primite de
la intrare iar în funcție de anumite caractere efectuează cu mici diferențe aceleași
operații.
În urma acestor exemple se pot afirma următoarele lucruri. Cuvintele cheie din
DataCloud combină cu succes informația din diferitele categorii de cuvinte folosite
pentru a prezenta cuvintele cheie ale funcționalității implemenate de metodă.
Astfel că pe lângă numele metodei aceste cuvinte cheie identificate contribuie
semnificativ la înțelegerea funcționalității metodei. De asemenea, NameCloud și
TypeCloud oferă o imagine de ansamblu asupra colaboratorilor metodei și eventual
asupra tipului returnat.
În al doilea rând, raportul dintre dimensiunea fontului cuvintelor oferă informații
legate de frecveța de apariție a lor. În primul caz studiat dimensiunea fontului a
avut o regresie liniară, iar în al doilea caz dimensiunea fontului a fost în salturi. În
primul caz a fost vorba de un flux de date liniar, nerepetitiv iar în cel de-al doilea
caz a fost vorba de operații care se repetau în funcție de anumiți parametri.
Așadar, pentru metode cu câteva zeci de linii de cod, se poate concluziona că
modelul de regresie a dimensiunii fontului cuvintelor este un indicator că o metodă
are implementată o structură decizională cu operații asemănătoare sau
implementeză un flux de operații aplicate asupra unui tip principal.
54 6.1. WordCloud
În al treilea rând, informația agregată în DataCloud și raportată la celalte categorii
oferă indicii asupra ponderii operațiilor efectuate de intermediari și operațiilor
interne. În primul caz studiat majoritatea operațiilor s-au efectuat intern iar în al
doilea caz o mare parte din operații sunt servicii efectuate de colaboratori ai
metodei. În primul caz s-a observat că DataCloud are cuvintele cheie formate din
cele trei categorii iar în cel de-al doilea caz cuvintele cheie din DataCloud fac
parte doar din MethodCloud.
În al patrulea rând, deși indicatorii clarității sunt influențați negativ de indicatorul
complexității, combinând informațiile obținute din vizualizare, ușurința de
înțelegere a metodei crește semnificativ. Acest lucru este cauzat de faptul că
odată ce un utilizator a pornit în înțelegerea metodei de la vizualizarea
WordCloud, acesta va putea urmări mult mai ușor variabilele cheie. Deși
vizualizarea nu oferă informații exacte asupra cum se face ceea ce face metoda, ea
oferă suficiente informații despre ce face o anumită metodă. Vizualizarea oferă
informații minimale chiar și despre structura codului unei anumite metode.
În concluzie, pentru o metodă vizualizarea oferă informații pornind de la trei
indicatori și anume, cuvintele cheie, raportul dimensiunilor fontului și raportul
densității de informație a celor trei categorii de cuvinte cheie. Acești indicatori
oferă sugestii despre funcționalitatea implementată de metodă, colaboratorii ei și
chiar și structura ei, iar aceste noi informații extrase la rândul lor îmbunătățesc
timpul de înțelegere al metodei când complexitatea ei este ridicată.
6.1.2. Clase
Pentru ilustrarea funcționalității oferite de vizualizarea WordCloud pentru
clase în continuare vor fi descrise clase din sistemul jHotDraw.
În primul rând a fost luată în considerare clasa XMLElement din pachetul
nanoxml. Clasa aceasta are cele mai multe linii de cod din întreg sistemul, 2450 de
linii, are un număr de 71 de metode și 15 atribute. Figura 6.3 reprezintă
rezultatele vizualizării și datele extrase pentru clasa XMLElement. Urmărind în linii
mari aceleași caracteristici ca și în cazul vizualizării pentru metode, se observă că
rata de descreștere a fontului cuvintelor este una liniară, fără salturi. NameCloud
extrage datele din atribute și astfel se pot observa cuvintele cheie ale informațiilor
memorate în clasa analizată. Cuvintele cheie fiind de fapt componente ale
identificatorilor acestea pot descrie mai multe atribute care au date similiare, cu
un înțeles de bază similar dar aplicare diferită.
Continuând cu TypeCloud, acesta este construit pornind de la informațiile oferite
de tipurile atributelor. Pe baza vizualizării se poate concluziona că o mare parte
din atribute sunt de tipul HashMap sau ArrayList sau long. De asemenea se poate
observa un diferență destul de mare între cantitatea de informație din NameCloud
și TypeCloud. Aceasta poate fi explicată în două situații. În primul caz toate
atributele au tipul declarat compus dintr-unul din cuvintele afișate în TypeCloud
55 STUDIU EXPERIMENTAL
sau o parte din atribute sunt tipuri de date elementare iar tipurile acestea sunt
cuvinte ignorate ce fac parte din „lista neagră”.
Figura 6.3 – XMLElement – WordCloud-ul clasei
MethodCloud cuprinde informațiile din metodele clasei. Pornind de la acestea se
poate obține o imagine de ansamblu a funcționalității implementate de clasa
respectivă. Cuvintele afișate nu spun cum face clasa operațiile, ci eventual oferă
indicii despre ce funcționalități implementează clasa. În cazul de față, fiind vorba
de o clasă ce implementează un parser pentru un fișier XML este de așteptat ca în
metodele ei să apară cuvinte care să descrie această funcționalitate. De aceea
această informație despre funcționalitatea clasei este indicată prin cuvintele read,
parse, xml, write, exception, cuvinte ce în majoritatea cazurilor au de a face cu
operațiile cu o sursă de date externe.
Comparând informațiile din DataCloud cu restul categoriilor, pe baza dimensiunii și
ordinii cuvintelor pot fi observate câteva caracteristici. Se observă că informațiile
din MethodCloud sunt cele care domină în mod clar informațiile din DataCloud.
Informațiile din TypeCloud și NameCloud modifică doar foarte puțin proporția unor
cuvinte cu o pondere scăzută în MethodCloud provocând astfel în DataCloud o
reordonare a cuvintelor doar în rândul celor cu pondere scăzută. De exemplu, se
observă apariția cuvintelor map, reader, hash în DataCloud. Tot pe baza raportului
de informații furnizat de diferitele categorii de cuvinte cheie se poate concluziona
că numărul metodelor este mult mai mare decât numărul atributelor, iar unele
dintre acestea implementează o funcționalitate complexă. Această ipoteză este
confirmată de faptul că numărul metodelor este de 71 față de 15, numărul
atributelor. De asemenea, clasa a fost detectată de iPlasma ca suferind de
56 6.1. WordCloud
problema de design BrainClass și că ea are de asemenea o metodă ce suferă de
boala numită BrainMethod.
Al doilea caz ilustrativ este WordCloud-ul clasei AttributeKeys. Clasa are un
număr de 7 metode, 31 de atribute și 427 linii de cod. În cazul acestei clase, în
Figura 6.4, se observă în DataCloud că informațiile oferite de metode sunt
surclasate de informațiile oferite de numele atributelor. Doar bazându-ne pe
această informație se poate concluziona că numărul atributelor este mare
comparat cu numărul metodelor.
De asemenea se observă o diferențiere puternică între mărimea font-ului pentru
primele două cuvinte cheie din TypeCloud și celelalte două cuvinte. Acest fapt
conduce la ipoteza că majoritatea atributelor sunt de tipul AttributeKey sau altă
combinație a acestor termeni.
Figura 6.4 – AttributeKeys – WordCloud-ul clasei
În concluzie, vizualizarea WordCloud pentru o clasă, alături de numele ei,
oferă o imagine de perspectivă asupra funcționalității unei clase și datele cu care
operează aceasta fără ca programatorul să fie nevoit să citească întreg codul clasei
pentru a identifica atributele, metodele și eventual a citi unele comentarii care
deseori se referă la implementarea specifică a unei funcționalități. De asemenea,
ponderea de informație furnizată DataCloud-ului de celelalte categorii de cuvinte
cheie este direct proporțională cu numărul de atribute și numărul de metode a
clasei. Prin urmare vizualizarea, pe lângă informații despre funcționalitatea clasei,
oferă informații și despre structura clasei.
57 STUDIU EXPERIMENTAL
6.1.3. Pachete
Atunci când un programator are de a face cu un sistem nou sau un sistem
mare, o problemă cu care acesta se întâlnește adeseori este faptul că rareori există
o imagine de ansamblu asupra pachetelor. De exemplu, unde se găsește clasa
AttributedFigure sau clasa Figure? Pentru că nici un pachet nu conține în numele
său cuvântul figure, rămâne la intuiția programatorului să parcurgă pachetele
pentru a găsi clasele care îl interesează. Această problemă poate fi depășită
apelând în prealabil la vizualizarea WordCloud pentru un pachet
Pachetul org.jhotdraw.draw conține 134 de clase și este cel mai mare pachet
al sistemului după numărul de clase. În Figura 6.5 se observă în NameCloud
cuvintele cheie figure și handle. Acestea sunt cuvintele cheie extrase din
atributele claselor. Ținând cont de problema enunțată anterior și cuvintele afișate
în DataCloud acest pachet este un candidat foarte viabil pentru a conține clasele
care se ocupă de conceptul figure și astfel să conțină clasele Figure și derivatele ei.
De asemenea din MethodCloud se pot observa cele mai des întâlnite
funcționalități. Pentru un pachet care se ocupă cu figuri cele mai întâlnite operații
sunt cele care se ocupă de draw, bounds, mouse etc.
Figura 6.5 – org.jhotdraw.draw – WordCloud-ul pachetului
Un alt exemplu de vizualizare a pachetului este cea pentru pachetul
org.jhotdraw.gui din Figura 6.6. Acronimul gui din numele pachetului face referire
la graphical user interface și combinând această informație cu vizualizarea
pachetului se poate concluziona că pachetul conține clasele care se ocupă cu
58 6.1. WordCloud
trasarea punctelor pe display cu anumite caracterisitici bine definite cum ar fi
unghi, dimensiune, cale.
Figura 6.6 – org.jhotdraw.gui – WordCloud-ul pachetului
În concluzie, vizualizarea WordCloud pentru un pachet este foarte utilă în a
identifica foarte rapid care sunt clasele conținute într-un pachet, mai bine zis ce
concepte reprezintă clasele unui pachet și care sunt operațiile cele mai întâlnite în
acel pachet.
6.1.4. Sistem
Pentru un sistem vizualizarea WordCloud afișează cuvintele cheie ale
sistemului așa cum se găsesc ele în pachete și în clase. Figura 6.7 reprezintă
vizualizarea pentru sistemul jHotDraw, software destinat construirii de desene
tehnice. În NameCloud și TypeCloud se observă că mare parte din cuvintele cheie
fac parte din câmpul semantic al cuvântului draw sau figure. Din nou,
MethodCloud oferă o imagine de ansamblu a operațiilor celor mai întâlnite pentru
tipurile principale de concepte modelate de sistem.
Figura 6.8 reprezintă vizualizarea sistemului java ProGuard, un sistem
opensource pentru obfuscarea codului java. Sistemul are un număr de 581 de clase
și aproape 50000 de linii de cod. Sistemul trebuie să încarce codul care trebuie
modificat și în funcție de tipul de indentificatori întâlnit să modifice textul acelui
identificator în toate locurile în care el apare, prin urmare sistemul trebuie să aibă
un model de reprezentare al codului.
59 STUDIU EXPERIMENTAL
Figura 6.7 – jHotDraw – WordCloud-ul sistemului
Figura 6.8 – ProGuard – WordCloud-ul sistemului
Comparând vizualizările celor două sisteme, jHotDraw și ProGuard, se observă
că vizualizarea WordCloud surprinde bine diferitele concepte în jurul cărora sunt
construite sistemele (figure, action, tool, icon vs. class, type, method,value).
60 6.2. Coeziune
6.2. Coeziune
În acest subcapitol vor fi prezentate rezultatele studiului coeziunii semantice a
sistemului jHotDraw. Sistemul are un număr de 483 de clase cu media liniilor de
cod 130 (LOC/class), media numărului de metode 10 (NOM/class) iar media
numărului de atribute 2.5 (NOA/class). Metrica paote fi rulată pe clasele sistemului
cu diferite calibrări ale constantelor de filtrare.
Setul de calibrări utilizat pentru filtre a constat în următoarele valori. Pentru
distanța minimă dintre cuvinte s-a utilizat valoarea 0.35 (minimumWordsDistance
= 0.35) iar pentru coeziunea minimă a conceptului s-a utilizat valoarea 0.3
(maximumConceptCohesion = 0.3). Distanța dintre cuvinte este un număr
normalizat cu valoarea 0.0 pentru apropiere maximă și 1.0 pentru depărtare
maximă. Acest mod de reprezentare este reflectat și în modul de reprezentare al
coeziunii conceptelor. Valorea 0.0 reprezintă coeziune maximă a conceptului iar
valoarea 1.0 reprezintă coeziunea minimă pe care o poate avea un concept. Pragul
maximumConceptCohesion reprezintă valoarea maximă din punct de vedere
numerică acceptată pentru coeziunea unui concept. Orice concept care are o
coeziune ce depășește acest prag este considerat necoeziv.
6.2.1. jHotDraw vs. ProGuard
Clasa AbstractFigure, una dintre clasele cu cea mai scăzută coeziune
semantică, în urma analizei cu inFusion a obținut de asemenea un grad de coeziune
sintactică scăzut. Clasa RectangleFigure, una dintre clasele cu o coeziune
semantică bună, în urma analizei cu inFusion a obținut și la coeziunea sintactică un
scor bun.
Sistemul jHotDraw a obținut un deficit de calitate pentru coeziunea sintactică de
5.7. Pentru aceste valori de prag coeziunea semantică a sistemului este 3.01.
Sistemul Proguard în urma analizei cu inFusion a obținut un deficit de calitate
pentru coeziune de 4.3 iar coeziunea semantică este de 2.18. Raportul acestor
valori se poate observa în Figura 6.9. În partea stângă se află sistemul jHotDraw iar
în partea dreaptă se află sistemul ProGuard. Culoarea roșie reprezintă coeziunea
sistemului din punctul de vedere al interacțiunii componentelor iar culoarea
albastră reprezintă coeziunea semantică.
Valoarea calculată de inFusion este folosită pentru a compara două sisteme între
ele. Se observă că raportul coeziunii semantice este foarte asemănător cu raportul
coeziunii sintactice calcultate de inFusion. Plecând de la această observație se
poate concluziona că metrica nou definită poate fi folosită cu succes în compararea
a două sisteme. Pentru cele două sisteme, coeziunea semantică reflectă fidel
gradul de coeziune sintactică a sistemului.
61 STUDIU EXPERIMENTAL
Figura 6.9 – jHotDraw vs. ProGuard – coeziune
6.2.2 Concepte cheie
În Tabelul 6.1 sunt descrise în mod selectiv câteva dintre clasele pachetului
org.jhotdraw.draw împreună cu o parte din caracteristicile lor. Se observă că
valoarea coeziunii semantice este direct proporțională cu numărul liniilor de cod,
numărul de metode și numărul de atribute.
Tabelul 6.1 – Coeziunea semantică a claselor din pachetul org.jhotdraw.draw
Nr. Clasa Coeziunea semantică
NOM NOA LOC Cuvintele cheie
1 AbstractFigure 21 70 9 565
figure fire decorator change listener visible connector handle bounds point remove add basic
interactive drop can lock list courting connection validate
includes transform
2 AbstractCompositeFigure 21 54 5 536
child bounds remove abstract composite back all list restore
change count find add basic send create handles add notify undoable edit happened contains preferred
size decomposition notify read attribute has
3 Drawing 10 32 0 209 add figures remove find render
listener back undoable edit contains lock
4 FloatingTextField 7 11 2 93 end action text field overlay
bounds request focus preferred size
5 FloatingTextArea 6 8 3 110 area edit drawing bounds request
preferred size text end
6 TextAreaTool 5 8 2 138 text edit field deactivate mouse
pressed
7 EllipseFigure 5 14 1 119 draw ellipse fill bounds basic
restore data
88
RectangleFigure 5 12 1 97 draw rectangle restore contains
basic transform
9 CompositeFigure 5 16 1 95 child basic remove count layout
remove all children
10 TextHolder 3 12 0 20 columns font label
11 LineFigure 3 4 0 62 line figure can mouse create
handles handle handle mouse click
62 6.2. Coeziune
În Figura 6.10 este reprezentată laticea de concepte de bază generată
pentru clasa AbstractFigure. În Figura 6.11 laticea de concepte pentru
AbstractFigure este filtrată și sunt sunt evidențiate conceptele cheie care definesc
gradul de coeziune al clasei. AbstractFigure este clasa cu coeziunea semantică cea
mai scăzută din pachet și de asemenea printre clasele cu coeziunea semantică cea
mai scăzută din întreg sistemul.
Figura 6.10 - AbstractFigure – laticea de bază a conceptelor
63 STUDIU EXPERIMENTAL
Figura 6.11 – AbstractFigure – laticea conceptelor filtrată și conceptele cheie
În Figura 6.11 este reprezentată laticea conceptelor generată pentru clasa
RectangleFigure iar în Figura 6.12 este reprezentată laticea conceptelor filtrată și
sunt evidențiate conceptele cheie care determină valoarea coeziunii semantice.
Figura 6.12 – RectangleFigure – laticea de bază
64 6.2. Coeziune
Figura 6.13 – RectangleFigure – laticea filtrată și conceptele cheie
Odată cu obținerea conceptelor cheie și a cuvintelor ce definesc coeziunea clasei,
sunt generate și fișierele pentru laticea conceptelor. De asemenea pentru fiecare
clasă pentru care este calculată coeziunea semantică, implementarea din iPlasma
generează un fișier în care sunt descrise conceptele și cuvintele cheie ale fiecărui
concept.
65 STUDIU EXPERIMENTAL
6.3. Claritate
În continuare vor fi prezentate câteva date cu privire la metode, clase și
claritatea lor. De asemenea vor fi prezentate concluziile corelării clarității cu
problemele de proiectare identificate în sistemul jHotDraw.
6.3.1. Metode
Sistemul jHotDraw are în total un număr de 3781 de metode. Pentru a ilustra
funcționarea metricii CodeClarity în Tabelul 6.1 au fost selectate câteva metode
pentru care au fost afișate caracteristicile lor esențiale. Coloanele tabelului
reprezintă, de la stânga la dreapta, numărul de ordine din tabel, numele clasei în
care se găsește metoda, problema de design identificată, scorul obținut pentru
claritate, scorul opținut pentru lizibiltiate, scorul opținut pentru complexitate,
complexitatea ciclomatică, numărul de variabile locale și numărul de linii de cod.
Nr. ClassName.MethodName Design problem clarity lisibility complexity cyclo nolv loc
1 NanoXMLLiteDOMOutput.writeObject Significant Sibling
Duplication 355 610.51 100 20 11 79
2 NanoXMLDOMOutput.writeObject Significant Sibling
Duplication 355 610.51 100 20 11 79
3 JavaxDOMOutput.writeObject Significant Sibling
Duplication 359 618.27 100 18 9 73
4 DoubleStroke.traceStroke Significant Internal
Duplication 382 664.08 100 19 13 164
5 SVGUtil.getTransform
415 730.45 100 25 15 115
6 SVGUtil.fromPathData
422 744.44 100 67 9 235
7 BezierFigure.getCappedPath 596.5 808.09 385 10 10 46
8 DoubleStroke.computeThickLine 607.5 365.62 850 1 6 24
9 GenericListener.raiseToPublicClass 633.5 597.92 670 7 6 19
10 SVGUtil.writeAttributes 626.5 763.96 490 8 6 46
11 SaveBeforeAction.actionPerformed 727 869.98 585 6 5 40
12 ChopBoxConnector.findEnd 830 781.25 879 4 3 16
13 BezierTool.addPointToFigure 876.5 933.33 820 6 3 21
14 DrawingPanel.initComponents Significant External
Duplication 931.5 893.06 970 1 1 35
15 EllipseFigure.EllipseFigure 985 1000 970 1 0 8
Tabelul 6.2 – Claritatea metodelor
În Tabelul 6.2 se poate observa variația clarității, lizibilității și complexității în
funcție de anumite caracteristici ale metodei. Pentru rândul 8 din tabel se observă
că deși metoda DoubleStroke.computeThickLine are o complexitate scăzută, prin
urmare scorul complexității este unul bun, scorul obținut la lizibilitate este unul
mediu. Acest lucru se datorează clarității identificatorilor așa cum se pot observa
aceștia în codul metodei din Figura 6.13.
66 6.3. Claritate
Figura 6.14 – codul metodei DoubleStroke.getCappedPath
În cazul metodei GenericListener.raiseToPublicClass, metoda din rândul 9 din
Tabelul 6.2, se observă că scorul lizibilității este foarte apropiat de cel al
complexității. Codul metodei care a dus la aceste rezultate este cel din Figura
6.14. Metoda nu are o complexitate foarte mare dar din cauza identificatorilor, în
mod special al variabilelor locale declarate prin abrevieri, claritatea ei poate avea
de suferit.
Figura 6.15 – codul metodei GenericListener.raiseToPublicClass
67 STUDIU EXPERIMENTAL
În continuare vor fi prezentate rezultatele corelării clarității, lizibilității și
complexității metodelor cu problemele arhitecturale ale metodelor identificate cu
inFusion. Din cele 3781 de metode au fost identificate 70 de metode care au cel
puțin o problemă de design. Relația dintre claritate, lizibilitate și complexitate a
fost afișată sub forma unui grafic. Pe linia orizontală a fost afișat scorul clarității,
respectiv lizibilității sau complexității pe o scară de la 0 la 1000. Pe axa verticală a
fost reprezentat numărul de probleme pentru o metodă, pe o scară de la 0 la 4.5
pentru metodele analizate.
Figura 6.16 – Distribuția problemelor metodelor în funcție de lizibilitate
În Figura 6.15 este reprezentată distribuția problemelor de structură identificate în
funcție de scorul obținut la capitolul lizibilitate (Reading Lisibility), în Figura 6.16
este reprezentată distribuția problemelor în funcție de scorul obținut la capitolul
complexitate (Reading Complexity) iar în Figura 6.17 este reprezentată distribuția
problemelor în funcție de claritatea metodelor (Reading Clarity).
În Figura 6.15 se observă că toate metodele cu probleme raportate la conceptul de
lizibilitate se găsesc în intervalul 500-1000. În Figura 6.16 problemele sunt
raportate la complexitate și se observă că metodele cu probleme au o distribuție
relativ uniformă pe tot intervalul 0-1000. În Figura 6.17 problemele sunt raportate
la claritate, media scorului lizibilității și complexității, și se observă că metodele
cu probleme din nou au o distribuție uniformă în intervalul 300-1000.
În urma analizei celor peste 3000 de metode ale sistemului jHotDraw, s-a
observat că metodele cu probleme au o distribuție relativ uniformă pe întreg
spectrul clarității, de la un scor scăzut (250-300) până la un scor ridicat (900-1000).
În concluzie, pe baza datelor analizate nu se poate emite concluzia că există o
corelație între claritatea unei metode și problemele ei arhitecturale. Faptul că o
metodă este scrisă într-un mod cât mai lizibil și cât mai ușor de înțeles nu oferă
garanție asupra faptului că acea metodă nu va suferi de o anumită problemă de
design.
68 6.3. Claritate
Figura 6.17 – Distribuția problemelor metodelor în funcție de complexitate
Figura 6.18 – Distribuția problemelor metodelor în funcție de claritate
69 STUDIU EXPERIMENTAL
6.3.2. Clase
Sistemul jHotDraw are un număr de 483 de clase. Dintre acestea 61 au fost
identificate de inFusion ca suferind de un anumit tip de problemă arhitecturală.
Reamintim faptul că pentru clase claritatea ia în considerare doar scorul lizibilității
(Reading lisibility) pentru metode.
În Figura 6.18 este reprezentată distribuția claselor în funcție de scorul
clarității obținut. Pe axa verticală sunt reprezentate numărul problemelor
identificate iar pe axa orizontală este reprezentat scorul clarității. La fel ca și în
cazul metodelor, se observă că distribuția claselor cu probleme este relativ
uniformă pe intervalul 500-1000. Acest interval reprezintă clasele cu o claritate de
la medie la foarte bună. Deși intuitiv ne-am aștepta ca majoritatea claselor cu
probleme să fie în partea claselor cu o claritate scăzută, acest lucru nu se
întâmplă.
În concluzie, pe baza datelor observate se poate emite concluzia că în cazul
claselor cu toate că aceasta este scrisă într-un mod cât mai lizibil și ușor de
înțeles, acest fapt în nici un caz nu este o garanție în fața erorilor de proiectare.
Figura 6.19 – Distribuția problemelor claselor în funcție de claritate
În Anexa A și Anexa B sunt prezentate rezultatele analizei clarității pentru
metodele, respectiv clasele cu probleme. Tabelele sunt sortate în ordine
descrescătoare în funcție de numărul problemelor identificate.
În Anexa F sunt prezentate rezultatele clarității la nivel de pachet și sistem pentru
jHotDraw și ProGuard.
70 7.1. WordCloud
Capitolul 7. Concluzii În urma analizei identificatorilor unui sistem software orientat pe obiecte pot
fi enunțate următoarele concluzii.
7.1. WordCloud
Sumarizând informațiile colectate în urma utilizării vizualizării WordCloud
pentru metode se pot afirma următoarele lucruri. Pe baza cuvintelor extrase sunt
identificate conceptele cheie cu care operează metoda analizată. În al doilea rând,
în funcție de informațiile extrase din TypeCloud și MethodCloud pot fi identificați
foarte ușor posibilii colaboratori ai metodei și dacă metoda procesează datele
intern sau apelează la alți furnizori. În al treilea rând, pe baza distribuției de
informație între categorii și diferenței de dimensiune între cuvintele cheie a
fiecărei categorii pot fi făcute anumite presupuneri legate de structura codului. În
al patrulea rând, cuvintele cheie din DataCloud pot fi utilizate pentru a identifica
eventualele metode care au o denumire ce nu reflectă funcționalitatea metodei. În
al cincilea rând, pentru metodele care au un grad de claritate scăzut, identificarea
conceptelor cheie și o eventuală ipoteză legată de structura codului se dovedesc a
fi foarte utile în a îmbunătăți timpul de înțelegere a metodei atunci când este
parcursă linie cu line de către un utilizator uman.
Generalizând concluziile pentru toate nivele de vizualizare, utilizând vizualizarea
WordCloud construită pe baza cuvintelor folosite în identificatori și a frecvenței cu
care ele sunt folosite pot fi extrase informații legate de funcționalitatea,
colaboratorii și structura unei porțiuni de cod. De asemenea, vizualizarea
WordCloud aduce o îmbunătățire a timpului de înțelegere a unui cod scris ilizibil
sau complex. Îmbunătățind capacitatea de înțelegere a codului și reducând timpul
necesar înțelegerii crește eficiența procesului de mentenață, deci crește calitatea.
În concluzie, utilizarea WordCloud aduce un plus de calitate sistemelor software.
7.2. Coeziune semantică
În urma rezultatelor obținute metrica nou definită pentru coeziunea semantică
poate fi utilizată cu succes ca o alternativă pentru compararea a două sisteme
similare. De asemenea în procesul de calculare a valorii metricii sunt obținute și
cuvintele cheie care dau coeziune clasei respective. Acestea pot fi folosite ca
perspectivă asupra funcționalității implementate de metodele clasei respective.
7.3. Claritate
Metrica definită cu numele CodeClarity reușește să evalueze în mod pertinent
claritatea unei metode sau unei clase. Aceasta poate fi foarte utilă atunci când se
dorește obținerea unor informații inițiale într-un mod rapid despre cât de ușor
71 CONCLUZII
poate fi înțeleasă de către un programator o anumită porțiune de cod, o metodă
sau o clasă.
Aceste informații pot fi agregate și astfel poate fi construită o medie a
clarității pentru un întreg sistem. O astfel de informație poate fi utilă de exemplu
când un programator are de ales între utilizarea a două biblioteci similare, cu
funcționalități diferite. Întrebarea la care trebuie să răspundă este: care dintre ele
va fi cea mai ușor de folosit? Comparând valorile clarității obținute pentru cele
două sisteme poate fi o modalitate de a decide între cele două. Sistemul cu cel mai
înalt grad de claritate este foarte probabil să fie cel mai ușor de folosit pentru că
programatorul va putea înțelege și utiliza sistemul într-un timp mai scurt decât în
cazul celuilalt sistem.
Claritatea identificatorilor determină claritatea metodelor și claritatea
claselor. În urma studiului ce a investigat existența unei posibile relații între
claritate și problemele de design existente concluzia la care s-a ajuns este că
problemele de design nu depind în mod direct claritatea codului. Mai degrabă
claritatea codului este rezultatul unui design bun și nu invers. Chiar dacă
identificatorii nu sunt o cauză directă a unei carențe de design, cu siguranță ei
contribuie la o asemenea situație deoarece programatorul poate fi indus în eroare
de informațiile eronate transmise de identificatori.
Concluzia analizei semanticii identificatorilor și calității sistemelor software
orientate pe obiecte este că identificatorii nu sunt doar simple convenții ci ei fac
parte și contribuie semnificativ la o rată cât mai crescută de mentenabilitate
contribuind astfel la calitatea sistemului.
72 8.1. WordCloud
Capitolul 8. Dezvoltări ulterioare În acest capitolu sunt prezentate direcții viitoare de cercetare și îmbunătățiri
care pot fi aduse atât conceptelor prezentate cât și tool-urilor disponibilie
programatorilor.
8.1. WordCloud
O primă direcție posibilă este implementarea unei funcționalități în editoarele
de cod ce verifică în timp real că identificatorul clasei sau metodei conține cuvinte
cheie din codul delimitat de acea clasă sau metodă. De asemenea, pe lângă
verificarea aceasta pot fi sugerate tot în timp real nume alternative ce reflectă cât
mai bine funcționalitatea implementată.
O altă direcție de dezvoltare este ca următoarea versiune de vizualizare pentru
metode pe lângă cuvintele cheie să ofere în mod textual și unele indicii cu privire
la o potențială structură a codului.
În al treilea rând, pentru vizualizarea pachetelor o facilitate foarte utilă ar fi
ca după un scurt interval în care mouse-ul programatorului este deasupra unui
pachet, să fie afișată vizualizarea WordCloud ca un pop-up image. O asemenea
facilitate poate fi implementată cu ușurință ca un plug-in pentru Eclipse sau
inFusion.
8.2. Coeziunea semantică
În primul rând, ca direcție de cercetare poate fi îmbunătățirea algoritmului de
filtrare și selecție a conceptelor din latice.
În al doilea rând, este necesară compararea coeziunii semantice și a coeziunii
arhitecturale între mai multe sisteme similare și investigării gradului de precizie a
coeziunii semantice.
O a treia direcție de cercetare este studiul coeziunii semanticii și relația ei cu
problemele arhitecturale ale claselor unui sistem.
8.3. Claritatea Codului
În programarea orientată pe obiecte există deja câteva convenții pentru
construirea numelor identificatorilor. O problemă importantă cu privire la numele
identificatorilor este alegerea cuvintele folosite în construirea identificatorilor. În
programele orientate pe obiecte o regulă de bază este folosirea substantivelor
pentru numele de clasă și perechilor verb-substantiv (sau doar un verb, dacă
substantivul este numele clasei) pentru numele methodei [20]. Astfel o primă
direcție de dezvoltare este ca în viitor calcularea scorului clarității să țină cont și
de convențiile părților de vorbire utilizate în construirea identificatorilor. Această
73 DEZVOLTĂRI ULTERIOARE
îmbunătățire se poate face tot cu ajutorul bibliotecii RitaWordnet care oferă
suport și pentru părțile de vorbire a cuvintelor.
Buse and Wimer [1] prezintă mai multe posibile utilizări pentru o metrică automată
a lizibilității. O asemenea metrică ar putea ajuta dezvoltatorii să scrie software
mai lizibil prin identificare rapidă a unui cod ce are un scor scăzut. Poate ajuta
managerii de proiect în monitorizarea și menținerea lizibilității. Poate servi ca o
cerință pentru validare. Poate asista inspecțiile de cod prin canalizarea efortului
spre părți de program care ar necesita îmbunătățire.
O altă posibilă direcție de dezvoltare este utilizarea metricii clarității ca
punct de plecare pentru o strategie de detecție ceva identifică porțiunile de cod
scrise într-un mod ilizibil și în același timp oferă sugestii programatorului pentru
îmbunătățirea ei.
74
Capitolul 9. Bibliografie [1] Raymond P.L. Buse and Westley R. Weimer, „A Metric for Software Readability”, ISSTA '08
Proceedings of the 2008 international symposium on Software testing and analysis, pg. 121-130 [Online 17.05.2012: http://dl.acm.org/citation.cfm?id=1390647].
[2] Dr. Chong Ho Yu, „Writing Efficient SAS Codes”, Arizona State University 2012 [Online 17.05.2012: http://www.creative-wisdom.com/computer/sas/efficient.html]
[3] K. Aggarwal, Y. Singh, and J. K. Chhabra, „An integrated measure of software maintainability”, Reliability and Maintainability Symposium, 2002, Proceedings. Annual,
pages 235-241, September 2002.
[4] Robert L. Glass, „Software Conflict 2.0: The Art and Science of Software Engineering”, developer.* Books (March 10, 2006), pg.73, ISBN-10: 0977213307, ISBN-13: 978-
0977213306 [Online 17.05.2012: http://www.codinghorror.com/blog/2006/06/the-noble-art-
of-maintenance-programming.html]
[5] B. Boehm and V. R. Basili, „Software defect reduction top 10 list”, Computer, 34(1):135-137,
2001.
[6] Jeff Atwood, „When Understanding means Rewriting” [Online 17.05.2012:
http://www.codinghorror.com/blog/2006/09/when-understanding-means-rewriting.html]
[7] Peter Hallam, „What Do Programmers Really Do Anyway?” [Online 17.05.2012:
http://blogs.msdn.com/b/peterhal/archive/2006/01/04/509302.aspx ]
[8] Jeff Atwood, „The Noble Art of Maintenance Programming”, [Online 17.05.2012:
http://www.codinghorror.com/blog/2006/06/the-noble-art-of-maintenance-programming.html]
[9] Martin J Fowler, „Refactoring: Improving the Design of Existing Code”, Addison-Wesley
Professional; 1 edition (July 8, 1999)
[10] E. W. Dijkstra, „A Discipline of Programming”, Prentice Hall PTR, 1976.
[11] J. L. Elsho and M. Marcotty, „Improving computer program readability to aid modification”, Commun, ACM, 25(8):512-521, 1982.
[12] Ashod Nakashian, „Why Code Readability Matters”, [Online 17.05.2012
http://blog.ashodnakashian.com/2011/03/code-readability]
[13] J. Frederick P. Brooks, „No silver bullet: essence and accidents of software engineering”,
Computer, 20(4):10-19, 1987.
[14] Diomidis Spinellis, „Reading, Writing, and Code”, Queue - Power Management, Volume 1
Issue 7, 10-01-2003, pg 84 [Online 18.05.2012 http://queue.acm.org/detail.cfm?searchterm=code+readability&id=957782]
[15] R. F. Flesch, „A new readability yardstick”, Journal of Applied Psychology, 32:221-233, 1948.
[16] R. Gunning, „The Technique of Clear Writing”, McGraw-Hill International Book Co, New
York, 1952.
[17] G. H. McLaughlin, „Smog grading - a new readability”, Journal of Reading, May 1969.
75 BIBLIOGRAFIE
[18] J. P. Kinciad and E. A. Smith, „Derivation and validation of the automated readability index
for use with technical materials”, Human Factors, 12:457-464,1970.
[19] N. J. Haneef, „Software documentation and readability: a proposed process improvement”,
SIGSOFT Softw. Eng. Notes, 23(3):75-77, 1998.
[20] Diomidis Spinellis, „Code Quality: The Open Source Perspective”, Addison Wesley Professional, April 03, 2006, ISBN-10: 0-321-16607-8
[21] ISO/IEC 9126 Software engineering — Product quality [Online 28.05.2012 http://webstore.iec.ch/preview/info_isoiec9126-1%7Bed1.0%7Den.pdf]
[22] George A. Miller, „The magical number seven, plus or minus two: Some limits on our capacity for processing information”, Psychological Review, 63:81–97, 1956 [Online
28.05.2012 http://psychclassics.yorku.ca/Miller/ ]
[23] Martin Halvey and Mark T. Keane, „An Assessment of Tag Presentation Techniques”, poster
presentation at WWW 2007, 2007 [Online 29.05.2012
http://en.wikipedia.org/wiki/Tag_cloud#cite_note-0]
[24] OpenCloud - http://opencloud.mcavallo.org/ [Online 29.05.2012]
[25] Radu Marinescu, Michele Lanza, „Object Oriented Metrics in Practice”, Springer 2006
[26] J. C. Knight and E. A. Myers, „Phased inspections and their implementation”, SIGSOFT
Softw. Eng. Notes, 16(3):29-35, 1991.
[27] RitaWordNet - http://www.rednoise.org/rita/wordnet/documentation/ [Online 31.05.2012]
[28] iPlasma - http://loose.upt.ro/reengineering/research/iplasma [Online 31.05.2012]
[29] J. Lionel E. Deimel, „The uses of program reading”, SIGCSE Bull., 17(2):5-14, 1985.
[30] WordNet - http://wordnet.princeton.edu/ [Online 31.05.2012]
[31] M M Lehman, „Laws of Software Evolution Revisited”, 1997.
[32] T.J. McCabe, „A measure of complexity”, IEEE Transactions on Software Engineering,
2(4):308–320, December 1976.
[33] GraphViz - http://www.graphviz.org/ [Online 13.06.2012]
[34] N. Nagappan and T. Ball, „Use of relative code churn measures to predict system defect
density”, in ICSE '05: Proceedings of the 27th international conference on Software
engineering, pg. 284-292, 2005.
[35] C. V. Ramamoorthy and W.-T. Tsai, „Advances in software engineering”, Computer,
29(10):47-58, 1996.
[36] D. R. Raymond, „Reading source code”, in CASCON '91: Proceedings of the 1991 conference
of the Centre for Advanced Studies on Collaborative research, pg. 3-16. IBM Press, 1991.
[37] P. A. Relf, „Tool assisted identifier naming for improved software readability: an empirical
study”, Empirical Software Engineering, 2005. 2005 International Symposium on, November
2005.
[38] S. Rugaber, „The use of domain knowledge in program understanding”, Ann. Softw. Eng.,
9(1-4):143-192, 2000.
76
[39] jHotDraw - http://www.jhotdraw.org/ [Online 09.06.2012]
[40] jHotDraw – sursele http://sourceforge.net/projects/jhotdraw/ [Online 09.06.2012]
[41] Wolff, Karl Erich, „A first course in Formal Concept Analysis", în F. Faulbaum, StatSoft '93,
Gustav Fischer Verlag (1994).
[42] Rudolf Wille, „Restructuring lattice theory: An approach based on hierarchies of concepts”,
retipărit în: ICFCA '09: Proceedings of the 7th International Conference on Formal Concept
Analysis, Berlin, Heidelberg, 2009.
[43] eRCA - http://code.google.com/p/erca/ [Online 13.06.2012]
[44] E. J. Weyuker, „Evaluating software complexity measures”, IEEE Trans. Softw. Eng.,
4(9):1357-1365, 1988.
[45] inFusion - http://www.intooitus.com/products/infusion [Online 14.06.2012]
[46] Steve McConnell, „Code Complete”, Microsoft Press, 2nd ed.
[47] ProGuard - http://proguard.sourceforge.net/ [Online 15.06.2012]
[48] Rada, R., Mili, H., Bicknell, E., Bletner, M., „Development and application of a metric on semantic nets”, IEEE Transactions on Systems, Man and Cybernetics 19(1) (1989) 17 – 30.
[49] Sussna, M., „Word sense disambiguation for free-text indexing using a massive se-mantic network”, CIKM ’93: Proceedings of the second international conference on Information and
knowledge management, New York, NY, USA, ACM (1993), 67–74.
[50] Resnik, P., „Using information content to evaluate semantic similarity in a taxon-omy”,
Proceedings of the 14th International Joint Conference on Artificial Intelli-gence (August
1995) 448 – 453.
[51] Ivan Marsic, „Software Engineering”, Rutgers University, School of Engineering [Online
16.06.2012 http://www.ece.rutgers.edu/~marsic/books/SE/ ]
[52] Haining Yao, Anthony Mark Orme, Letha Etzkorn, „Cohesion Metrics for Ontology Design
and Application”, Journal of Computer Science 1(1): 107-113, 2005, ISSN 1549-3636,
Science Publications, 2005
[53] Cara Stein, Letha Etzokorn, Sampson Gholston, Phillip Farrington, Julie Fortune, „A
Knowledge-Based Cohesion Metric for Object-Oriented Software”, Federal University of Lavras, Department of Computer Science, Brazil [Online 16.06.2012
http://www.dcc.ufla.br/infocomp/artigos/v5.4/art06.pdf ]
81 ANEXA E. JHOTDRAW VS. PROGUARD – COEZIUNEA SEMANTICĂ A PACHETELOR
Anexa E. jHotDraw vs. ProGuard – coeziunea semantică a pachetelor
jHotDraw 3.01 483 ProGuard 2.18 655
package
semantic cohesion
no. classes
package semantic cohesion
no. classes
1 nanoxml 11 2 proguard.optimize.evaluation 4.15 13
2 org.jhotdraw.app 6.15 13 proguard.retrace 4 3
3 org.jhotdraw.gui.datatransfer 5 1 proguard.classfile.io 3.8 10
4 org.jhotdraw.xml 5 12 proguard.classfile.util 3.5 18
5 org.jhotdraw.draw 4.36 134 proguard.classfile 3.2 15
6 org.jhotdraw.geom 3.73 9 proguard.classfile.editor 2.94 53
7 net.n3.nanoxml 3.62 24 proguard 2.87 31
8 org.jhotdraw.samples.net.figures 3 1 proguard.optimize.peephole 2.83 24
9 org.jhotdraw.samples.pert.figures 3 5 proguard.preverify 2.75 4
10 org.jhotdraw.samples.svg 2.92 13 proguard.shrink 2.61 18
11 org.jhotdraw.samples.net 2.89 9 proguard.classfile.attribute.preverification.visitor 2.5 2
12 org.jhotdraw.samples.pert 2.78 9 proguard.optimize 2.44 18
13 org.jhotdraw.samples.draw 2.55 11 proguard.evaluation 2.18 11
14 org.jhotdraw.draw.action 2.22 45 proguard.classfile.attribute.annotation 2.07 14
15 org.jhotdraw.samples.svg.figures 2.17 12 proguard.evaluation.value 2 46
16 org.jhotdraw.io 2 1 proguard.gui 1.97 30
17 org.jhotdraw.gui.event 2 2 proguard.optimize.info 1.93 30
18 org.jhotdraw.undo 2 6 proguard.classfile.attribute 1.91 22
19 org.jhotdraw.app.action 1.82 37 proguard.ant 1.88 8
20 org.jhotdraw.util.prefs 1.6 5 proguard.obfuscate 1.86 28
21 org.jhotdraw.gui 1.54 13 proguard.classfile.attribute.preverification 1.84 19
22 org.jhotdraw.samples.svg.action 1.5 2 proguard.classfile.visitor 1.83 59
23 org.jhotdraw.util 1.43 6 proguard.classfile.instruction 1.82 11
24 org.jhotdraw.beans 1 1 proguard.classfile.instruction.visitor 1.75 4
25
proguard.classfile.constant 1.69 16
26
proguard.classfile.attribute.visitor 1.69 16
27
proguard.classfile.constant.visitor 1.67 6
28
proguard.gui.splash 1.55 38
29
proguard.util 1.41 17
30
proguard.io 1.21 33
31
proguard.classfile.attribute.annotation.visitor 1.17 6
32
proguard.wtk 1 1
average 3.14 15.54 average 2.25 19.5
82
Anexa F. jHotDraw vs. ProGuard – claritate
jhotdraw-7.0.6 818.38 483 ProGuard 870.28 655
package clarity no.
classes package clarity
no. classes
org.jhotdraw.gui.event 975.26 2 proguard.classfile.attribute.preverification.vis
itor 997.82 2
org.jhotdraw.beans 930.6 1 proguard.classfile.attribute.annotation.visitor 979.89 6
org.jhotdraw.samples.svg.figures
912.27 12 proguard.classfile.constant.visitor 957.69 6
org.jhotdraw.util 907.02 6 proguard.io 946.97 33
org.jhotdraw.gui 904.37 13 proguard.classfile.attribute.visitor 939.9 16
org.jhotdraw.draw 899.72 134 proguard.classfile.visitor 939.83 59
org.jhotdraw.undo 896.01 6 proguard.util 938.17 17
org.jhotdraw.draw.action 889.95 45 proguard.classfile.instruction.visitor 933.6 4
org.jhotdraw.util.prefs 889.54 5 proguard.classfile.attribute.preverification 924.32 19
org.jhotdraw.samples.pert.figures
876.62 5 proguard.wtk 921.65 1
org.jhotdraw.samples.net.figures
869.18 1 proguard.optimize.info 920.36 30
org.jhotdraw.app 865.91 13 proguard.obfuscate 919.89 28
org.jhotdraw.io 856.12 1 proguard.classfile.attribute.annotation 915.07 14
org.jhotdraw.app.action 841.87 37 proguard.gui.splash 913.85 38
org.jhotdraw.xml 833.66 12 proguard.optimize 898.85 18
org.jhotdraw.samples.net 823.95 9 proguard.classfile 897.44 15
org.jhotdraw.samples.pert 822.83 9 proguard.evaluation.value 895.78 46
org.jhotdraw.samples.draw 819.69 11 proguard.retrace 893.53 3
net.n3.nanoxml 812.88 24 proguard.classfile.constant 888.81 16
org.jhotdraw.samples.svg 798.4 13 proguard.ant 888.57 8
org.jhotdraw.gui.datatransfer 775.39 1 proguard.shrink 884.93 18
org.jhotdraw.samples.svg.action
770.61 2 proguard.classfile.attribute 884.49 22
org.jhotdraw.geom 769.23 9 proguard 876.99 31
nanoxml 718.4 2 proguard.gui 873.31 30
proguard.evaluation 872.93 11
proguard.classfile.editor 866.72 53
proguard.optimize.peephole 852.9 24
proguard.optimize.evaluation 844.52 13
proguard.classfile.io 843.04 10
proguard.classfile.util 829.52 18
proguard.classfile.instruction 826.86 11
proguard.preverify 751.13 4
average 852.47 15.54 average 897.47 19.5