Является ли проверка формы и проверка бизнеса слишком сложной задачей?

У меня есть вопрос о проверке формы и проверке бизнеса. Я вижу много фреймворков, которые используют какую-то библиотеку проверки формы. Вы отправляете некоторые значения, и библиотека проверяет значения из формы. Если не в порядке, он покажет некоторые ошибки на вашем экране. Если все пойдет по плану, значения будут установлены в объекты домена. Здесь значения будут или, лучше сказать, должны быть подтверждены (снова). Скорее всего та же валидация в валидационной библиотеке. Я знаю 2 PHP-фреймворка с такой конструкцией Zend/Kohana.

Когда я смотрю на программирование и некоторые принципы, такие как Не повторяйтесь (СУХОЙ) и принцип единой ответственности (SRP) - это не лучший способ. Как видите, он проверяется дважды. Почему бы не создать объекты предметной области, которые выполняют фактическую проверку.

Пример: отправлена ​​форма с именем пользователя и электронной почтой. Значения поля имени пользователя и поля электронной почты будут заполнены в 2 разных объектах домена: имя пользователя и адрес электронной почты.

class Username {}
class Email {}

Эти объекты проверяют свои данные и, если они недействительны, создают исключение. Ты согласен? Что вы думаете об этом подходе? Есть ли лучший способ реализовать проверки? Я смущен многими фреймворками/разработчиками, обрабатывающими этот материал. Все они неверны или я что-то упускаю?

Изменить: я знаю, что также должна быть проверка на стороне клиента. На мой взгляд, это другая игра. Если у вас есть какие-то комментарии по этому поводу и способ борьбы с подобными вещами, пожалуйста, предоставьте.


person Robert Cabri    schedule 23.12.2009    source источник


Ответы (6)


Подход, который вы описываете, кажется мне немного чрезмерным. Я вижу, что теоретически это аккуратно и чисто, но мне кажется, что было бы слишком гранулярно отображать данные в практической ситуации, создавая ненужные накладные расходы и множество классов, которые очень мало делают в общей схеме. вещи. Когда я сталкиваюсь с подобными вещами, это начинает немного пахнуть Solution Sprawl. Кроме того, если у вас есть много оболочек для каждого поля вокруг примитивов, у вас есть довольно хорошие шансы на нарушения DRY между вашим классом «AddressLine1» и вашим классом «AddressLine2» и т. д. или слишком сложная иерархия наследования, необходимая для их избежать.

Это похоже на шестую нормальную форму — это теоретически интересно, но если бы вы написали свой код таким образом, вам потребовалось бы очень много времени, чтобы что-то сделать, а обслуживание было бы кошмаром.

person glenatron    schedule 23.12.2009
comment
Можно создавать базовые модели предметной области, которые можно использовать повторно. Например, class Text {}. Очень общий не так ли? и при необходимости создайте более конкретные типы, например class Email {}. Обычно вы называете это своего рода валидатором. Но создание модели предметной области имеет больше смысла, если вы спросите меня. Они оба имеют одинаковую валидацию. Только одна (модель предметной области) принимается другими моделями предметной области. - person Robert Cabri; 23.12.2009
comment
Конечно, можно было бы сделать что-то таким образом, и я не думаю, что это было бы неправильно, но в итоге вы получите такую ​​иерархию наследования: Текст, Текст››Электронная почта, Текст›› Имя, текст ››AddressLine, AddressLine››Country, AddressLine››Zipcode и так далее. Глядя на любой из этих объектов, я ожидаю найти всего несколько строк кода, чтобы отличить их от любого другого класса в этой иерархии и просто с точки зрения облегчения чтения и работы с источником и согласованности с данными. смоделированные, я предпочел бы, чтобы они были в более крупном объекте или двух, которые более точно отображают данные. - person glenatron; 23.12.2009
comment
Хорошо, вы говорите, что один большой объект выполняет проверку. Каким образом вы возвращаете свои ошибки, когда не проверяете? Вы выдаете специальное исключение, есть ли метод проверки, который возвращает какой-то массив с ошибками? Вы не должны возвращать только одну ошибку, если спросите меня. Это нарушает удобство использования - person Robert Cabri; 24.12.2009
comment
Ну, один большой объект или их куча, так, например, у человека может быть несколько адресов, но я не вижу смысла в том, чтобы эти объекты нормализовались дальше уровня нормализации в базе данных — на самом деле отношения между поля могут быть более важными, чем конкретная целостность отдельного поля в некоторых случаях. Это открывает путь к более простому составлению списка проблем проверки, поскольку ваш объект родительского уровня уже выполняет всю проверку самостоятельно. Я, конечно, хотел бы массив, а не один за другим сбои. - person glenatron; 29.12.2009

  • Проверка формы (на стороне клиента) на самом деле предназначена только для удобства использования.
  • Проверка бизнеса — это настоящая проверка

Ваше приложение, вероятно, будет работать без того, что вы называете проверкой формы, оно будет выглядеть хуже для пользователя. Однако бизнес-проверка необходима для предотвращения повреждения данных.

person Fortega    schedule 23.12.2009

