Ви б порушили принцип DRY, поставивши, що логіка перевірки скрізь використовується поштовий індекс.
З іншого боку, якщо ви маєте справу з багатьма різними країнами та їх різними системами поштових індексів, це означає, що ви не можете перевірити поштовий індекс, якщо ви не знаєте про цю країну. Тож ваш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, а не провал перевірки. Тому що, якщо ваша логіка вирішила, що результат є від'ємним числом, невдача перевірки означає, що доведеться повторити обчислення, і немає підстав думати, що він з’явиться з іншим числом вдруге.
І якщо все-таки з’явиться інша кількість, це знову приводить вас до підозри, що підрахунок не є послідовним і тому не можна довіряти.
Це не означає, що перевірка не корисна. Але безглузда перевірка погана, як тому, що вона вимагає зусиль, не реально вирішуючи проблему, і надаючи людям помилкове почуття безпеки.