A segunda variante parece me deixa intrigada. Quando apenas olho para a assinatura, me pergunto se o campo já é conhecido como sendo inválido. Ou será validado primeiro (como é chamado validatingField
), para descobrir se é realmente inválido? Portanto, essas informações não são apenas redundantes aqui, as informações extras parecem um pouco enganadoras. Esse tipo de "clareza" não é mais claro, é o contrário.
Na verdade, quando vi sua primeira função, fiquei confusa também. Eu me perguntei por que diabos sua função apenas pega um campo, mas depois não o usa e procura por outro invalidFields
? Procurar um campo parece fazer muito mais sentido quando há apenas um nome de campo, assim:
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 })
}
}
No entanto, acho que Bob Martin provavelmente daria um passo adiante e tornaria o código mais detalhado - para maior clareza - em uma direção diferente. Uma refatoração típica ao longo das linhas do livro "Código Limpo" provavelmente se pareceria com isso:
addInvalidField (fieldname, message) {
const foundField = findInvalidField(fieldName)
addMessageForInvalidField(foundField,message)
}
com três funções adicionais
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)
}
É discutível se vale a pena ir tão longe com o princípio da responsabilidade única. Na verdade, existem alguns prós e contras. Meu ponto de vista pessoal é que o código original é "suficientemente limpo" para a maioria dos códigos de produção, mas o refatorado é melhor.
Quando soube que tinha que adicionar algo à primeira variante para que crescesse cada vez mais, dividiria anteriormente essas funções menores, para que o código nem sequer começasse a se tornar uma bagunça.