Drugi wariant sprawia, że jestem zaskoczony. Kiedy patrzę tylko na podpis, zastanawiam się, czy pole jest już znane jako nieważne? Czy też najpierw zostanie sprawdzony (jak się nazywa validatingField
), aby sprawdzić, czy jest naprawdę nieważny? Więc to nie tylko zbędne informacje tutaj, dodatkowe informacje wydają się nieco mylące. Ten rodzaj „jasności” nie jest wyraźniejszy, wręcz przeciwnie.
Właściwie, kiedy zobaczyłem twoją pierwszą funkcję, również mnie to zaskoczyło. Zadałem sobie pytanie, dlaczego, do cholery, twoja funkcja zajmuje tylko pole, ale potem go nie używa i szuka innego w invalidFields
? Szukanie pola wydaje się mieć dużo więcej sensu, gdy podana jest tylko nazwa pola, jak poniżej:
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 })
}
}
Myślę jednak, że Bob Martin prawdopodobnie poszedłby o krok dalej i uczyniłby kod bardziej szczegółowym - dla większej przejrzystości - w innym kierunku. Typowe refaktoryzacja w stylu książki „Czysty kod” prawdopodobnie wyglądałoby tak:
addInvalidField (fieldname, message) {
const foundField = findInvalidField(fieldName)
addMessageForInvalidField(foundField,message)
}
z trzema dodatkowymi funkcjami
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)
}
Dyskusyjne jest, jeśli opłaca się posunąć się tak daleko za zasadą pojedynczej odpowiedzialności. Ma w rzeczywistości pewne zalety i wady. Moim osobistym punktem widzenia jest to, że oryginalny kod jest „wystarczająco czysty” dla większości kodu produkcyjnego, ale kod zrestrukturyzowany jest lepszy.
Kiedy wiedziałem, że muszę dodać coś do pierwszego wariantu, aby rosło coraz bardziej, wcześniej podzieliłem to na mniejsze funkcje, aby kod nawet nie zaczął się bałaganić.