О разработке программного обеспечения: где я должен проверить параметры? - PullRequest
5 голосов
/ 27 февраля 2011

Представьте, что у меня есть приложение, которое запрашивает у пользователя имя, список категорий.Когда пользователь нажимает кнопку «Сохранить», приложение сохраняет имя и категорию в базе данных.

У меня есть слой, который получает имя и категорию из пользовательского интерфейса.Этот слой проверяет, есть ли имя (строка длиной> 0).Если это правильно, имя категории будет передано другому слою.Примечание: категория - это список радиокнопок, в котором всегда выбирается один элемент.

На втором уровне приложение выберет подходящий класс для сохранения имени в зависимости от категории.

На последнем слоекласс сохранит это имя в базе данных.В этом классе я проверю, является ли имя пустым или нет.

Мой вопрос: где находится правильное место для проверки входных параметров метода?на каждом слое?Может быть, я собираюсь использовать эти слои на других разработках.

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

Ответы [ 4 ]

3 голосов
/ 27 февраля 2011

В целом, с точки зрения более крупного вопроса о проверке входных данных, который в конечном итоге сохраняется, лучше всего:

  • Преобразование входных параметров в полностью инкапсулированный бизнес-объект как как можно скорее после получения Это.

  • Проверять рано и быстро проваливать, затем подождите, пока не дойдете до нижнего слоя - трата ресурсов, трата времени, возможно, более сложная ( откат).

  • Проверьте бизнес-логику один раз и сделайте эту часть процесс создания объекта. (но учтите, что проверка логики представления и логики сохранения может потребоваться на других уровнях и отделена от бизнес-логики)

  • Модель, как ваш объект сохраняется используя ORM (например, Hibernate), так что вы могли бы работать исключительно на Уровень объекта в памяти и оставить настойчивость как реализация подробно. Сосредоточить бизнес-логику на слой объекта.

И с точки зрения самой валидации метода, я согласен с Одедом - на каждом уровне, и это должно быть сделано сразу после ввода метода. Опять же, это является частью методологии быстрого провала. Но, как я уже отмечал выше, это не означает, что вы проверяете бизнес-логику на каждом методе (или на каждом уровне). Я просто имею в виду основную практику проверки входных данных (с помощью утверждений или явных проверок и исключений).

3 голосов
/ 27 февраля 2011

где находится правильное место для проверки входных параметров метода? на каждом слое?

Да, на каждом слое. Это называется глубокая защита .

Есть разные причины сделать это на каждом слое:

  • Код пользовательского интерфейса / клиента: поддерживайте адаптацию и избегайте взломов, когда данные неверны
  • Бизнес-уровень: обеспечить соблюдение бизнес-правил
  • Уровень данных: убедитесь, что действительные данные передаются через
2 голосов
/ 27 февраля 2011

Я не согласен с рекомендацией о каждый слой, все время. Это звучит слишком догматично для меня.

Весь дизайн представляет собой выбор между функциональностью и стоимостью. Ваш выбор проверки должен отражать это также.

Я думаю, что ваши решения должны учитывать разделение и повторное использование слоев.

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

В наши дни и в эпоху атак с использованием SQL-инъекций я считаю обязательным обязательное связывание и проверку до достижения уровня сохраняемости. Схема должна делать то, что должна, для обеспечения ссылочной и деловой целостности (например, уникальные ограничения для столбцов и обязательное «не нулевое»), но другие проверки должны быть выполнены до попадания в базу данных.

Если база данных полностью принадлежит одному и только одному приложению, и существует служба, которая является единственным шлюзом для данных, тогда служба может выполнить проверку. Стоимость дублирования проверки на уровне базы данных может быть отменена.

Аналогично между пользовательским интерфейсом и уровнем обслуживания.

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

Ни один производитель не полирует каждую поверхность до зеркального качества. Иногда допускается шероховатая литая поверхность, потому что выгода от шлифовки и полировки незначительна, а стоимость слишком велика.

То же с программным обеспечением.

Мне не нравятся догматические высказывания. Лучше понять последствия вашего выбора. Знайте правила и когда нужно их нарушать.

0 голосов
/ 27 февраля 2011

Если вы собираетесь использовать очень слабую связь, где другие приложения также будут использовать эти же слои, то я бы рекомендовал выполнять проверку ввода на каждом этапе.Поскольку каждый класс / метод не должен знать о ожидании других классов / методов, которые выполнялись перед ним в стеке, каждый из них должен применять свои требования индивидуально.

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