L'aspetto della seconda variante mi rende perplesso. Quando guardo solo la firma, mi chiedo se il campo è già noto come non valido? O sarà prima convalidato (come viene chiamato validatingField
), per scoprire se è davvero non valido? Quindi non si tratta solo di informazioni ridondanti qui, ma le informazioni extra sembrano in qualche modo fuorvianti. Questo tipo di "chiarezza" non è più chiaro, è il contrario.
In realtà, quando ho visto la tua prima funzione, mi ha reso perplesso. Mi sono chiesto perché diamine la tua funzione prende semplicemente un campo, ma poi non la usa e ne cerca un'altra invalidFields
? Cercare un campo sembra avere molto più senso quando viene dato solo un fieldname, come questo:
addInvalidField (fieldname, message) {
const foundField = this.invalidFields.find(value => {
return value.name === fieldname
})
const errors = foundField.errors
if (!errors.some(error => error.name === message)) {
errors.push({ name: message, message })
}
}
Tuttavia, immagino che Bob Martin farebbe probabilmente un ulteriore passo avanti e renderebbe il codice più dettagliato - per maggiore chiarezza - in una direzione diversa. Un refactoring tipico sulla falsariga del libro "Clean Code" sarebbe probabilmente simile a questo:
addInvalidField (fieldname, message) {
const foundField = findInvalidField(fieldName)
addMessageForInvalidField(foundField,message)
}
con tre funzioni aggiuntive
findInvalidField(fieldname){
return this.invalidFields.find(value => { return value.name === fieldname })
}
addMessageForInvalidField(field,message){
const errors = field.errors
if (!doesErrorsContain(message)) {
errors.push({ name: message, message })
}
}
doesErrorsContain(message){
return errors.some(error => error.name === message)
}
È discutibile se paga andare così lontano con il principio della responsabilità unica. In realtà ha alcuni pro e contro. Il mio punto di vista personale è che il codice originale è "abbastanza pulito" per la maggior parte del codice di produzione, ma quello refactored è migliore.
Quando sapevo che dovevo aggiungere qualcosa alla prima variante in modo che crescesse sempre di più, lo avrei diviso in anticipo in queste funzioni più piccole, quindi il codice non avrebbe nemmeno iniziato a diventare un disastro.