Хотя кажется, что принцип DRY нарушается, на самом деле вы проверяете данные на двух разных уровнях — представления и бизнеса; проблемы проверки могут различаться между этими двумя уровнями. На уровне представления вас могут интересовать определенные элементы, связанные с вашим представлением, т. е. в веб-приложении вам может потребоваться вернуть определенное сообщение проверки, содержащее html div, чтобы вы могли правильно отображать ответ ajax.

Кроме того, формы обычно содержат ограничения, связанные с постоянством, такие как отсутствие определенного поля формы как пустого или ограничение размера поля, в то время как бизнес-ограничения могут быть более широкими, т.е. проверка того, может ли покупка отдельным лицом в веб-приложении электронной коммерции быть разрешена путем проверки его прошлых удачных покупок.

Тем не менее, существуют фреймворки, такие как валидатор спящего режима (на java), которые позволяют вам включать метаданные проверки в ваши бизнес-объекты, которые проверяются до их сохранения или когда вы вызываете его API, чтобы сделать это вручную. С его помощью вы можете проверить все свои ограничения в одном месте.

person Fabio Kenji    schedule 23.12.2009
comment
Я не понимаю. Можете ли вы уточнить эту разницу между презентацией и бизнес-проверкой? То, как я это вижу, докажите, что я ошибаюсь, заключается в том, что проверка выполняется, потому что значения входят в домен. так зачем иметь разные типы проверки. да, вы можете определить базовую/примитивную проверку на стороне клиента, например, требуемую и тому подобное, но проверку бизнеса? - person Robert Cabri; 23.12.2009
comment
Я думал о ситуациях, когда ваше представление не представляет вашу модель прямым образом; предположим, что у вас есть форма с флажком и двумя переключателями, если флажок включен, вам необходимо проверить ввод с помощью переключателей - это сценарий, строго связанный с вашим представлением. Но вы делаете хорошее замечание. Я еще раз подумал об этом, и в большинстве случаев форма и деловая проверка совпадают; Например, rails отображает формы на основе вашей модели, а также проверяет ее. В этом подходе вам необходимо преобразовать любые нарушения ограничений на вашем бизнес-уровне в ваше представление. - person Fabio Kenji; 23.12.2009

Если вы также используете объекты бизнес-домена для проверки формы, что может быть достигнуто с помощью довольно простых инструментов, это устраняет недостатки большинства решений, основанных на валидаторе. В некотором смысле вы хотите экстраполировать частичное поведение из области бизнеса в область формы; это должно уменьшить код и улучшить обслуживание за счет дополнительной проводки. Я согласен с Робертом. Я чувствую, что этот подход лучше, чем Zend/Cake/Ci и т. д. Кажется, что он идет в направлении философии обнаженных объектов; просто сбросьте V и C, используйте только модели: http://en.wikipedia.org/wiki/Naked_objects

person Gabor de Mooij    schedule 23.12.2009

В Интернете вам, вероятно, нужна какая-то проверка на стороне клиента в качестве «первого входа» — проверьте необходимые значения и другие простые правила проверки, не требуя от пользователя выполнения веб-запроса только для того, чтобы убедиться, что данные недействительны. Кроме того, вам нужен слой проверки на стороне сервера (либо встроенный в объекты домена, либо в уровень службы, либо где-то еще), который выполняет фактическую проверку свойств объекта и других бизнес-правил.
Однако обратите внимание: что правила проверки, зависящие от домена (например, что Name имеет требуемые свойства FirstName и LastName) и чистые бизнес-правила (например, если было предоставлено State, Country должно быть USA) не обязательно должны находиться в одном и том же месте.

person Tomas Aschan    schedule 23.12.2009
comment
Это странно, я думаю. Имя и фамилия являются обязательными свойствами. Это какое-то бизнес-правило имени, верно? Так что такая логика должна быть в названии. Если он не указан, дайте какое-то уведомление (сейчас я говорю о проверке на стороне сервера). И да, если указан штат, страна должна быть США. Это все еще бизнес-логика, верно? или я ошибаюсь. - person Robert Cabri; 23.12.2009
comment
Я бы сказал, что все это бизнес-логика, но некоторые из них — простая проверка свойств, а некоторые — более сложные. Возможно, мой пример был не самым ясным — возьмите другой вместо случая штата/страны: в системе электронной коммерции проверка свойства цены покупки может заключаться в том, что требуется общая цена (проверка объекта домена) и что он соответствует временно сохраненной корзине покупок, связанной с текущим пользователем (чистая бизнес-логика). Оба являются бизнес-логикой, но только один из них может быть выполнен без дополнительных знаний, кроме типа отправленного объекта. - person Tomas Aschan; 25.12.2009

Проверка в обоих местах IS избыточна, но необходима. Вы захотите проверить на клиенте, чтобы у вашего пользователя был лучший опыт работы с пользовательским интерфейсом. Это также снижает нагрузку на ваш сервер. Вы также должны проверить на стороне сервера, так как ваше приложение не должно доверять ничему, что приходит по сети.

person Walter    schedule 23.12.2009
comment
Да, я знаю это. Но во многих фреймворках они вводят проверку формы на стороне сервера. Как и в валидаторах, а не в валидации бизнеса. Что вы думаете об этом? Как вы справляетесь с валидацией на стороне клиента? Как-то экспортируете те же правила? Создать такую ​​же проверку в Javascript? - person Robert Cabri; 23.12.2009