Poiché ciò che conta non è come il codice lo fa, ma cosa fa, prenderebbe in considerazione di avvolgere una funzione con un nome diverso solo per chiarire il suo comportamento in determinate situazioni una buona pratica?
Esempio di vita reale con pseudo-codice:
Diciamo che ho un piccolo modulo per generare segnali hardware. Ora naturalmente ci si aspetta di trovare da qualche parte nell'API una funzione per avviare un segnale una volta che tutte le configurazioni sono state fatte e l'hardware è pronto a sparare:
startSignal(myProperlyConfiguredInstance);
Ora, il mio utente si chiederà naturalmente cosa succede se questa funzione viene chiamata più volte.
- Il codice rileva che il segnale è in esecuzione e ignora la chiamata?
- Genera un'eccezione perché presuppone che sia un errore provare ad avviare il segnale più volte?
- Causa problemi hardware?
- Viene ripristinato l'hardware e viene avviato un nuovo segnale?
La risposta ovvia sembra essere "il comportamento specifico dovrebbe essere presente nel documento", ma sappiamo tutti come la documentazione sembra decadere più velocemente di quanto non lo scriviamo e il codice è migliore di quello della clear doc.
La mia soluzione a questo problema era di fare questo:
void restartSignal(Instance myInstance){
startSignal(myInstance);
}
Ora mi sembra che sia chiaro che il comportamento previsto è il 4 ° punto e il mio utente non deve porsi questa domanda; può semplicemente chiamare il riavvio se il segnale è in esecuzione o se non lo è.
Ma ora ho un codice ridondante che in realtà non complica nulla? Sembra che mi sto ripetendo ed è perfettamente corretto chiamare il riavvio per avviare un segnale di inattività e avviare un segnale in esecuzione!
Quale preferisci? API più ricca rispetto all'API più semplice che richiede un picco nel doc / test / codice sorgente?