Differenze tra progettazione per contratto e programmazione difensiva


Risposte:


30

Il Design by Contract e la programmazione difensiva sono in qualche modo opposti l'uno all'altro: in DbC, definisci i contratti tra collaboratori e programmi presupponendo che i collaboratori rispettino i loro contratti. Nella programmazione difensiva, programmi in base al presupposto che i tuoi collaboratori violino i loro contratti.

Una vera routine di radice quadrata scritta in stile DbC affermerebbe nel suo contratto che non è consentito passare un numero negativo e quindi semplicemente supporre che non possa mai incontrare un numero negativo. Una vera routine di radice quadrata scritta in modo difensivo presuppone che venga superato un numero negativo e prende le dovute precauzioni.

Nota: è ovviamente possibile che in DbC qualcun altro controllerà il contratto. In Eiffel, ad esempio, il sistema del contratto verificherebbe un numero negativo in fase di esecuzione e genererebbe un'eccezione appropriata. In Spec #, il teorema proverà verificare la presenza di numeri negativi al momento della compilazione e fallirà la compilazione, se non può provare che alla routine non verrà mai passato un numero negativo. La differenza è che il programmatore non effettua questo controllo.


7

Designing by Contract (DbC) potrebbe essere un modo per programmare in modo difensivo?

Sì.

La "programmazione difensiva" è spesso una scusa per perdere tempo. Spesso si perde tempo a controllare le cose che causeranno eccezioni ordinarie. Invece delle eccezioni, vengono scritte istruzioni IF aggiuntive anziché clausole di gestione delle eccezioni.

Definisci il contratto ed eseguilo.

Quando qualcuno viola il contratto, il programma, nel normale corso degli eventi, romperà e solleverà normali eccezioni che possono essere normalmente gestite.

"Programmazione difensiva" e "Prevenzione errori" possono aggiungere errori (poiché i controlli di prevenzione errori sono essi stessi errati) piuttosto che prevenire errori.

La gestione delle eccezioni può mettere a tacere, registrare e gestire un'eccezione molto meglio della "Programmazione difensiva".


6
La programmazione difensiva è più che una semplice affermazione. Include revisioni del codice, analisi statiche, audit di sicurezza, linee guida per la codifica sicura e altro. Inoltre, l'uso delle eccezioni e la gestione delle eccezioni (invece di lasciare semplicemente il programma in crash e masterizzare) è considerato una tecnica di programmazione difensiva.
Thomas Owens

2
@ThomasOwens: Sembra "Buon sviluppo software". Ho sempre visto la programmazione difensiva usata come una scusa per scrivere molte dichiarazioni IF (o asserzioni) che falliscono prima che vengano sollevate eccezioni. Non definirei la tua lunga lista di idee davvero valide "Programmazione difensiva". Chiamerei la tua lista di buone idee "Programmazione". In questo modo possiamo separare lo spreco di tempo da tutte le cose intelligenti che elenchi.
S.Lott

2
Preferisco chiamare quelle "buone idee quando scrivo codice", ma quando mi hanno insegnato la programmazione difensiva, mi è stato insegnato che si riferiva a tutte le tecniche con lo scopo preciso di garantire la sicurezza, la sicurezza e l'affidabilità di un sistema . Forse è una definizione troppo ampia, o forse è una definizione sbagliata, ma è ciò che mi è stato insegnato. Ho visto la gente chiamare se dichiarazioni e asserzioni "programmazione difensiva", ma in base alla definizione che mi è stata insegnata, non la definirei tale (tranne nei casi in cui non hai necessariamente opzioni migliori, come le eccezioni).
Thomas Owens

@ThomasOwens: "Forse è una definizione troppo ampia". Essere d'accordo. Sembra una grande lista di buone idee.
S.Lott

2
-1: Non vedo come DbC sia un modo di programmare in modo difensivo, sono sostanzialmente opposti. Dubito che sia comune fare programmi difensivi solo per perdere tempo. E 'possibile dimostrare di aggiungere errori' necessita di una citazione perché non è affatto ovvio.
Segna il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.