Die zweite Variante macht mich verwirrt. Wenn ich nur die Signatur betrachte, frage ich mich, ob das Feld bereits als ungültig bekannt ist. Oder wird es zuerst validiert (wie es heißt validatingField
), um herauszufinden, ob es wirklich ungültig ist? Dies sind also nicht nur redundante Informationen, sondern die zusätzlichen Informationen scheinen etwas irreführend zu sein. Diese Art von "Klarheit" ist nicht klarer, es ist das Gegenteil.
Als ich Ihre erste Funktion sah, war ich auch verwirrt. Ich habe mich gefragt, warum zum Teufel nimmt Ihre Funktion nur ein Feld, verwendet es dann aber nicht und sucht nach einem anderen in invalidFields
? Die Suche nach einem Feld scheint viel sinnvoller zu sein, wenn nur ein Feldname angegeben wird:
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 })
}
}
Ich denke jedoch, dass Bob Martin wahrscheinlich noch einen Schritt weiter gehen und den Code - für mehr Klarheit - ausführlicher in eine andere Richtung gestalten würde. Ein typisches Refactoring nach dem Vorbild des Buches "Clean Code" würde wahrscheinlich folgendermaßen aussehen:
addInvalidField (fieldname, message) {
const foundField = findInvalidField(fieldName)
addMessageForInvalidField(foundField,message)
}
mit drei zusätzlichen Funktionen
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 ist fraglich, ob es sich auszahlt, mit dem Prinzip der Einzelverantwortung so weit zu gehen. Es hat tatsächlich einige Vor- und Nachteile. Mein persönlicher Standpunkt ist, dass der ursprüngliche Code für die meisten Produktionscodes "sauber genug" ist, aber der überarbeitete Code ist besser.
Wenn ich wusste, dass ich der ersten Variante etwas hinzufügen musste, damit sie immer größer wurde, teilte ich sie vorher in diese kleineren Funktionen auf, damit der Code nicht einmal zu einem Chaos wird.