Вы бы нарушали принцип СУХОГО, помещая эту логику проверки везде, где используется почтовый индекс.
С другой стороны, когда речь идет о многих разных странах и их разных системах почтовых индексов, это означает, что вы не можете проверить почтовый индекс, если не знаете соответствующую страну. Таким образом, ваш ZipCode
класс должен также хранить страну.
Но сохраняете ли вы отдельно страну как часть Address
(которая также является частью почтового индекса) и часть почтового индекса (для проверки)?
- Если вы это сделаете, вы также нарушаете DRY. Даже если вы не называете это СУХОЙ нарушением (потому что каждый экземпляр служит своей цели), он все равно неоправданно занимает дополнительную память, в дополнение к открытию двери для ошибок, когда значения двух стран различаются (что они логически никогда не должны быть).
- Или, наоборот, это приводит к необходимости синхронизировать две точки данных, чтобы гарантировать, что они всегда одинаковы, что предполагает, что вы все равно должны действительно хранить эти данные в одной точке, что наносит ущерб цели.
- Если вы этого не сделаете, то это не
ZipCode
класс, а Address
класс, который снова будет содержать, string ZipCode
что означает, что мы прошли полный круг.
Например, я могу поговорить с бизнес-аналитиком о почтовом индексе вместо строки, содержащей почтовый индекс.
Преимущество заключается в том, что вы можете говорить о них при описании модели предметной области.
Я не понимаю вашего основного утверждения, что когда часть информации имеет заданный тип переменной, вы как-то обязаны упоминать этот тип всякий раз, когда разговариваете с бизнес-аналитиком.
Зачем? Почему вы не можете просто поговорить о «почтовом индексе» и полностью опустить конкретный тип? Какие обсуждения вы ведете со своим бизнес-аналитиком (не техническим!), Когда тип собственности является наиболее важным для разговора?
Откуда я, почтовые индексы всегда числовые. Таким образом, у нас есть выбор, мы можем сохранить его как int
или как string
. Мы склонны использовать строку, потому что нет математических операций с данными, но бизнес-аналитик никогда не говорил мне, что это должна быть строка. Это решение остается за разработчиком (или, возможно, техническим аналитиком, хотя, по моему опыту, они не имеют прямого отношения к мелочам).
Бизнес-аналитик не заботится о типе данных, пока приложение делает то, что оно должно делать.
Валидация - сложная задача, потому что она полагается на то, чего ожидают люди.
С одной стороны, я не согласен с аргументом валидации как способом показать, почему следует избегать примитивной одержимости, потому что я не согласен с тем, что (как универсальная истина) данные всегда должны проверяться всегда.
Например, что если это более сложный поиск? Вместо простой проверки формата, что если ваша проверка влечет за собой обращение к внешнему API и ожидание ответа? Вы действительно хотите заставить свое приложение вызывать этот внешний API для каждого ZipCode
объекта, который вы создаете?
Может быть, это строгое требование бизнеса, и тогда оно, конечно, оправдано. Но это не универсальная правда. Там будет много случаев использования, где это больше бремя, чем решение.
В качестве второго примера, когда вы вводите свой адрес в форму, обычно вы вводите свой почтовый индекс перед вашей страной. Хотя было бы приятно получить немедленную обратную связь для проверки в пользовательском интерфейсе, на самом деле для меня (как пользователя) было бы помехой, если приложение предупредило меня о «неправильном» формате почтового индекса, поскольку реальный источник проблемы (например) заключается в том, что моя страна не является страной, выбранной по умолчанию, и, следовательно, проверка произошла не для той страны.
Это неправильное сообщение об ошибке, которое отвлекает пользователя и вызывает ненужную путаницу.
Точно так же, как вечная проверка не является универсальной правдой, так же как и мои примеры. Это контекстно . Некоторые домены приложений требуют проверки данных превыше всего. Другие домены не ставят валидацию так высоко в списке приоритетов, потому что хлопоты, которые он приносит, конфликтуют с их фактическими приоритетами (например, пользовательским интерфейсом или способностью изначально хранить ошибочные данные, чтобы их можно было исправить, вместо того, чтобы никогда не позволять им быть сохранены)
Дата рождения: отметьте это больше, чем запомните и меньше, чем сегодняшняя дата.
Зарплата: проверьте, что больше или равно нулю.
Проблема с этими проверками заключается в том, что они являются неполными, избыточными или указывают на гораздо большую проблему .
Проверка того, что дата больше, чем разум, является излишней. Ментат буквально означает, что это наименьшая возможная дата. Кроме того, где вы проводите черту актуальности? Какой смысл предотвращать, DateTime.MinDate
но разрешать DateTime.MinDate.AddSeconds(1)
? Вы выбираете определенную ценность, которая не особенно неправильна по сравнению со многими другими ценностями.
Мой день рождения 2 января 1978 года (это не так, но давайте предположим, что это так). Но допустим, что данные в вашем приложении неверны, и вместо этого говорится, что у меня день рождения:
- 1 января 1978 г.
- 1 января 1722 г.
- 1 января 2355
Все эти даты неверны. Ни один из них не является «более правильным», чем другой. Но ваше правило проверки будет только поймать один из этих трех примеров.
Вы также полностью опустили контекст того, как вы используете эти данные. Если это используется, например, в боте с напоминанием о дне рождения, я бы сказал, что проверка бессмысленна, поскольку нет неправильных последствий для заполнения неправильной даты.
С другой стороны, если это правительственные данные и вам нужна дата рождения, чтобы подтвердить личность кого-либо (а невыполнение этого приведет к плохим последствиям, например, к отказу кого-либо в социальном обеспечении), то правильность данных имеет первостепенное значение, и вам необходимо полностью проверить данные. Предлагаемая проверка, которую вы имеете сейчас, не является адекватной.
Для зарплаты есть здравый смысл: она не может быть отрицательной. Но если вы реально ожидаете, что вводятся бессмысленные данные, я бы посоветовал вам изучить источник этих бессмысленных данных. Потому что, если им нельзя доверять ввод чувствительных данных, вы также не можете доверять им ввод правильных данных.
Если вместо этого зарплата рассчитывается по вашему приложению, и каким-то образом можно получить отрицательное (и правильное) число, то лучшим подходом было бы сделать, Math.Max(myValue, 0)
чтобы превратить отрицательные числа в 0, а не проваливать проверку. Потому что, если ваша логика решила, что результатом является отрицательное число, отказ от проверки означает, что ему придется повторить расчет, и нет никаких оснований полагать, что во второй раз он получит другое число.
И если он придет с другим числом, это снова заставит вас подозревать, что расчет не является последовательным и, следовательно, нельзя доверять.
Это не значит, что проверка бесполезна. Но бессмысленная проверка - это плохо, потому что она требует усилий, но в действительности не решает проблему, и дает людям ложное чувство безопасности.