La segunda variante se ve me deja perplejo. Cuando solo miro la firma, me pregunto si el campo ya se conoce como no válido. ¿O se validará primero (como se le llama validatingField) para averiguar si realmente no es válido? Entonces, esto no es solo información redundante aquí, la información adicional parece ser algo engañosa. Este tipo de "claridad" no es más claro, es todo lo contrario.
En realidad, cuando vi tu primera función, también me dejó perplejo. Me pregunté por qué diablos su función solo toma un campo, pero luego no lo usa y busca otro invalidFields. Buscar un campo parece tener mucho más sentido cuando solo se da un nombre de campo, como este:
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 })
}
}
Sin embargo, creo que Bob Martin probablemente iría un paso más allá y haría que el código sea más detallado, para mayor claridad, en una dirección diferente. Una refactorización típica en la línea del libro "Código limpio" probablemente se vería así:
addInvalidField (fieldname, message) {
const foundField = findInvalidField(fieldName)
addMessageForInvalidField(foundField,message)
}
con tres funciones adicionales
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)
}
Es discutible si vale la pena llegar tan lejos con el principio de responsabilidad única. En realidad tiene algunos pros y contras. Mi punto de vista personal es que el código original es "lo suficientemente limpio" para la mayoría del código de producción, pero el refactorizado es mejor.
Cuando supe que tenía que agregar algo a la primera variante para que creciera más y más, lo dividiría en estas funciones más pequeñas de antemano, para que el código ni siquiera comenzara a convertirse en un desastre.