|
emi7oP <a href="http://etyxbsmwlbop.com/">etyxbsmwlbop</a>, [url=http://ejkbnyaqouhe.com/]ejkbnyaqouhe[/url], [link=http://iytqgxxmxvee.com/]iytqgxxmxvee[/link], http://ddjproogyauv.com/ |
DesignByContractDesign by contractAutori: Vincenzo Manzoni, Andrea Rota Sommario
Introduzione al Design by contract come modalità di progettazione del software. Nell'articolo saranno anche introdotti alcuni linguaggi specifici per il Dbc.
IntroduzioneIl Design by contract (o brevemente DBC) è una modalità particolare per la progettazione del software, che vede al centro un contratto tra un "cliente" e un "fornitore". Cosa è un contratto?Un contratto è un accordo tra un cliente e un contrattore (o fornitore). Il contratto ha alcune peculiarità:
L'oggetto del contratto per noi sarà il software; il contratto potrà essere stipulato sulla classe o sul singolo metodo. Stipulare un contratto sul software significa crare un doppio vincolo fra chi scrive il software e chi lo utilizza.
Gli obblighi del cliente diventano vantaggi per il fornitore e viceversa. Sostanzialmente la stipula del contratto aiuta il programmatore a ridurre la complessità dei casi d'uso del suo software, sgravandolo da responsabilità qualora il suo prodotto sia usato non correttamente e aiuta il cliente ad usare correttamente il software. La scrittura dei vincoli viene fatta usando predicati logici. Esempio PrecondizioniLa domanda che un programmatore si pone spesso è: "Devo controllare che gli input passati dall'utente siano corretti?". La risposta che la tecnica DBC dà è: "No, il controllo delle precondizioni è responsabilità del cliente". Nel caso presentato nell'esempio precedente, il cliente avrebbe dovuto scrivere: if(numero>=0){
fattNumero = fattoriale(numero);
} else {
// azione di segnalazione/correttiva
printf("Il numero inserito è negativo!");
}
Le precondizioni possono essere più o meno restrittive; ecco un breve elenco di esempi di vincoli ordinati per restrittività:
PostcondizioniLe postcondizioni vanno valutate esclusivamente alla fine della computazione. InvariantiSono condizioni che devono valere dalla creazione dell'oggetto alla sua morte e sono riferite a proprietà caratteristiche dell'oggetto. Ad esempio se l'oggetto è un orologio, il contatore delle ore dovrà essere compreso fra 0 e 23 e il contatore dei minuti fra 0 e 59. Vantaggi nell'utilizzo dei contrattiEsistono dei vantaggi nell'utilizzo dei contratti:
A questi si aggiungono anche dei vantaggi tecnici non indifferenti:
Linguaggi per il DBCEsistono vari linguaggi che permettono di usare tecniche DBC per la modellazione e la scrittura del codice; fra questi ricordiamo Gnu Nana, Jml, Eiffel e le JDK 1.4 assertions. Gnu NanaGNU Nana è una libreria libera che fornisce un supporto al controllo delle asserzioni e al logging per i compilatori GNU C e GNU C++. Fornisce l'implementazione di alcune idee di Eiffel, VDM, Z e Anna in GNU C/C++. (Liberamente tradotto da http://www.gnu.org/software/nana/nana.html) Esempio int square_root(int x)
/*@
assume x>0;
return y>0,
y<=x*x,
y<(x+1)*(x+1);
@*/
dove JMLVedere l'articolo JML di Giorgio e Vincenzo. EiffelE' un vero e proprio linguaggio di programmazione che contiene istruzioni per la gestione delle precondizioni, delle post condizioni e degli invarianti. Ecco un esempio: -- classe che modella un conto bancario class CONTOBANCARIO disponibilità: INTEGER disponibilità_min: INTEGER is 1000 -- costruttore make (versamento_iniziale: INTEGER) is do disponibilità:=versamento_iniziale end -- precondizioni sul costruttore require pre1: versamento_iniziale>=disponibilità_min -- postcondizioni sul costruttore ensure post1: disponibilità=versamento_iniziale JDK 1.4 AssertionPermettono di annegare nel codice Java dei controlli che vengono eseguiti a runtime: la sintassi è: assert(condizioni) ad esempio public int fattoriale(int n) {
assert(n>0);
...
}
Se le condizioni non si verificano l'assert fallisce: differentemente dalle eccezioni, il meccanismo delle JDK Assertion può essere spento quando si ha sufficiente fiducia nel codice: in questo modo il codice viene eseguito più rapidamente. Gli svantaggi delle JDK Assertion è che non dispongono di una semantica propria (se non quella mutuata da Java), non sono visibili direttamente dall'interfaccia e non è possibile distinguere se una assert riguarda una precondizione, una postcondizione o un invariante. Le JDK Assertion inoltre non dispongono di un meccanismo di documentazione. Risorse in rete
|