La seconde variante me rend perplexe. Quand je regarde seulement la signature, je me demande si le champ est déjà connu comme étant invalide? Ou sera-t-il validé en premier (comme on l'appelle validatingField
), pour savoir s'il est vraiment invalide? Il ne s'agit donc pas seulement d'informations redondantes, mais les informations supplémentaires semblent quelque peu trompeuses. Ce genre de "clarté" n'est pas plus clair, c'est le contraire.
En fait, quand j'ai vu votre première fonction, cela m'a aussi rendu perplexe. Je me suis demandé pourquoi diable votre fonction prend-elle simplement un champ, mais ne l'utilise pas et en recherche un autre dans invalidFields
? La recherche d'un champ semble beaucoup plus logique quand il n'y a qu'un nom de champ, comme ceci:
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 })
}
}
Cependant, je suppose que Bob Martin irait probablement plus loin et rendrait le code plus verbeux - pour plus de clarté - dans une direction différente. Un refactoring typique dans le sens du livre "Clean Code" ressemblerait probablement à ceci:
addInvalidField (fieldname, message) {
const foundField = findInvalidField(fieldName)
addMessageForInvalidField(foundField,message)
}
avec trois fonctions supplémentaires
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)
}
Il est discutable s'il est avantageux d'aller aussi loin avec le principe de la responsabilité unique. Il a en fait des avantages et des inconvénients. Mon point de vue personnel est que le code d'origine est "assez propre" pour la plupart des codes de production, mais le refactorisé est meilleur.
Quand je savais que je devais ajouter quelque chose à la première variante pour qu'elle grandisse de plus en plus, je le divisais à l'avance en ces petites fonctions, afin que le code ne commence même pas à devenir un gâchis.