Durante una revisione del codice, ho suggerito al mio collega di avere parametri discutibili per uno dei suoi metodi. In particolare, i parametri hanno rivelato troppo sui dettagli di implementazione del metodo. Il mio collega ha sostenuto che gli input di un metodo devono rivelare i dettagli di implementazione del metodo, quindi, dove si disegna la linea? Potrei vedere un po 'cosa stava dicendo, ma ho faticato per articolare la distinzione tra "input" e "dettagli di implementazione".
Esempi contrari (sosterrebbe che tutti questi sono OK):
- int Math.abs (int someNumber); // ok per me
- int Math.abs (Integer someNumber); // leggermente interessante per me
- int Math.abs (int someNumber, SignedHelper signedHelper); // SignedHelper è una classe che ti dice se i numeri sono firmati o non firmati. WTF per me.
Cose che ho detto insoddisfacenti per lui:
- Ci si aspetterebbe che Math.abs () esegua un tipo primitivo. Perché dovrebbe essere un capitale-i Integer?
- La presenza di SignedHelper rivela troppo come funziona Math.abs ().
- Ci si aspetterebbe Math.abs () per capire che cos'è un numero firmato: l'utente non dovrebbe aver bisogno di preoccuparsi. Questo è un dettaglio di implementazione.
- La presenza di SignedHelper implica che è possibile passare un'implementazione di SignedHelper che si comporta in modo diverso da quello che ti aspetteresti (che potrebbe essere una possibile caratteristica, suppongo, ma nel nostro caso wasn ' t una domanda o aspettativa a tutti). Questo è sconcertante e solleva domande sui motivi di questo metodo.
- Se facciamo finta che Math.abs () effettivamente usi SignedHelper nella sua implementazione, è meglio testare SignedHelper separatamente che esporlo nei parametri per abilitare l'iniezione di un SignedHelper deriso. (questo era in risposta a una delle sue preoccupazioni, in cui voleva testare solo il codice che utilizzava SignedHelper, piuttosto che testare qualsiasi SignedHelper insieme al codice in questione)
Quindi, come spiegheresti la differenza tra gli input che hanno senso rispetto agli input che non hanno senso? Sento che è polemico ma allo stesso tempo mi piacerebbe essere in grado di articolare qualcosa che per me è ovvio, perché è del tutto possibile che in realtà non ho una buona comprensione.