Facciamo un passo indietro e usiamo un esempio diverso che calcola la media aritmetica di una matrice di valori.
Se l'array di input è vuoto (o nullo), è possibile soddisfare ragionevolmente la richiesta del chiamante? No. Quali sono le tue opzioni? Bene, potresti:
- presente / restituisce / genera un errore. usando la convenzione del tuo codebase per quella classe di errore.
- documenta che verrà restituito un valore come zero
- documenta che verrà restituito un valore non valido designato (ad es. NaN)
- documenta che verrà restituito un valore magico (ad esempio un valore minimo o massimo per il tipo o qualche valore indicativo).
- dichiara che il risultato non è specificato
- dichiara che l'azione non è definita
- ecc.
Dico di dare loro l'errore se ti hanno dato un input non valido e la richiesta non può essere completata. Intendo un errore grave dal primo giorno in modo che comprendano i requisiti del tuo programma. Dopo tutto, la tua funzione non è in grado di rispondere. Se l'operazione potrebbe fallire (ad esempio copia un file), la tua API dovrebbe dare loro un errore con cui possono gestire.
In questo modo è possibile definire in che modo la libreria gestisce richieste e richieste non valide che potrebbero non riuscire.
È molto importante che il tuo codice sia coerente nel modo in cui gestisce queste classi di errori.
La prossima categoria è decidere in che modo la tua biblioteca gestisce richieste senza senso. Tornando a un esempio simile al tuo, utilizziamo una funzione che determina se esiste un file in un percorso: bool FileExistsAtPath(String)
. Se il client passa una stringa vuota, come gestisci questo scenario? Che ne dici di un array vuoto o nullo passato a void SaveDocuments(Array<Document>)
? Decidi per la tua biblioteca / codice base e essere coerente . Mi capita di considerare questi casi di errori e proibisco ai clienti di fare richieste senza senso segnalandoli come errori (attraverso un'asserzione). Alcune persone resisteranno strongmente a quell'idea / azione. Trovo molto utile questo rilevamento degli errori. È molto utile per individuare i problemi nei programmi, con una buona localizzazione del programma offensivo. I programmi sono molto più chiari e corretti (considera l'evoluzione della tua base di codice) e non bruciano cicli all'interno di funzioni che non fanno nulla. Il codice è più piccolo / pulito in questo modo e i controlli vengono generalmente inviati alle posizioni in cui è possibile che il problema venga introdotto.