Sarei tanto difensivo quanto devi essere. Un po 'ambiguo, immagino di sì, ma proverò a spiegare.
Quando hai ragione su un metodo, se quel metodo ha parametri di input devi prendere la decisione su cosa ti aspetti da quei parametri. In situazioni e luoghi all'interno di un'applicazione questo sarà diverso. Ad esempio, se un metodo o parte di codice accetta dati da un input dell'utente, vorresti coprire tutto il codice base e gestire qualsiasi input di conseguenza, sia tramite un messaggio di errore che con un buon modo di visualizzare dati inaccettabili.
Se il metodo è un idem esposto API. Non puoi controllare ciò che sta arrivando, quindi dovresti provare a coprire tutti gli aspetti e programmare di conseguenza.
Per i metodi che sono prodotti all'interno del core engine del tuo progetto, qui hai una decisione da prendere. Presumo che i dati in arrivo siano stati pre-selezionati e convalidati prima di arrivare o se dovessi effettuare i controlli necessari. Immagino che questo dipenda dal livello concettuale del metodo e se questo è un posto accettabile da verificare. Quindi le cose che potrei considerare sono:
1) È questo l'unico posto dove ho bisogno di fare questo controllo? Questa variabile dovrà essere controllata in molti posti diversi per questa condizione. Se è così posso fare il controllo una volta più in alto sulla catena e poi assumere la validità in seguito
2) Ci si aspetta che altri componenti del sistema lavorino con i metodi e le interfacce che scrivo. In tal caso, è possibile controllare le istruzioni di debug assert, eseguire il debug delle eccezioni, commentare i metodi e l'architettura generale del sistema, il risultato desiderato oppure i dati necessitano di verifiche.
3) Quali sono i risultati di fallimento a questo punto nel codice. Farà fallire l'intera cosa? Qualsiasi errore verrà rilevato altrove e verrà rilevato almeno quell'errore.
4) Ha senso mettere un assegno qui? A volte mettendo un controllo su una parte dei possibili dati corrotti, sebbene contribuisca a risolvere il problema a quel punto e non l'errore, potrebbe aiutare a coprirlo. A quel punto potresti passare ore a cercare un altro problema solo per scoprire che il problema reale è stato a causa di un controllo valido dei dati nella catena di eventi che si sono sovrapposti a quello che è stato segnalato all'utente / sviluppatore.
In generale, sono un programmatore difensivo, ma credo anche che con un TDD approfondito e un test di unità appropriato sia possibile inserire gli assegni in codice ai livelli richiesti ed essere sicuri che funzioni come dovrebbe una volta arrivati a qualsiasi sezioni di livello inferiore.