2011-01-31 4 views
7

В нашем приложении мы имеем различные уровни. Уровень обслуживания, уровень и действия DAO (приложения расположений).Наилучшая практика для проверки входных данных для многоуровневого приложения

Данные передаются от одного слоя к другому.

Где мы должны в идеале ввести подтверждение ввода?

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

Теперь, по моему мнению, все, что вам нужно. Нет, где еще он должен быть проверен.

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

Теперь В Dao также, тот же метод привыкания в некоторых других действий и THT не проверки,

Или, скажем уровень услуг, он может быть подвержен, как, скажем, в качестве веб-сервиса, так что также u shd есть проверка.

Так что, по существу, Он предлагает ... у нас есть валидации везде. Это не имеет смысла для меня. Его дублирование по слою.

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

+0

Спасибо всем за ответы. Мой вопрос в том, что может быть уровень программирования. (Может быть, я смешал 2 вещи). Позвольте мне уточнить. Скажем, есть ProcessAction, ProcessService и ProcessDao. Все они имеют createProcess (Str p1, p2, p3 ... pn) Теперь, скажем, у меня есть проверка нулевого значения, чтобы убедиться, что все параметры не равны нулю. Теперь, в чем смысл делать null chec kin все 3 процесса? (Может быть, этот пример помогает, что я пытаюсь спросить) Рамка валидации @Pangea будет работать до тех пор, пока действия, как я буду использовать на уровне сервиса и dao? (Пожалуйста, поправьте меня, если я что-то упустил) –

ответ

10

Согласитесь с Pangea, вы обязательно должны иметь валидации в конечных точках клиента и сервиса.

Я бы добавил, что концепция валидации должна быть «неудачной». Вы добавляете проверки на каждый уровень, чтобы пользователь или вызывающий абонент получал немедленную обратную связь о том, почему вызов завершился неудачно, вместо того, чтобы начать транзакцию, делая сложные запросы и делая запись только для того, чтобы обнаружить, что поле слишком короткое.

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

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

Есть несколько проверок, которые выполняются на уровне базы данных, а также для обеспечения таких функций, как ссылочная целостность и т. Д. Я обычно стараюсь как можно больше проверить их перед попыткой записи, поскольку интерпретация сообщений об ошибках RDBMS и попытка их конвертировать обратно в понятный пользовательский язык часто трудно, если не невозможно.

4

Если ваше приложение предоставляет несколько точек входа (интерфейс или систему для системных интерфейсов или пакетных систем), вы должны очистить (нулевые проверки, проверки формата, требуемые и т. Д.) Ваши данные на всех этих краях и перед этим достигает уровня обслуживания. Но это не означает, что вам нужно повторить свою логику проверки. Вы можете использовать фреймворки, которые позволяют централизовать вашу проверку. Некоторые примерные рамки проверки можно найти в этом документе post.

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

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

1

Единственная мудрость, которую я могу добавить к разговору, никогда не доверяет клиенту. Независимо от того, находится ли ваш клиент в HTML, Flash/Flex или что-то еще, есть вероятность, что кто-то его взломает и попытается сделать то, что вы не хотите, чтобы они делали. Следующее здесь, если есть вероятность, что кто-то собирается его взломать, мы, как разработчики программного обеспечения, должны предположить, что он будет взломан, так что проверки на лицевой стороне хороши и могут помочь в использовании ваших приложений , вы ДОЛЖНЫ проверять все свои входы на задней панели, даже если это приводит к дублированию проверок.