Pe lângă scopul său direct, în practică, metricile lungimii programului (3) și lungimea de implementare (2) pot fi folosite pentru a identifica imperfecțiunile de programare. Dacă calculele lungimii programului și durata implementării diferă cu mai mult de zece procente, aceasta indică o prezență posibilă în program a următoarelor șase clase de imperfecțiuni:
Prezența unei secvențe de operatori complementari la același operand, de exemplu A + C-A.
Prezența operatorilor ambigui, de exemplu, A = D și A = C.
Prezența operanzilor sinonimi, de exemplu, A = B și T = B.
Prezența subexprimărilor comune, de exemplu (A + B) C + D (A + B).
O atribuire inutilă, de exemplu C = A + B, dacă variabila C este utilizată o singură dată în program.
expresii Disponibilitatea care nu sunt prezente în formă pliată ca un produs de factori, de exemplu XX + 2XY + YY nu sunt reprezentate ca (X + Y) (X + Y).
Lungimea de implementare N (2) poate fi utilizată pentru a prezice numărul de instrucțiuni reale ale mașinii P folosind expresia
sau mai mult, cu ajutorul inegalității
Ecuația de lucru (9) poate fi utilizată pentru a evalua eficiența economică a utilizării unui anumit limbaj de programare. Reducerea relativă a programării, în funcție de nivelul limbii, este folosită ca indicator al eficacității introducerii limbajului de programare în practica industrială.
Nivelul programului 0≤L≤1 poate fi folosit pentru a evalua complexitatea opțiunilor de implementare pentru un algoritm dat D (cu cât este mai puțină memorie, cu atât este mai greu varianta programului):
Trebuie remarcat faptul că nivelul programului joacă un rol dublu în evaluarea dificultății sau a ușurării înțelegerii acestuia. Un specialist care cunoaște bine limbajul de programare va înțelege programul mai repede, cu cât volumul este mai mic, cu atât este mai mare nivelul. Dar pentru o persoană mai puțin informată în programare, necesită un volum mai mare și un nivel mai scăzut. Se stabilește că pentru orice algoritm descris de diferite limbi, cu o creștere a volumului programului V, nivelul programului L scade în aceeași proporție. Prin urmare, produsul nivelului programului pe volum este o valoare constantă egală cu volumul potențial al implementării acestui algoritm.
L V = V * = const. (20)
În același timp, dacă limbajul nu se schimbă și numai algoritmul se modifică, atunci pentru orice limbă, produsul volumului potențial per program rămâne o constantă egală cu nivelul limbii [14]
L V = = const. (21)
1.3.6 Metrici ale complexității ciclomatice de către McCabe
Indicatorul complexității ciclomatice este unul dintre cei mai comuni indicatori pentru evaluarea complexității proiectelor software. Acest indicator a fost dezvoltat de către omul de știință Mac-Keyb în 1976 se referă la grupul de indicatori pentru evaluarea complexității fluxului de control al programului și se calculează pe baza graficului graficului de flux de control. Acest grafic este construit sub forma unui grafic orientat în care operatorii de calcul sau expresiile sunt reprezentați ca noduri, iar transferul de control între noduri este sub formă de arce.
indicele de complexitate Cyclomatic ne permite nu numai să evalueze complexitatea punerii în aplicare a elementelor individuale ale unui proiect software și să ajusteze evaluarea performanței generale a duratei și a costului proiectului, dar, de asemenea, pentru a evalua riscurile asociate și pentru a lua deciziile de management necesare.
Pentru a calcula numărul ciclomatic McCabe (G), formula este utilizată:
unde m este numărul de arce ale graficului orientat G;
n este numărul de vârfuri;
p este numărul de componente conectate ale graficului.
McCabe folosește următoarea teoremă: într-un grafic puternic conectat G, numărul ciclomatic este egal cu numărul maxim de cicluri liniar independente.
Aplicarea acestei teoreme, numărul de componente ale graficului pot fi văzute ca numărul de arce care trebuie adăugate pentru a converti graful în puternic conectat. Legat strâns este un grafic, ale cărui două noduri sunt reciproc atinse. Pentru grafice corecte programe, t. E. Graficele fără imposibil de găsit de la punctele de site-uri de intrare și „posterior“, punctele de intrare și de ieșire, grafic puternic conectat se obține în general prin închiderea arcului superior care desemnează sfârșitul programului, în partea de sus, care indică un punct de intrare în acest program.
O formulă simplificată pentru calculul complexității ciclomatice este după cum urmează:
De regulă, operatorii logici nu sunt luați în considerare la calcularea complexității ciclomatice.
În timpul indicele de calcul automat de cyclomatic complexitate simplificată, de obicei, de abordare, potrivit căreia construcția graficului nu se realizează, iar calculul indicelui se bazează pe numărarea numărului de declarații de control logice (dacă este cazul, comutator, etc.) și numărul posibil de căi de execuție Program.
Abordarea generală este de a estima complexitatea programului prin calcularea numărului de căi liniar independente, cyclomatic complexitate (G), precum și controlul programelor mărime prin limitarea (G) și folosind (G) ca bază pentru metodologia de testare. McCabe a constatat că o limită superioară rezonabilă pentru complexitate cyclomatic este 10. În cazul în care programatorii să treacă această frontieră, acestea ar trebui să re-scriere sau program, sau rupe-l în module.
În sensul fizic, numărul ciclomatic pentru fiecare arc m = (v, u) | m∈M a graficului de control, primul vârf (v) este original, iar al doilea (u) este finit. Calea de la un nod la altul vârf al graficului, în cazul în care este format din mai mult de un arc, arcuri descriu vârfurile corespunzătoare secvenței (v, o, ..., u), astfel încât nodul original va fi primul în lista, iar finala - finala. Un contur este un plan mărginit de o cale ciclică, în care vârfurile inițiale și finale ale graficului coincid. Fiecare cale corespunde unei căi care o limitează, conducând de la vârful inițial al graficului la cel finit.
Numărul ciclomatic determină numărul de contururi independente într-un grafic complet conectat și, ca o consecință, numărul de căi diferite care conduc de la vârful inițial la cel final.
În termeni practici, numărul ciclomatic este o măsură a complexității programului și determină numărul de teste suficient pentru testarea prin acoperirea tuturor ramurilor programului.
La evaluarea complexității programului folosind numărul cyclomatic McCabe următoarea regulă: dacă numărul cyclomatic mai mare de zece, are complexitatea excesivă și ar trebui să fie împărțită în părțile sale componente (module independente sau subrutine) cu un număr mai mic cyclomatic.
Indicatorul complexității ciclomatice poate fi calculat pentru modulul, metoda și alte unități structurale ale programului.
Calculul valorile din proiect (și în proiectarea detaliată, este posibil chiar și în acest stadiu, fără a aștepta pentru etapa de codificare) permite timp pentru a identifica cele mai sofisticate, însoțite de riscuri ridicate, unități structurale și să ia măsuri pentru a elimina riscul de a face ajustări.
Să luăm în considerare un exemplu. Să fie un program care citește din simbolurile fluxului de intrare până când simbolul "#" este detectat. Textul programului în Pascal este prezentat în figura 6. Graficul grafic de control al programului este prezentat în figura 7.
Figura 6. Programul de introducere a datelor
Pentru a reprezenta un program sub formă de grafic, sunt necesare anumite înțelegeri cu privire la ce să considerăm un nod de graf, deoarece sintaxa operatorilor în limbile de programare este destul de diversă. În acest caz, sunt luați în considerare numai operatorii executivi, cu excepția operatorilor de descriere a datelor. Este de dorit să se selecteze astfel de forme sintactice de operatori care sunt cel mai potrivite pentru cartografierea de către un nod de grafic. Secțiunile liniare ale programului pot fi înlocuite cu un nod al graficului. În acest sens, utilizarea de grafice sau program de descriere pseudocod poate fi sub formă chiar mai preferată a descrierii programului decât textul într-un limbaj de programare. În orice caz, este de dorit să se transforme secvența echivalentă buclare ramificare declarații, adăugând, dacă este necesar, operatorii însumare (contoare) numărul de iterații la „superior“ sau „inferior“ end.
Figura 7. Graficul de control al programului de intrare
Figura 8. Conversia graficului de control al programului de introducere a datelor într-un grafic complet conectat
Definim numărul ciclomatic McCabe pentru graficul de control al programului prezentat în figura 7. Numărul de margini al graficului este de cinci, numărul de vârfuri este, de asemenea, egal cu cinci, astfel încât numărul ciclomatic este:
Programul de organizare de introducere a datelor, având un grafic de control cu numărul cyclomatic egal cu 2, nu are nici o complexitate inutilă și pentru a testa este suficient pentru a selecta două teste care acoperă ramuri (a, b, c) și (a, u) (Figura 4). Rețineți că vârfurile v și un grafic de control program poate fi combinat, care nu s-ar schimba numărul cyclomatic. Numărul ciclomatic depinde numai de numărul de operatori de control care conțin expresii condiționate (predicate). Complexitatea predicatului nu este luată în considerare. Dacă complică expresia condițională (predicat) în situația programului buclă în timp pentru a organiza introducere de date (Figura 4) prin modificarea antetului
în timp ce (s<>'#') în timp ce (s<>"#" sau s<>'*'), graficul de control și numărul ciclomatic rămân aceleași.
Dacă programul conține numai operatori de ramură (fără operatori de selecție și de comutare), numărul ciclomatic poate fi determinat folosind expresia
unde u este numărul operatorilor de ramificație.
Dacă este necesar, selectați sau comutați operatorii cu ramuri n pot fi considerați operatori de ramificație.
Meritele măsurilor includ simplitatea calculului său și repetabilitatea rezultatului, precum și claritatea și bogăția interpretării. Se constată următoarele neajunsuri: insensibilitatea la dimensiunea software-ului, insensibilitatea la schimbarea structurii software, absența corelației cu structurarea software-ului, absența diferenței dintre modelele Razvilka și Cycle, lipsa sensibilității la ciclurile de cuibărire. Deficiențele măsurii ciclomatice au condus la apariția modificărilor sale, precum și la măsurători fundamentale diferite de complexitate.
Modificări ale indicatorului complexității ciclomatice:
Modificarea complexității ciclomatice - nu ia în considerare fiecare ramificare a operatorului de comutare, ci întregul operator ca întreg.
"Complexitate strictă" a ciclului - include operatori logici.
Un calcul "simplificat" al complexității ciclomatice - presupune calcularea nu pe baza unui grafic, ci pe baza numărării operatorilor de control.
"Complexitate reală" - este definită ca numărul de căi independente pe care programul le suferă în timpul testării;
metrica complexității datelor globale - se calculează ca complexitatea ciclomatică a modulului și crește prin numărul relațiilor cu datele globale.