G. Mecca – Università della Basilicata – mecca@unibas.it
Programmazione Procedurale in Linguaggio C++
Sottoprogrammi Parte 6
Metodologia di Sviluppo - b
versione 2.3
Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)
2
Sommario
m
Ricapitolando
m
Tecniche di Test
m
Linee Guida per la Scrittura del Codice
Sottoprogrammi: Metodologia di Sviluppo >> Sommario
G. Mecca - Programmazione Procedurale in Linguaggio C++ 3
Ricapitolando
m
In sintesi, ci sono buone e cattive notizie
m
Buone notizie
ðil metodo suggerito aiuta concretamente ad affrontare la soluzione di problemi complessi ðsequenza di passi sistematica
ðcentrata sulla scrittura del codice
m
Cattive notizie
ðnon rappresenta di per sé la soluzione a tutti i problemi
Ricapitolando
m
Il metodo è utile
ðnella soluzione di problemi “standard”
ðche rappresentano la maggioranza dei casi
m
Ma, per essere un ottimo programmatore
ðoccorre anche essere “creativi”ðessere in grado di concepire soluzioni a volte originali a problemi meno usuali
Sottoprogrammi: Metodologia di Sviluppo >> Ricapitolando
G. Mecca - Programmazione Procedurale in Linguaggio C++ 5
Ricapitolando
m
Statisticamente, al giorno d’oggi
ðil 90% circa del software sviluppato al giorno d’oggi è software client-server
ðcon una logica applicativa molto semplice (interfaccia utente per sistemi di basi di dati) ðcompetenze standard
m
Il resto del software
ðapplicazioni particolari che richiedono seria riflessione dal punto di vista della soluzione
Sottoprogrammi: Metodologia di Sviluppo >> Ricapitolando
6
Tecniche di Test e Correzione
m
Dopo la scrittura del codice
ðè necessario condurre le verifiche (test) ðed eliminare gli eventuali errori logici
m
Il metodo tipico di test
ðtest manuale e interattivoðil programmatore esegue manualmente i test ðe verifica che il comportamento sia quello
atteso
Sottoprogrammi: Metodologia di Sviluppo >> Tecniche di Test e Correzione
G. Mecca - Programmazione Procedurale in Linguaggio C++ 7
Tecniche di Test e Correzione
m
Piano dei test
ðè necessario mettere a punto un test per ciascuna condizione tipica di utilizzo del programma
ðche copra anche i casi particolari
m
Nota
ðdopo ogni modifica al codice è necessario ripetere tutto il piano dei test
ðpotrebbero essere stati introdotti errori
Tecniche di Test e Correzione
m
Un esempio
ðsovrapposizione di rettangoli
m
Caratteristiche del problema
ðlogica applicativa complessaðvari raffinamenti nella scelta della soluzione (concepimento della formula)
ðpiano di test elaborati
Sottoprogrammi: Metodologia di Sviluppo >> Tecniche di Test e Correzione
G. Mecca - Programmazione Procedurale in Linguaggio C++ 9
Tecniche di Test e Correzione
Sottoprogrammi: Metodologia di Sviluppo >> Tecniche di Test e Correzione
TEST n. 1
rettangolo 1: (1, 2) – (7, 6) rettangolo 2: (3, 1) – (8, 5)
rettangolo 1: (-2, 3.5) – (3, 5.5) rettangolo 2: (2, 1) – (6.2, 3) sovrapposizione: 12 cm2 sovrapposizione: 0
TEST n. 2
10
Tecniche di Test e Correzione
Sottoprogrammi: Metodologia di Sviluppo >> Tecniche di Test e Correzione
TEST n. 3
rettangolo 1: (-1, 1) – (7, 6) rettangolo 2: (3, 2) – (6, 5)
rettangolo 1: (-2, 1) – (3, 5.5) rettangolo 2: (3, 1) – (7.2, 3) sovrapposizione: 9 cm2 sovrapposizione: 0
TEST n. 4
G. Mecca - Programmazione Procedurale in Linguaggio C++ 11
Tecniche di Test e Correzione
TEST n. 5
rettangolo 1: (-1, 1) – (7, 6) rettangolo 2: (4, 2) – (7, 5)
rettangolo 1: (-2, 3) – (3, 5.5) rettangolo 2: (3, 1) – (7.2, 3) sovrapposizione: 9 cm2 sovrapposizione: 0
TEST n. 6
Tecniche di Test e Correzione
m
Che fare nel caso di errori logici ?
ðtest in cui il codice si comporta in mododiverso da quello atteso
m
In questi casi
ðè necessario capire la causa dell’errore ðcorreggere il codice
ðripetere l’esecuzione del piano dei test
Sottoprogrammi: Metodologia di Sviluppo >> Tecniche di Test e Correzione
G. Mecca - Programmazione Procedurale in Linguaggio C++ 13
Tecniche di Test e Correzione
m
Le tecniche semplici
ðispezione visiva del codice
ðsimulazione su carta del funzionamento ðmetodo delle stampe
m
Metodo delle stampe
ðprevede l’aggiunta di istruzioni di stampa al codice per verificare i valori delle variabili
Sottoprogrammi: Metodologia di Sviluppo >> Tecniche di Test e Correzione
14
Metodo delle Stampe
m
Idea
ðin caso di comportamento scorretto,
aggiungo stampe per la correzione (“debug”) ðstampe che dicono quando comincia ciascun
sottoprogramma
ðstampe dei valori dei parametri e delle variabili, all’inizio, durante e alla fine
ðstampe che dicono quando finisce il sottopr.
ðal termine della correzione elimino le stampe
Sottoprogrammi: Metodologia di Sviluppo >> Tecniche di Test e Correzione
>> indovina1Errori.cpp
G. Mecca - Programmazione Procedurale in Linguaggio C++ 15
Metodo delle Stampe
int scegliNumero() {
cout << “***** inizio scegliNumero *****\n”;
int range;
int numero;
int seed = time(NULL);
srand(seed);
numero = rand() % 200 + 1;
cout << “***** numero = “ << numero << endl;
cout << “***** fine scegliNumero *****\n”;
return numero;
}
Tecniche di Correzione
m
Queste tecniche
ðfunzionano per programmi dalla logica applicativa semplice
ðcon un piano dei test semplici
m
Principale svantaggio
ði test sono eseguiti interattivamente
ðil programmatore è costretto a ripeterli tutte le volte che effettua modifiche
Sottoprogrammi: Metodologia di Sviluppo >> Tecniche di Test e Correzione
G. Mecca - Programmazione Procedurale in Linguaggio C++ 17
Tecniche di Correzione
m
In casi più complessi
ðprogrammi con logica applicativa complessa ðin cui il codice viene sottoposto a frequenti
modifiche
ðè opportuno adottare tecniche alternative ðe strumenti alternativi
m
Test di Regressione (>>)
m
Debugger (>>)
Sottoprogrammi: Metodologia di Sviluppo >> Tecniche di Test e Correzione
18
Linee Guida per Scrivere il Codice
m
Obiettivo
ðscrivere codice di qualità
m
Qualità del codice, in ordine di importanza
ðcorrettezza (sintattica e semantica)ðusabilità (facilità ed efficacia nell’uso) ðmanutenibilità (facilità di adattamento ai
cambiamenti)
ðefficienza (consente di risolvere i problemi più rapidamente)
Sottoprogrammi: Metodologia di Sviluppo >> Linee Guida
G. Mecca - Programmazione Procedurale in Linguaggio C++ 19
Linee Guida per Scrivere il Codice
m
Qualità accessorie
ðche contribuiscono ad ottenere quelle principali
m
In questa lezione
ðsemplicitàðleggibilità
ðmodularità, ovvero buona organizzazione
Semplicità e Leggibilità
m
Linea guida n. 1
ðadottare sempre la soluzione più semplice tra quelle che potrebbero funzionare
ðnon complicare mai inutilmente il codice
m
In generale
ðla prima soluzione ad un problema non è mai la migliore
ðconviene migliorarla e renderla più generale
Sottoprogrammi: Metodologia di Sviluppo >> Linee Guida
G. Mecca - Programmazione Procedurale in Linguaggio C++ 21
Semplicità e Leggibilità
m
Linea guida n. 2
ðadottare regole di stile
ðscegliere accuratamente gli identificatori per variabili e sottoprogrammi - notazione
cammello
ðindentare il codice
ðadottare regole per la posizione delle parentesi
ðutilizzare sempre le parentesi
Sottoprogrammi: Metodologia di Sviluppo >> Linee Guida
22
Semplicità e Leggibilità
m
Linea guida n. 3
ðscrivere moduli breviðnel caso di problemi complessi, spezzarli in più passi per frammentare la soluzione
ðil codice di un sottoprogramma non dovrebbe mai richiedere più di 30 secondi per essere interpretato da un altro programmatore
ðdi fatto questo può rendere inutili i commenti ðtranne che nel caso di librerie
Sottoprogrammi: Metodologia di Sviluppo >> Linee Guida
G. Mecca - Programmazione Procedurale in Linguaggio C++ 23
Modularità
m
Linea guida n. 4
ðadottare la metodologia incrementale ðprocedere per raffinamenti successivi
m
Linea guida n. 5
ðcompilare progressivamente e frequentemente il codice
ðverificare progressivamente il codice eseguibile
Modularità
m
Linea guida n. 6
ðragionare accuratamente sui parametri ðscegliere con cura quali e quanti parametri
(evitare parametri inutili)
ðscegliere con cura il tipo dei parametri (standard o per riferimento)
ðadottando le linee guida discusse per la scelta dei parametri
Sottoprogrammi: Metodologia di Sviluppo >> Linee Guida
G. Mecca - Programmazione Procedurale in Linguaggio C++ 25
Modularità
m
Linea guida n. 7
ð“minimizzare l’accoppiamento” tra i sottoprogrammi
ðanalizzare il diagramma delle chiamate ðverificare che la logica applicativa del
programma sia chiara ed ordinata
m
Linea guida n. 8
ðnon utilizzare mai variabili globali
ðè consentito di utilizzare costanti globali
Sottoprogrammi: Metodologia di Sviluppo >> Linee Guida
26
Modularità
m
Linea guida n. 9
ð“massimizzare la coesione” all’interno di un sottoprogramma
ðogni sottoprogramma deve avere una funzione precisa nell’applicazione
ðdeve risolvere un problema ben preciso ðe non fare due o più cose diverse
Sottoprogrammi: Metodologia di Sviluppo >> Linee Guida
G. Mecca - Programmazione Procedurale in Linguaggio C++ 27
Modularità
m
Linea guida n. 10
ðseparare i sottoprogrammi “orientati all’elaborazione” dai sottoprogrammi
“orientati all’interazione con l’utente”
ði secondi (tipicamente chiamati “schermi”) sono meno riutilizzabili, sia nella stessa applicazione che in applicazioni diverse
ði primi dovrebbero essere pensati per essere per quanto possibile riutilizzabili
Modularità
m
Linea guida n. 10 (cont.)
ðogni applicazione dovrebbe avere una collezione di sottoprogrammi per le elaborazione che non interagiscono con l’utente
ðed una collezione di sottoprogrammi per la gestione dell’interazione con l’utente
>> sottoprogrammi di interfaccia
ðle funzionalità dovrebbero essere ben
Sottoprogrammi: Metodologia di Sviluppo >> Linee Guida
G. Mecca - Programmazione Procedurale in Linguaggio C++ 29
Riassumendo
m
Metodologia suggerita
ðper raffinamenti successivim
Tecniche di Test
m
Linee Guida di Carattere Metodologico
ðper la scrittura di codice di qualitàSottoprogrammi: Metodologia di Sviluppo >> Sommario
30
Termini della Licenza
m This work is licensed under the Creative Commons Attribution- ShareAlike License. To view a copy of this license, visit
http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
Termini della Licenza
m Questo lavoro viene concesso in uso secondo i termini della licenza “Attribution-ShareAlike” di Creative Commons. Per ottenere una copia della licenza, è possibile visitare
http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.