Metriche che valutano caratteristiche interne dei moduli software, quali coesione, accoppiamento e complessità.
Esempi:
Le metriche di coesione di Bieman [Measuring Functional Cohesion, 1994, IEEE Transactions on Software Engineering, Volume 20, Issue 8 (August 1994)] si basano sull’analisi delle funzioni e dei dati elaborati da un modulo, cercando di stabilire se il modulo svolge funzioni che operano sugli stessi dati (buona coesione), oppure su dati disgiunti (scarsa coesione).
La Metrica di accoppiamento proposta da Dhama [H. Dhama, Quantitative Models of Cohesion and Coupling in Software] tiene conto del flusso di dati e di controllo fra i moduli, dell’accoppiamento a variabili globali, e dell’accoppiamento ambientale (mediante fan-in e fan-out) fra moduli.
Le metriche di complessità misurano in vario modo la complessità del Control Flow Graph.
Metrica strutturale relativa al Control Flow Graph di un programma G.
È detta anche Numero Ciclomatico V(G).
Rappresenta la complessità logica del programma e quindi lo sforzo per realizzarlo (o per comprenderlo)
Per programmi strutturati V(G) è uguale al n.ro di predicati aumentato di uno:
V(G) = P + 1
P: n.ro di predicati (semplici ed a due vie) in G
Predicati: decisioni – semplici, ovvero non composte con connettivi logici – in strutture di controllo (if-then-else, repeat-until, whiledo, …);
Rappresentando un programma con il Control Flow Graph, il numero ciclomatico V(G) può essere calcolato nel seguente modo:
V(G) = E – N + 2P
Un altro modo per calcolare V(G) è:
V(G) = numero di aree chiuse del CfG + 1.
La complessità ciclomatica V(G) rappresenta il numero di cammini linearmente indipendenti del Control Flow Graph.
La definizione di “cammini linearmente indipendenti” risiede nella definizione di lineare indipendenza a livello algebrico, estesa ai cammini su grafi orientati.
Ad esempio, una complessità ciclomatica di 5 significa che 5 è il numero massimo di cammini possibili tra loro indipendenti e ogni altro cammino possibile sul grafo si può costruire a partire da uno di quei 5 (vale a dire è una combinazione lineare di uno di essi).
Trovare i 5 cammini indipendenti significa trovare una base per l’insieme di tutti i possibili cammini di un dato grafo G.
In un CFG un cammino si dice indipendente se introduce almeno un nuovo insieme di istruzioni o una nuova decisione, rispetto ad un altro cammino indipendente;
In un CfG un cammino è indipendente se attraversa almeno un arco non ancora percorso dagli altri già considerati.
L’insieme di tutti i cammini linearmente indipendenti di un programma forma i cammini di base.
Tutti gli altri possibili cammini nel CfG sono generati da una combinazione lineare di quelli di base.
Dato un programma, l’insieme dei cammini di base non è unico.
È una metrica dimensionale.
Misura la lunghezza di un programma con il numero di linee di codice.
Esistono diverse possibili definizioni
La definizione più accettata è la seguente:
Una linea di codice è ogni linea di testo di un programma che non sia bianca o un commento, indipendentemente dal numero di istruzioni in essa inclusa. In particolare, tali linee di codice possono contenere intestazioni di unità di programma, dichiarazioni ed istruzioni esecutive.
I commenti sono una parte importante del processo di sviluppo di un programma, per cui ignorarle, e quindi non invogliare il programmatore ad inserirle può essere deleterio; ovviamente I commenti vanno prodotti in modo consistente (e non inseriti all’ultimo solo per motivi di tariffazione).
Alcune misure derivate dalle LOC sono:
Densità di commento = CLOC/LOC
Effort = 5.2*KLOC0.91
con Effort misurato in mesi/uomo.
Vantaggi:
Svantaggi
Le LOC sono utilizzate per misurare indirettamente altri attributi.
Esempi:
Nelle LOC bisognerebbe contare anche tutte le linee di codice non direttamente legate ai prodotti consegnati, ad esempio:
Halstead [Halstead, Elements of Software Science, Elsevier Science Inc, 1977] ha proposto un insieme di metriche per la lunghezza ed il volume di un programma. Basate su:
Si definiscono:
Vocabolario: n=n1+n2
Lunghezza: N=N1+N2 (è una lunghezza concettuale)
Volume: V=N*log2n
Volume V=N*log2n
log2n è il numero di bit necessari per rappresentare il vocabolario;
V è il numero di bit necessari per rappresentare il programma nella sua forma minima, cioè indipendentemente dalla lunghezza dei nomi dei token;
Halstead propose la seguente formula per stimare la lunghezza di un programma in base solo a n1 e n2:
N^=n1 log2n1 + n2 log2n2
Le statistiche effettuate su algoritmi pubblicati sembrano indicare un valore medio dell’errore relativo della stima pari a:
(N-N^)/ N < 10%
Molte altre metriche sono state derivate da Halstead:
Volume potenziale:
in un caso ideale
N1= n1 = 2 (solo due operatori: nome funzione e parentesi);
N2 = n2 (tutti operandi distinti).
V* = (2+n2) log2(2+n2)
É il volume del programma più sintetico nel quale può essere codificato un algoritmo.
Viene usato per introdurre il concetto di Livello di Implementazione.
Livello di implementazione
L=V* / V
maggiore è il volume V minore è L; un algoritmo implementato con un linguaggio di programmazione con basso livello espressivo richiede un maggiore volume.
È possibile approssimare L con L^ = (2*n2)/(n1*N2)
Difficoltà
D=1/L
difficoltà di implementare un algoritmo in un certo linguaggio di programmazione.
Sforzo
E = V*D = V/L = V2/V*
può essere pensato come lo sforzo richiesto per comprendere una implementazione piuttosto che quello per produrla.
Nella storia della misurazione del software il lavoro di Halstead ha avuto dei meriti importanti:
Difetti
Molte metriche proposte in letteratura si riferiscono al processo di testing (es. sforzo, durata, # difetti rilevati…), non alle caratteristiche dei test in sé.
Per progettare ed eseguire l’attività di testing, possono essere utili le metriche del livello analisi, design e codice.
Per prevedere l’impegno delle varie attività di testing si possono usare:
É inoltre possibile relazionare sforzo e durata del testing, errori scoperti e numero di test case prodotti ai FP (per fare stime per analogia).
Binder [Binder, Object Oriented Software Testing, Communications of the ACM, Volume 37, Issue 9 (September 1994)] propone una varietà di metriche per valutare la testabilità di sistemi object oriented.
Le metriche per la manutenzione si occupano di prevedere la complessità del processo di manutenzione;
Dipendono, quindi, dal processo di manutenzione che si va a istanziare.
Ad esempio (Indice di Maturità del Software):
SMI = [MT – (Fa+FC+Fd) ] / MT
Al tendere di SMI a 1 il prodotto tende a stabilizzarsi.
Il tempo medio per produrre una nuova versione del prodotto è correlato a SMI.
Per proporre delle metriche valide, bisogna trovare le relazioni tra entità e metriche.
Tali relazioni devono essere ottenute tramite studi empirici…
si cerca di trovare una legge secondo la quale la misura di un’entità possa essere valutata come funzione delle metriche di attributi direttamente misurabili.
Oppure tramite la costruzione di modelli metrici arbitrari, nei quali le relazioni tra attributi interni ed esterni sono ipotizzati da esperti e successivamente validati.
In [Kan, Metrics and Models in Software Quality Engineering, Second Edition, Addison-Wesley Longman Publishing Co., Inc. Boston] si possono trovare molte indicazioni su come effettuare una campagna di misure e su come validare empiricamente l’efficacia di metriche proposte nella descrizione di dati fattori di qualità.
Molto utile anche il libro di Fenton e Pfleeger [Fenton and Pfleeger, Software Metrics: A Rigorous and Practical approach, Second edition, PWS Publishing Co. Boston, MA, USA, 1998].
Basato sull’idea che per poter misurare con successo occorre:
Il risultato sarà un modello di misurazione a tre livelli (Concettuale, Operazionale, Quantitativo) corrispondenti a Goal/ Questions/ Metrics, ottenuto in tre macro-fasi.
Goals – Obiettivi
Questions – Domande
Quali domande ci permettono di valutare se e fino a che punto gli obiettivi vengono raggiunti?
Esempio di domande:
Q1) Quale è il costo del field test?
Q2) Quali sono I vantaggi?
Metrics – Metriche
Quali metriche consentono di dare risposta alle domande?
Q1)-> M11: Giornate per singolo test
-> M12: Costo per figura professionale
-> M13: Numero di Persone coinvolte
-Q2) -> M21: Numero di errori gravi rilevati
-> M22: Numero di errori lievi rilevati
Goal: Analizzare l'usabilità di un Tool CASE dal punto di vista degli sviluppatori secondo il modello di qualità ISO 9126, per valutarne l'adeguatezza funzionale.
Si costruisce una matrice Goal-Question GQ tale che:
GQij=1 se la j-esima Question contribuisce a valutare il soddisfacimento dell’i-esimo Goal.
Si costruisce una matrice Question-Metrics QM tale che:
QMij=1 se la j-esima Metric contribuisce a rispondere alla i-esima Question.
Si misurano i valori delle metriche Mj.
Si calcolano, indirettamente i valori associati alle questions e da questi i valori associati ai goals.
I valori per le matrici QM e GQ sono spesso ottenuti da questionari compilati dagli esperti dei processi aziendali e dai responsabili della qualità che utilizzano un insieme discreto di valori possibili (poi normalizzati tra 0 e 1).
La difficoltà nell’esecuzione di un GQM sta nella ricerca di matrici che portino a risultati soddisfacenti.
I valori possono essere aggiustati a seguito di osservazioni fatte a posteriori che vadano a correggere delle dipendenze tra question e goal che non siano soddisfacenti;
Dei feedback possono essere ottenuti dall’applicazione dello stesso modello GQM a diversi progetti nell’ambito della stessa azienda e dal confronto dei risultati ottenuti.
2. Ciclo di Vita e Processi Software
3. Processi per lo sviluppo rapido del software
4. Sviluppo Agile del Software
5. Test Driven Development (TDD)
7. Component Based Software Engineering (CBSE): Generalità
8. Component Based Software Engineering (CBSE): Il processo di svi...
9. Ingegneria del Software orientato ai Servizi
10. Ingegnerizzazione dei Servizi
11. I Processi di Manutenzione del Software
12. Reengineering, Refactoring e Reverse Engineering del Software
13. Verifica e Convalida del Software. Richiami e concetti di base ...
14. Tecniche di Testing Dinamico
15. Testing di Sistemi Object Oriented
16. Automazione del testing e Analisi Mutazionale
17. Tecniche di Analisi Statica del codice e il Debugging
18. Stima dei costi nei progetti Software
19. Il Modello COCOMO per la stima dei costi Software – La gestio...
20. Gestione e Miglioramento dei Processi di Produzione del Softwar...
21. La Valutazione della Qualità dei Processi Software – Il Capa...