Perché l'onere della prova deve rimanere al chiamante e non al metodo della classe che viene chiamata?

3

Michael Perry afferma nel suo corso Pluralsight su Provable Code (solo abbonamento per trascrizione) che:

[T]he burden of proof rests with the caller

In un contratto di codice, perché l'onere della prova deve rimanere al chiamante e non al metodo della classe che viene chiamata? Questa è una convenzione preferita o ha una base più solida? Al momento è come un dogma per me dato che la classe chiamata potrebbe eseguire i propri controlli di sicurezza, il che ridurrebbe la duplicazione del codice chiamante.

    
posta CarneyCode 31.12.2012 - 10:54
fonte

4 risposte

8

Direi che "onere della prova" è il modo sbagliato di pensarci. Una classe con un contratto di chiamata può e dovrebbe convalidare che il contratto è tenuto dai chiamanti. Ma quando non lo è, tutto ciò che può fare è produrre un errore / eccezione.

Il punto del contratto è quello di indicare chiaramente cosa deve fare il codice chiamante per produrre un programma correttamente funzionante, in modo che non ci siano errori / eccezioni . Quando un contratto di codice non viene mantenuto, si tratta di un errore di programmazione. Rendere esplicito il contratto ti aiuta ad evitare l'errore.

Se sei serio sui contratti di codice, vuoi una lingua in cui siano applicati dal compilatore il più possibile.

    
risposta data 31.12.2012 - 11:28
fonte
1

Questo perché è il chiamante quello che passa i parametri.

Il chiamante può passare parametri errati, quindi deve controllare le eccezioni lanciate dal callee (o codici err).

    
risposta data 31.12.2012 - 14:54
fonte
1

Per quanto ricordo, "Non incolpare me, stavo solo seguendo gli ordini" fu respinto come difesa a Norimberga.

Quindi rigetterei la difesa che "Non incolpare il mio codice, è stata la spazzatura che è stata data". Ciò non rende il software sicuro, sicuro o affidabile.

Come tale, mentre è responsabilità del chiamante fornire dati corretti al metodo, dovrebbe anche incombere sul metodo per convalidare i suoi input e gestire in modo sicuro tutte le condizioni di errore.

Ricorda, la maggior parte degli exploit ci sono perché il software non convalida i suoi input ....

    
risposta data 31.12.2012 - 17:07
fonte
0

Pensaci in questo modo. Supponiamo di avere un'app Web in cui un campo è l'SSN dell'utente. Prendi qualunque tipo di utente, rimuovi qualsiasi valore non intero e chiama getName (int), che restituisce il loro nome. Ha più senso avere getName () lanciare un'eccezione arg illegale quando l'utente inserisce un valore illegale, o la tua app web deve prima validare il valore inserito?

Convalidi sempre il più vicino possibile ai dati.

    
risposta data 31.12.2012 - 19:18
fonte

Leggi altre domande sui tag