Второй вариант выглядит меня озадаченным. Когда я смотрю только на подпись, мне интересно, является ли поле уже известным как недействительное? Или он будет сначала проверен (как он называется validatingField
), чтобы выяснить, действительно ли он недействителен? Так что это не просто избыточная информация здесь, дополнительная информация, кажется, несколько вводит в заблуждение. Этот вид «ясности» не яснее, а наоборот.
На самом деле, когда я увидел твою первую функцию, я тоже озадачился. Я спросил себя, какого чёрта ваша функция просто берет поле, но потом не использует его и ищет другое invalidFields
? Поиск поля, кажется, имеет больше смысла, когда дается только имя поля, например:
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 })
}
}
Тем не менее, я думаю, что Боб Мартин, вероятно, пошел бы дальше и сделал бы код более подробным - для большей ясности - в другом направлении. Типичный рефакторинг в духе книги «Чистый код», вероятно, будет выглядеть так:
addInvalidField (fieldname, message) {
const foundField = findInvalidField(fieldName)
addMessageForInvalidField(foundField,message)
}
с тремя дополнительными функциями
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)
}
Это спорно, если это окупается идти так далеко с единым принципом ответственности. На самом деле есть плюсы и минусы. Моя личная точка зрения заключается в том, что исходный код является "достаточно чистым" для большей части производственного кода, но переделанный лучше.
Когда я знал, что мне нужно добавить что-то в первый вариант, чтобы оно росло все больше и больше, я заранее разделил его на эти меньшие функции, чтобы код даже не стал беспорядочным.