Professional Documents
Culture Documents
Prmbajtje
Abstrakt ......................................................................................................................................................... 4
1
Hyrje ...................................................................................................................................................... 5
1.1
Qllimi ........................................................................................................................................... 6
1.2
Organizimi ..................................................................................................................................... 6
Hyrje .............................................................................................................................................. 7
2.2
2.3
Nivelet e testimit......................................................................................................................... 10
2.4
2.5
2.6
Hyrje ............................................................................................................................................ 17
3.2
3.3
Klasifikimi .................................................................................................................................... 20
3.4
3.4.1
3.5
3.5.1
3.5.2
3.5.3
SOTA ............................................................................................................................................ 32
4.1.1
4.1.2
4.1.3
4.2
CCCC ............................................................................................................................................ 36
4.2.1
4.2.2
5.2
5.2.1
5.3
Prmbledhje ................................................................................................................................ 47
5.3.1
6
6.1.1
6.1.2
6.1.3
6.2
6.2.1
Rezultatet e CCCC................................................................................................................ 49
6.2.2
6.3
Scaner.java .................................................................................................................................. 51
6.3.1
Rezultatet e CCCC................................................................................................................ 53
6.3.2
6.4
6.4.1
6.4.2
Matje shtes........................................................................................................................ 58
7.2
7.3
7.4
7.5
Kostoja e optimizimi.................................................................................................................... 62
7.6
Prfundimet ........................................................................................................................................ 64
Kjo tez diskuton kualitetin e dhn nga nj standard si ISO, rndsin e kualitetit gjat procesit
t zhvillimit,dhe s fundmi zgjedhjen e metrikave software si metrikat e pmass (size-metrics),
metrika e kompleksitetit metrikat e defekteve pr t vlersuar kodet n java .
1.1 Qllimi
Qllimi i ksaj teme sht t studioj gabimet q ndodhin n kodet e ndrtuara n
programet n java dhe nprmjet tyre te realizoj prgjithsime pr super programe. Kto gabime
do t analizohen n aspektin e kompleksitetit ku shpjegohet dhe ndikimi i kompleksitetit n
mundsin pr gabime, rritja e pmasave te kodit (LOC). Prve ksaj shikohet mbulimi i kodit
ne 9 parametrat e specifikuara nga programi .
Pr t realizuar kt gje prdoren dy programe SOTA dhe CCCC. Kto rezultate jan
interpretuar dhe n baz t tyre nxirren prfundime n forme raportesh. Kto raporte do t
shprehin dhe ndikimin e tyre ne gabimet n kod, q sht dhe thelbi i studimit t ksaj teme
diplome.
1.2 Organizimi
Materiali sht organizuar n shtat kapituj. N kapitullin e dyt trajtohet testimi i
software-it kryesisht testimi i gabimeve n kod. Ky kapitull jep nj pasqyr t defekteve n
software, niveleve t testimit, metodave , llojeve si dhe metrikat e testimit. Kapitulli i tret
fokusohet tek parashikimi i gabimeve n kod, cikli i jets s nj gabimi, klasifikimi dhe gjetja e
tyre, mjetet e gjurmimit dhe modelet pr parashikimin e gabimeve. Toolset e prdoruara pr
realizimin e implementimit, ku shpjegohet manuali i prdorimit dhe mnyrn se si funksionon,
jan pjes e kapitullit t katrt. Kapitulli i pest paraqet implementimin e nj rasti studimor, nj
analize e detajuar statike t realizuar me ann e CCCC tool-s i shpjeguar n kapitullin e
mparshm. Analiza dinamike dhe analiza e hollsishme e parametrave t mbulimit t kodit
sht pjes e kapitullit t gjasht. Kapitulli shtat paraqet mundsi optimizimi t kodit e cila
mund t shihet si pun n t ardhmen, pse jo futjen e inteligjencs artificiale pr kode
vetkorrigjuese.
Pr ilustrim t studimit n shtojcat e pas kapitujve do t paraqiten tabelat, gafikt pr sejcilin nga
rastet ilustrues dhe kodet burim t shkruara n java, t prdoruar pr kt studim t bre. S
fundmi paraqiten konkluzionet e nxjerra nga kjo pun si dhe referencat e prdorura.
6
Sic shihet, testimi sht nj nga fazat e zhvillimit t nj software. Kjo faz fokusohet n nj
hetim empirik, ku rezultatet prshkruajn cilsin e sistemit. Testimi nuk mund t konfirmoj q
sistemi funksionon si duhet n t gjitha kushtet, por mund t provoj se ai dshton pr kushte t
caktuara. Sa me shpejt q t gjendet defekti gjat procesit t zhvillimit, aq m e vogl sht
kostoja e rregullimit. Testimi i hershm redukton rreziqet si vonesat ose tejkalimi i kostos. N
fazn e testimit, ai provon nse jan plotsuar t gjitha krkesat, prfshir edhe krkesat e
performancs dhe siguris. Si prfundim, testimi konfirmon q sistemi plotson krkesat e
prdoruesit dhe prmbush nevojat e biznesit.
Qllimi i fazs s testimit sht t garantoj se sistemi ka ndrtuar dhe testuar me sukses t gjitha
krkesat dhe parametrat e projektimit n fazat e mparshme. Pasi kjo faz kalohet me sukses
shkohet n fazn e implementimit.
Testimi sht nj proces q realizohet nga grupe dhe persona t ndryshm. S pari sht
menaxheri i testimit q menaxhon dhe kontrollon projektet e testimit, prcakton planin e testimit
dhe mbikqyr inxhiniert. Kta t fundit hartojn rastet e studimit (test cases), prcaktojn
specifikimet dhe ekzekutojn testet. Me testimin merren edhe grupe t pavaruara testimi. Vet
prdoruesi pfundimtar sht nj testues, i cili kontrollon nse software i plotson apo jo
krkesat. Ndarja n kt mnyr e ndihmon procesin sepse testuesit nuk kan t njjtat njohuri
pr kodin dhe brendsin e aplikacionit. sht e rndsishme q kur krijohet dhe ndrtohet nj
software t testohet hap pas hapi. Testimi n fund t projektit ka kosto m t mdha sepse sht
m e vshtir t rikthehesh n fillim pr t gjetur se ku ka ndodhur problemi dhe pr ta rregulluar
at.
Problemet m t shpeshta t software-it jan[1]:
Gabimet n llogaritje
8
10
Tetsimi nga Posht-Lart fillon me testimin njsi dhe ndiqet nga testimet progresive t
kombinimeve t njsive (moduleve) t niveleve m t larta.
Testimi nga Lart-Posht teston fillimisht modulet e niveleve t larta dhe m pas teston n
mnyr progresive modulet e niveleve m t ulta.
Testimi Alpha sht faza e par dhe duhet t performohet nga zhvilluesit dhe grupi i
kualitetit. Kombinimi i testimit njsi, testimit t integrimit dhe testimit t sistemit njihet si
testimi Alpha. N kt faz testohen gabimet drejtshkrimore, linqet e kputura, koha e
ngarkimit dhe problemet e voness.
11
Testimi Beta performohet pasi sht realizuar me sukses testimi Alpha. Vetm nj pjes
e vogl e audiencs s parashikuar teston aplikacionin. Njihet ndryshe si testimi i para
lirimit. N kt faz prdoruesi do t instaloj, ekzekutoj aplikacionin dhe do drgoj
nj analiz tek ekipi i projektit. Do t testohen gabimet tipografike, sjelljet konfuze t
aplikacionit dhe rastet e prplasjeve. Pasi merr analizn, ekipi i projektit mund t
rregulloj problemet prpara se ta dorzoj aplikacionin tek prdoruesit. Sa m shum
probleme t zgjidhura t jen, aq m e lart sht dhe cilsia e aplikacionit dhe sa m e
lart cilsia, aq m e lart dhe knaqsia e marr nga klienti.
Disa tentojn q t prfshijn n nivelet e testimit dhe testimin e regresit, por ai nuk sht i
nevojshm. Testimi i regresit sht thjesht nj lloj testimi q mund t kryhet tek secili nga katr
nivelet e msiprme.
Ka kosto t lart
Ndonjher sht e pamundur pr t par n do cep dhe knd pr t gjetur gabime t
fshehura q mund t krijojn probleme duke qen s shum rrug mbeten pa testuar.
sht e veshtir pr t ruajtur testimin White Box duke qen se krkohet prdorimi i
mjeteve t specializuara si analizuesit e kodit apo mjetet pr debug.
Testimi Grey Box sht nj teknik testimi q krkon njohuri t limituara t puns s brendshme
t aplikacionit. Ndryshe nga testimi Black Box ku testuesi teston vetm ndrfaqen e prdoruesit,
n testimin Grey Box testuesi ka akses n bazn e t dhnave dhe n dokumentat e projektit. Me
kto njohuri testuesi sht i aft t prgatis skenare testimi dhe raste testimi m t mira gjat
hartimit t planit t testimit. Avantazhet q ofron ky testim jan:
Ofron benefite t kombinuara t testimit Black Box dhe atij White Box
Testuesit nuk mbshteten n kodin burim, por mbshteten tek krkesat funksionale dhe
prkufizimi i ndrfaqes
Testuesit mund t projektojn skenare t shklqyera testimi rreth protokolleve t
komunikimit dhe trajtimit t llojeve t t dhnave
Testimi realizohet nga pikpamja e prdoruesit dhe jo nga pikpamja e projektuesit
Disavantazhet:
Duke qen se aksesi n kodin burim nuk sht i mundur, edhe mbulimi (test coverage)
sht i limituar
13
Testet mund t jen t teprt nse projektuesi i software-it ka ekzekutuar nj rast testimi
(test case)
Testimi i do t dhne hyrse t mundshme sht i paarsyeshm sepse merr shum koh
dhe rrjedhimisht shum rrug mbeten pa testuar
14
Prmasat e software-it
Vlersimin e kostos
Vlersimin e prpjekjes
Cilsin e software-it
Mirmbajtjen
Modelet e besueshmris
Analizat e kompleksitetit
Analizat e defekteve
Testimin e software-it
16
18
E re sht gjendja ku defekti regjistrohet dhe njoftohet pr ekzistencen e tij pr her t par.
Caktuar pasi testuesi ka njoftuar pr pranin e gabimit n kod, provohet q gabimi n kod sht
i vrtet dhe i caktohet ekipit prkats t zhvilluesve.
Hapur n kt gjendje zhvilluesi ka filluar analizn dhe punn pr t rregulluar defektin.
Rregulluar pasi zhvilluesi ka br ndryshimet e nevojshme n kod dhe i ka verifikuar kto
ndryshime, gjendja e gabimit n kod kalon n gjendjen e rregulluar dhe gabimi n kod i kalon
grupit t testimit.
N pritje t ritestimit pasi sht rregulluar defekti, zhvilluesi ia jep kodin specifik testuesve pr
ritestim. N kt gjendje testimi sht n pritje t prfundimit t puns s testuesve.
Ritestimi n kt gjendje testuesi riteston ndryshimet e bra n kod n fazn e mparshme pr
t kontrolluar nse defekti sht rregulluar apo jo.
19
3.3 Klasifikimi
Shumica e gabimeve n kod ndodhin nga gabimet e bra nga njerzit n kodin burim ose
n dizajn dhe pak shkaktohen nga kompilimi q prodhon kod t pasakt. Nj program q ka nj
numr t madh gabimesh n kod q ndikojn seriozisht funksionalitetin e tij thuhet t jet nj
program me problem (buggy). Ekzistojn raporte q raportojn n mnyr t detajuar gabimet n
kod q ka nj program. Ato njihen si raportet e gabimeve n kod, raportet e defekteve, raportet e
problemeve etj.
Gabimet n kod shkaktojn problem q mund t ken nj shumllojshmri efektesh me nivele t
ndryshme t shqetesimit pr prdoruesin e programit. Disa gabime n kod mund t ken nj efekt
jo shum t dukshm n funksionalitetin e programit dhe n kt mnyr mund t mos
dedektohen pr nj koh t gjat. Gabimet n kod m serioze mund t shkaktojn ngrirje t
programit ose shkatrrim. T tjer gabime t kualifikuar si gabime n kod t siguris mund t
lejojn prdorues me qllim t keq t anashkalojn kontrollet e aksesit me qllim q t marrin
privilegje t paautorizuara.
20
Ka shum arsye pse nj gabim n kod nuk mund t rregullohet. Zhvilluesit shpesh nuk kan
kohn e mjaftueshme apo mundsi ekonomike pr t rregulluar t gjith gabimet jo serioze. Nj
tjetr arsye sht se gabimet n kod krkojn t rregullohen n ndonj version t ri q ende nuk
sht i njohur. Nga ana tjetr ndryshimet n kod mund t jen t mdha, t shtrenjta ose mund t
vonojn prfundimin e projektit. Edhe gabimet n kod q n dukje jan t thjesht mund t ojn
n krijimn e gabimeve t reja n kod t panjohura n sistem.
Gabimet n kod kategorizohen nga pesha q kan dhe disa kompani tolerojn gabimet jo kritike
n kod m pesh t ult sepse ato nuk ndikojn n funksionimin si duhet t sistemit.
Pesha e nj gabimi n kod nuk sht njsoj si rndsia e rregullimit t tij. Secila prej tyre mund t
matet dhe menaxhohet n mnyr t veant. Ky balanc varet nga shum faktor dhe pr t patur
nj ekuilibr sa m t mir disa zhvillues software-i prdorin nj proces t formalizuar t
przgjedhjes s gabimit n kod. N kt proces secilit gabim n kod i caktohet nj prioritet
bazuar n peshn e tij, frekuencn, rrezikun dhe faktor t tjer.
Disa nga llojet m t shpeshta t gabimeve n kod jan[10]:
21
22
25
Jan mats t procesit. Ato reflektojn aktivitetet e zhvillimit. Modulet me shum defekte n t
kaluarn kan shum mundsi t jen difektoz n t ardhmen. Gjithashtu modulet t cilt
ndryshojn shpesh kan shanse m t larta pr t qen t ndikuar nga defektet. Metrikat e
bazuara tek ndryshimet e bra n kod bazohen n tre teknika:
1. Gabimet e mparshme n kod
Angazhohet n sistemet e kontrollit. sht matje n nivel skedari. Pra, jan skedart ato q
ndryshojn. Quhet ndryshe struktur e ashpr.
2. Code churn
Code churn mat ndryshimet e bra n kodin baz pr nj periudh kohe dhe sht nj mnyr pr
t prcaktuar sasin e ktyre ndryshimeve. Ai sht i rndsishm pr skuadrn e zhvilluesve t
software-it sepse mund t prdoret pr t parashikuar densitetin e defekteve. Problemi me
metrikat sht se ato mund t shkaktohen nga shum gjra. Ka dy lloje matjesh: matjet absolute
dhe matjet relative. N tabeln e mposhtme jepet nj prshkrim i shkurtr i tyre[18].
Tabela 2 Matjet absolute dhe relative duke prdorur Code Churn
26
Metrikat e kodit
28
29
Metrikat e organizimit
Struktura e kontributit
31
Detyrat e SOTA-s:
32
Si punon SOTA
N analizn statike kodi burim i programit sht analizuar dhe rezultatet prcaktohen prmes
dhjet mateseve sic paraqiten n figur.
4.1.2
Tipet e prdorimit
Testimi manual
33
Testimi manual
Testimi external
Testimi automatik
4.1.3
Prgatitja
Ka te bj me leximin e kodit dhe prcaktimit t llojit t instrumentimit pr t. N
testimin manual kjo realizohet nprmjet SOTAGUI
Testimi
N fazn e testimit, kompilimit ndodh testimi i programit. Kompilimi nuk sht
prgjegjsi e SOTA-s. Shpesh kompilimi iniciohet nga SOTA nprmjet integrimit t
ANT build script. Nse nj batch file sht prezent programi gjithashtu mund t filloj
nga SOTA.
Vlersimi i fazave
N fazn e vlersimit kodi burim ngarkohet, logfile-at jan lexuar dhe matje t ndryshme
jan llogaritur. Rezultatet jan m pas t disponueshme pr vlersim, ose m mir t
eksportuara n nj raport HTML.
Instalimi i SOTA-s.
shte njaplikacion standalone Eclipse RPC. Pranon instalime Java (nga 1.6). Instalohet
nga paketimi nj file zip-i.
34
M posht paraqitet nje pamje vizuale e SOTA-s pas instalimit . N pjesn e siprm majtas lart
ka nj pamje t projektit, kurse majtas posht testcase-et e programit q jan realizuar.
35
36
4.2.1
Metrikat e shfaqura
Tag-u
LOC
Emri i metriks
Rrjeshta kodi
Prshkrimi
Kjo metrik numron numrin e rrjeshtave jo bosh
,sorce kodet pa koment n nj funksion(LOCf).
LOC ishte nj nga metrikat m t hershme q do t
vijn n prdorim ( kryesisht pr shkak se ajo sht e
drejtprdrejt pr tu matur ) .
Ajo ka nj lidhje t qart me madhsin apo
kompleksitetit t nj pjes t kodit dhe
produktivitetit mund t kalibrohet pr prdorim n
parashikimin e prpjekjeve t mirmbajtjes,
37
MVG
COM
4.2.2
McCabe's Cyclomatic
Complexity
Rreshta
Komenti(coment
lines)
Metodat e numrimit
38
39
Kjo matje mbulimi arrin 100% kur t gjitha inputet e mundshme t funksioneve dhe
vlerat e kthimit jan testuar (p.sh t gjithe parametrat e funksioneve jan kaluar, dhe t gjitha
vlerat e mundshme t kthimit jan thirrur t paktn njher t vetme).
Kshtuq, pr t testuar metodn Date.toString() na nevojitet vetm nj rast testimi pr t
mbuluar 100% testin e FEEC: pra nj dat e vlefshme pr tu br print.
System.out.println(DateParser.parseDate("2014.11.15"));
Duke par mbulimin e kodit t kryer nga testi FEEC mund t shohim se ekzistojn vetm
pak rreshta t cilt nuk jan mbuluar, kshtuq metoda e mposhtme prcakton 5 raste t tjera
testuese t cilat duke zgjeruar 2 testet e mparshme mund t mbulojn testin C0 n nivel 100%:
private static void statementCoverageTest_C0(){
System.out.println(DateParser.parseDate("199.11.15"));
System.out.println(DateParser.parseDate("20.11.15"));
System.out.println(DateParser.parseDate("2.5.1"));
System.out.println(DateParser.parseDate("2013.00.11"));
System.out.println(DateParser.parseDate(".01.11"));
}
Kshtuq 3 rastet e para testuese n kt metod shrbejn pr t mbuluar rrjeshtat deklarativ n
metodn Date.toString(), t cilt nuk ishin mbuluar nga rasti i rregullt testues i mparshm q
konsistonte n dhnien si input t dats (testi FEEC msipr).
logeve
SOTA:
statementCoverageTest_C0.log
Duke par diagramen CFG, ne mund te nxjerrim ne pah kushtezimet atomike te cilat nuk
kane mbulim 100%:
-dita>31 ishte prher e vrtet, kshtuq duhet ta vlersojme si t pasakt : 2013.05.32
-muaji>12 ska qen asnjher e vrtet, pra duhet ta vlersojm testin e sakt: 2013.14.11
-Si prfundim , neve na duhet nj test q t vlersojm viti<0 si t sakt, gj q duket e
pamundur, duke qen se viti fillon viti=0 dhe programi nuk e njeh - si shenj.
Por pastaj e kuptojm q kur testojm vitin me nj vler t madhe, n mnyr q shumzimi i
vit = vit * 10 + Integer.parseInt(chr); do t gjeneronte mbiderdhje dhe viti mund t merrte disa
vlera negative. Kshtuq si prfundim, si zgjerim i rasteve testuese t mparshme, kemi shtuar
metodn e mposhtme me 3 raste testuese:
private static void simpleConditionCoverage_c2(){
System.out.println(DateParser.parseDate("2013.05.32"));
System.out.println(DateParser.parseDate("9999999999999999999999.10.32"));
System.out.println(DateParser.parseDate("2013.14.11")); // month>12
42
Testi MCDC pretendon t jet m preiz sesa testi MMCC, sepse na duhet t testojm
nse ndryshimi i nj kushti atomik ka impakt mbi vlersimin kompleks t kushtit apo jo. Duke
par n skemn e CFG n kt faze, ne kemi mbulim t ult t MCDC n kto kushte:
- (!errorFree | day < 1 | day > 31)
- (chr.equals(".") & whereAmI.equals("month"))
Kshtuq kemi zgjeruar rastet tona testuese me metodat e mposhtme te cilat
prmbajne 3 teste te tjera:
private static void modifiedConditionDecisionCoverage_MCDC(){
System.out.println(DateParser.parseDate("2013.05.0"));
System.out.println(DateParser.parseDate("2013.14_11"));
System.out.println(DateParser.parseDate("2013.05.11."));
}
Testi i par vlerson day<1 si t sakt, vlern e dyt e vlersojm chr.equals(.)
si t pasakt dhe rasti i tret vlerson whereAmI.equals(month) si t pasakt. Me kto tre
raste t tjera ne mund t prmbushim mbulimin e MCDC n nivel 100%.
Emri i skedarit te logeve SOTA: modifiedConditionDecisionCoverage_MCDC.log
43
Day<1
True
True
Day>31
True
True
Dita nuk mund t jet m e vogl se 1 dhe m e madhe se 31 n t njejtn koh, kshtuq ne
kemi mbuluar 5/8. Ekziston vetm nj kombinim q nuk sht mbuluar, i cili mund t testohet
nga metoda n vijim:
public static void multipleConditionCoverage_c3(){
System.out.println(DateParser.parseDate("2013.9.999."));
}
44
N rastin e klass Date testi BI sht i thjesht, sepse kemi 4 mundsi pikash hyrje n
bllokun e par (q sht year<10, year<100, year<1000, etj). Pr secilen nga kto 4 mundsi, ne
mund ti kombinojm ato me (month<10, muaj t tjer) dhe pastaj ti kombinojm srish me
(day<10, dit t tjera). Kshtuq, n total kemi 4*2*2=16 raste t mundshme testuese, prderisa
nuk kemi asnj cikl t mbyllur. Duke prjashtuar rastet studimore t cilat jan prdorur mpar,
marrim:
System.out.println(DateParser.parseDate("2013.5.11"));
System.out.println(DateParser.parseDate("2013.5.2"));
System.out.println(DateParser.parseDate("2013.11.2"));
System.out.println(DateParser.parseDate("222.5.11"));
System.out.println(DateParser.parseDate("222.5.2"));
System.out.println(DateParser.parseDate("222.11.2"));
System.out.println(DateParser.parseDate("22.5.11"));
System.out.println(DateParser.parseDate("22.5.2"));
System.out.println(DateParser.parseDate("22.11.2"));
System.out.println(DateParser.parseDate("2.5.11"));
System.out.println(DateParser.parseDate("2.11.11"));
System.out.println(DateParser.parseDate("2.11.2"));
Ve ksaj, ne mund t gjykojm n t njjtn mnyr si bm me funksionin
DateParser.parseDate(). sht paksa e komplikuar prderisa kemi nj cikl t mbyllur:
1. Cikli nuk ekzekutohet,
2. Cikli ekzekutohet vetm njher t vetme,
3. Cikli prsritet vetm njher t vetme
45
boundaryInteriorPath_BI.log
uditrisht, mbulimi pr kt test sht shum i ult, 43,96%. Edhe pse testi BI ka nj
mbulim shum t mir me 85,59% q do t thot se shum nga pathet e mundshme jan vizituar
tashm, testi MBI sht shum i ult prap se prap. Pr m tepr, numri i rasteve testuese
aktualisht sht rritur pak, kshtuq po t shtonim raste t tjera testuese shtes rrit koston dhe
kohn pr t aplikuar kto teste. Kshtuq prfundimisht ne po pranojm vlern 43,96% si nj
mbulim t mir pr kt test.
46
Testi
FEEC
C0
C1
C2
Mbulimi Nr.
Testimeve
100%
2
100%
5
100%
0
100%
3
Emri metods
functionIOCoverage_feec
statementCoverageTest_C0
simpleConditionCoverage_c2
functionIOCoverage_feec.log
statementCoverageTest_C0.log
simpleConditionCoverage_c2.l
og
MMCC 100%
MCDC 100%
0
3
modifiedConditionDecisionCov
erage_MCDC
modifiedConditionDecisionCo
verage_MCDC.log
C3
90.91%
multipleConditionCoverage_c3
MBI
BI
43.96%
85.89%
0
121
boundaryInteriorPath_BI
multipleConditionCoverage_c
3.log
boundaryInteriorPath_BI.log
47
Software-i nn testim
48
6.2.1
Rezultatet e CCCC
a. Metoda: error(int,int,int)
Metoda
error(int,int,int)
LOC
34
MVG
57
MVG
Ne e dim se kompleksiteti iklomatik prdoret pr t treguar kompleksitetin e nj programi. Ai
mat direkt numrin e rrugve lineare t pavarura n nj kod burim t nj programi. Nga tabela
shohim se MVG sht 57, q tregon nj vler t lart. Por duke marr n konsiderat
49
LOC
4
MVG
0
MVG
Nga tabela mund t shohim se rezultatet e lloagritura nga CCCC tregojn se MVG sht 0 sepse
kjo sht nj metod e thjesht dhe nuk ka fjal kye ose operator q t rrisin kompleksitetin.
LOC
Rezultati i marr nga CCCC sht 4. sht nj vler e vogl dhe nuk shkakton kompleksitet,
kshtu q sht nj metod e qart dhe e thjesht pr tu kuptuar.
6.2.2
Rezultatet e SOTA
a. Metoda: error(int,int,int)
Metoda
error(int,int,int)
LOC
39
MVG
29
MVG
Bazuar tek prkufizimi i MVG dhe tek formula: v(G) = e n + 2 (e numri i degve, n - numri i
nyjeve), ne mund ta llogarisim vlern e msiprme: v(G) = 89 -62 + 2 = 29.
Vlera e llogaritur nga CCCC sht m e madhe se v(G). Kjo ndodh sepse switch-i me 28 case rrit
kompleksiteti e ksaj metode.
LOC
Rezultati i llogaritur nga SOTA sht 39, kurse rezultati i marr nga CCCC sht m i vogl. Kjo
ndodh pr arsye se CCCC nuk llogarit hapsirat midis rreshtave dhe komentet. Pavarsisht ksaj
t dyja vlerat nuk jan t larta dhe nuk tregojn kompleksitet n rreshtat e kodit.
Si prfundim mund t themi se kjo metod sht e thjesht pr tu kuptuar dhe lexuar. Gjithashtu
sht e leht pr tu zhvilluar, testuar dhe riimplementuar.
b. Metoda: symbolError(int,int,int)
50
LOC
3
MVG
1
MVG
Bazuar n metodn e CFG, kjo metod ka 1 deg dhe 2 nyje, kshtu vlera MVG sht v(G) = 1
2 + 2 = 1.
Kjo vler sht m e vogl se 10, e cila sht vlera e rekomanduar, prandaj mund t themi se
metoda nuk ka kompleksitet. Vlera nga CCCC sht m e vogl sepse kjo metod nuk prmban
cikle apo kushte.
LOC
Rezultati i llogaritur nga SOTA sht 3 dhe ky sht nj rezultat i pritshm. Rezultati i marr nga
CCCC sht m i madh, por n t dyja rastet metoda sht e qart, e thjesht pr tu kuptuar, e
thjesht pr tu zhvilluar dhe riimplementuar.
c. Metoda: ioError()
Metoda
ioError()
LOC
3
MVG
1
MVG
Njsoj si metoda symbolError, kjo metod ka 1 deg dhe 2 nyje, me nj vler t MVG prej: v(G)
= 1 2 + 2 = 1. Kjo vler sht nj njsi m e madhe se vlera e llogaritur nga CCCC dhe sht
m e vogl se vlera e rekomanduar 10. Si prfundim mund t themi se sht nj metod pa
komleksitet.
LOC
Rezultati i SOTA sht 2 dhe ky sht rezultati q ne prisnim sepse ka vet 2 rreshta kod.
Rezultati i CCCC sht m i madh se sa rezultati i SOTA, por t dyja vlerat jan t vogla dhe
nuk tregojn kompleksitet. Metoda sht e qart dhe e thjesht pr tu kuptuar. Gjithashtu e leht
pr tu zhvilluar dhe testuar.
6.3 Scaner.java
Kjo klas implementon komponenten leksikore t kompilatorit. N figurn 24 jepen vlerat
e metrikave t llogaritura nga CCCC pr metodat (Scanner, charIsAlpha, charIsDigit, comment,
getLine, getPos, getSymbol, handleIdentifier, main, number, readNextChar). N figurn 25 jepen
vlerat e llogaritura nga SOTA.
51
Nga figura shohim se disa nga metodat jan t ngjyrosura (t kuqe dhe t verdha), q do t thot
se se ato kan kompleksitet t teprt. Vlerat e tjera q nuk jan t ngjyrosura tregojn se MVG
dhe LOC jan larg vlers maksimale t rekomanduar dhe metodat prkatse nuk jan komplekse.
Ato jan t thjeshta pr tu kuptuar, lexuar, zhvilluar dhe testuar. Interesi yn sht analiza dhe
krahasimi i vlerave pr metodat e ngjyrosura.
52
6.3.1
Rezultatet e CCCC
a. Metoda: getSymbol()
Metoda
getSymbol
LOC
78
MVG
45
MVG
Rezultati i llogaritur nga CCCC sht m i lart se sa kufiri i rekomanduar. Me kt mund t
themi se metoda sht komplekse dhe jo shum e sigurt.
LOC
Jan 78 rreshta, e cila sht nj vler e lart. Kjo vler tregon pr nj kompleksitet t lart t
rreshtave t kodit.
b. Metoda: handleIdentifier()
Metoda
handleIdentifier()
LOC
22
MVG
19
MVG
Vlera e MVG sht 19 dhe sht nj vler m e madhe se sa kufiri i lejuar. Kjo do t thot se
kemi t bjm me nj metod komplekse.
53
Rezultatet e SOTA
a. Metoda: getSymbol()
Metoda
getSymbol()
LOC
78
MVG
27
MVG
Kjo metod ka 99 deg dhe 74 nyje, kshtu vlera e MVG sht: v(G) = 99 74 + 2 = 27. Kjo
sht vlera e llogaritur nga SOTA dhe sht m e madhe se vlera maksimale. Prandaj metoda
sht komplekse dhe jo e sigurt.
Shohim se ka shum diferenc midis vlerave t llogaritura nga SOTA dhe CCCC. Bazuar tek
implementimi shohim se arsyeja e ktij kompleksiteti t lart dhe ndryshimit midis dy vlerave
sht switch-i me shum case dhe disa if-else brenda switch-it. Pr m tepr switch-i sht i
vendosur brenda nj cikli.
LOC
Vlera e llogaritur nga SOTA sht 78 dhe sht e njjt me vlern e llogaritur nga
CCCC. Kjo sht nj vler e lart q tregon edhe nj kompleksitet t lart t kodit. Kjo do t
thot se metoda ka probleme me qartsin, sht e vshtir pr tu kuptuar dhe me gabime.
Gjithashtu nuk sht e leht pr tu zhvilluar si metod.
b. Metoda: handleIdentifier()
Metoda
handleIdentifier()
LOC
21
MVG
20
MVG
Kjo metod ka 97 deg dhe 79 nyje. Vlera e MVG sht: v(G) = 97 79 + 2 = 20. Ky rezultat
sht m i lart se vlera maksimale e prcaktuar q do t thot se metoda sht komplekse.
Shohim se vlera e llogarir nga SOTA sht nj njsi m e madhe se sa ajo e llogaritur nga
CCCC. Kjo ndodh sepse jan 19 kushte t llogaritura nga CCCC. Duke marr parasysh
implementimin e ksaj metode, vme re se jan 20 rrug t mundshme sipas if-else, e cila e
54
LOC
70
MVG
12
MVG
Kjo metod ka 47 deg dhe 37 nyje. Vlera e MVG sht: v(G) = 47 37 + 2 = 12. Kjo vler nuk
sht shum larg nga vlera kufi e prcaktuar. Prandaj mund t themi se kjo metod nuk sht
shum komplekse. Krahasuar me CCCC sht nj vler 2 njsi m e vogl.
Pr m tepr, bazuar tek implementimi kjo metod ka shum cikle dhe kushte if-else. Kjo na
shtyn q t presim nj kompleksitet m t madh se sa ai i rekomanduar.
LOC
Rezultati i SOTA sht 4 her m i madh se sa ai i marr nga CCCC sepse CCCC nuk merr n
konsiderat hapsirat midis rreshtave dhe komentet. T dyja vlerat jan t larta dhe tregojn pr
kompleksitet n kod. Gjithashtu bazuar tek implementimi vm re se kjo metod ka shum
rreshta kod dhe asnj koment. Kjo do t thot se kodi nuk sht i qart, sht i vshtir pr tu
kuptuar, zhvilluar dhe riimplementuar.
55
Klasa: Error.java
57
6.4.2
Nga llogaritjet e bra u vu re se ka disa vlera t tjera interesante t matura nga CCCC.
Jan dy metoda error(int,int,int) nga klasa Error.java dhe number() nga klasa Scanner.java q
kan rezultate t ngjyrosura pr dy metrikat L_C dhe M_C.
L_C = rreshta kodi pr rreshta komenti. Tregon densitetin e komenteve n respekt t prmass s
tekstit n program.
M_C = MVG pr rreshta komenti. Tregon densitetin e komenteve n respekt t kompleksitetit
logjik n program.
Metodat
error(int,int,int)
number()
L_C
11,333
7,333
M_C
19,000
1,556
L_C = 34 / 3 = 11,333
58
59
61
63
64
65
66
67
68
69
70
71
72
break;
break;
break;
break;
73
break;
break;
break;
}
}
}
viewScan.update(currentSymbol); //1//
return currentSymbol;
}
/**Tries to identify in the given String a keyword.
If it is a keyword, the corresponding object will be returned.
Otherwise, the returned object represents an Identifier covering its name.
@see Symbol
@see SymbolIdent
@return if Keyword found, return it, otherwise SymbolIdent
*/
private Symbol handleIdentifier(String identifier) {
if (identifier == "AND") return new Symbol(ANDSY);
else if (identifier.compareTo("DIV"
else if (identifier.compareTo("OR"
else if (identifier.compareTo("NOT"
else if (identifier.compareTo("CONST"
else if (identifier.compareTo("TYPE"
else if (identifier.compareTo("VAR"
74
else if (identifier.compareTo("THEN"
else if (identifier.compareTo("ELSE"
else if (identifier.compareTo("WHILE"
else if (identifier.compareTo("DO"
else if (identifier.compareTo("FOR"
else if (identifier.compareTo("END"
}
/** Tries to identify a number: either as an integer or as a floating point number
@see SymbolIntcon
@see SymbolRealcon
@return SymbolIntcon- or SymbolRealcon object
*/
private Symbol number() {
final int maxInt
= 2147483647;
= true;
integerMantisse;
double realMantisse;
int
exponent
= 0;
75
expCounter
int
expSign
= -1;
= 1;
76
77
78
}
do {c = scan.getSymbol();
System.out.println(c);
} while (c.getTyp() != EOP);
}}
// syntactical errors
79
80
81
82
83
84
85
86
88