Чи повинен Перегляд не проводити перевірку?


10

Я читав " У MVC чи повинна обрати модель перевірки? ", Тому що мені було цікаво про те, куди має йти логіка перевірки на веб-сайті MVC. Один рядок у верхній відповіді виглядає так: "контролери повинні обробляти перевірку, моделі повинні обробляти перевірку".

Мені це сподобалось, але мені було цікаво, чому ми не проводимо перевірку даних у Перегляді з кількох причин:

  1. Перегляди зазвичай мають надійну підтримку перевірки (бібліотеки JS, теги HTML5)
  2. Перегляди можуть підтверджуватися локально, зменшуючи мережевий IO
  3. Користувацький інтерфейс вже розроблений з урахуванням типу даних (календарі на дати, спінери на номери), що робить його одним невеликим кроком від перевірки

Перевірка в більш ніж одному місці суперечить концепції MVC про розподіл обов'язків, тому "робити це в обох" видається недоречним. Чи справді перевірка даних лише в контролері є домінуючим підходом?


Проблема тут може бути однією з помилкових дихотомій: немає причин, що ви не можете зробити перевірку в декількох місцях, і думка про ситуацію як "або - або - не" - і те, і інше "може затьмарити ваш погляд (каламбур!) На це питання . Наприклад, проведення певної форми перевірки клієнта на веб-сайті може бути дуже корисним, оскільки користувачі отримують миттєвий зворотній зв'язок, але це також не є надійним, тому воно не може бути єдиним підтвердженням.
Майлз Рут

Відповіді:


10

Я не думаю, що існує єдине місце, куди можна сказати, що вся перевірка повинна пройти. Це тому, що у нас є кілька різних конкуруючих стратегій програмування, які працюють разом на стандартному веб-сайті asp.net mvc.

По-перше, у нас є ідея розділити логіку домену на моделі, логіку "дії" на контролери та відображення на вигляд. Це ґрунтується на ідеї, що вся логіка відбуватиметься на сервері, а браузер просто забезпечує візуалізацію подання.

Потім ми розширюємо Перегляд за допомогою клієнтського javascript. Це настільки просунуто в наші дні, що ідея "однієї сторінки" з Jquery / нокаутом / кутовим є звичайною практикою.

Ця практика може бути еквівалентною написанню цілої програми на стороні клієнта, яка сама реалізує шаблон MVC або MVVM. Ми видаляємо подання на об'єкт передачі даних та контролер на кінцеву точку обслуговування. Переміщення всієї логіки бізнесу та інтерфейсу користувача до клієнта.

Це може забезпечити кращу роботу користувачів, але вам доведеться довіряти клієнту, який по суті є недовірливим. Тому вам все-таки потрібно виконати логіку перевірки на сервері, незалежно від того, наскільки добре ваш клієнт попередньо підтверджує його запити.

Крім того, у нас часто є вимоги до перевірки, які не може виконувати клієнт. напр. "це мій новий ідентифікатор унікальний?"

Будь-яке додаток, яке ви створюєте з метою надання найкращого досвіду / продуктивності, обов'язково запозичить для декількох парадигм програмування та піде на них компроміси для досягнення своєї мети.


4
+1 та підкреслити: ніколи не довіряйте даним, розміщеним клієнтом. Колись.
Мачадо

Як я це прочитав: "Перевірка не є ізольованою концепцією - всі частини вашої заявки повинні бути затверджені одна проти одної в різних контекстах". Має сенс, навіть якщо більше працювати.
WannabeCoder

так, але також: "у вас можуть бути два (або більше) додатків, які відповідають різним зразкам"
Ewan,

" den · i · grat : Критикуйте несправедливо; зневажайте. " Я не думаю, що ви правильно вживаєте це слово. Хоча відповідь інакше, хоча.
kdbanman

ні, це те, що я мав на увазі
Еван

1

Перевірка в більш ніж одному місці суперечить концепції MVC про розподіл обов'язків, тому "робити це в обох" видається недоречним.

Чи може тут розглянути кілька обов'язків щодо перевірки? Як ви сказали у своєму # 3:

Користувацький інтерфейс вже розроблений з урахуванням типу даних (календарі на дати, спінери на номери), що робить його одним невеликим кроком від перевірки

То, можливо, це:

Вид : Перевірка типу введення, формату, вимоги ... перевірка основного вводу користувача, що не має нічого спільного з бізнес-логікою. Ловіть усі ці пухнасті речі, перш ніж ми генеруємо мережевий трафік, зробивши запит сервера.

Модель : підтвердити ділові проблеми даних. Це юридична цінність відповідно до правил бізнесу? Так, це числове значення (ми це переконались у перегляді), але чи має це сенс?

Просто думка.


1

Я припускаю, що вам потрібна перевірка для наполегливості.

Не тільки View, але і модель не повинна обробляти валідацію. Під час моїх днів в ІТ я зрозумів, що DDD - це один із способів переконатися, що ви насправді робите правильно, тобто. класи насправді відповідають за те, якими вони повинні бути.

Дотримуючись дизайну, керованого доменом, ваші моделі включають вашу логіку бізнесу, і це все. Але вони не включають перевірку, чому б і ні?

Припустимо, ви вже настільки далеко, що використовуєте Data Mapperзамість того, Active Recordщоб зберігати доменний рівень. Але все ж ви хочете, щоб моделі були перевірені, тому ви додаєте перевірку до своєї моделі.

interface Validation
{
    public function validate();
}

class ConcreteModel extends MyModel implements Validation
{
    public function validate() { // the validation logic goes here }
}

Логіка перевірки гарантує, що ви можете правильно вставити модель у свою базу даних MySQL ... Мине кілька місяців, і ви вирішите, ви хочете зберігати свої Моделі і в базах даних noSQL, і в базах даних, для яких потрібні інші правила перевірки, ніж MySQL.

Але у вас є проблема, у вас є лише 1 метод перевірки, але вам потрібно перевірити параметр Model2 різними способами.

Моделі повинні робити те, що вони відповідальні , вони повинні піклуватися про вашу логіку бізнесу та робити це добре. Перевірка пов'язана з наполегливістю, а не діловою логікою, отже, перевірка не належить до моделі .

ValidatorНатомість вам слід створити s, який буде приймати модель для перевірки їх конструктора як параметр, реалізувати Validationінтерфейс і використовувати ці Validators для перевірки ваших об'єктів.

interface Validation
{
    public function validate();
}

class MySQLConcreteModelValidator implements Validation
{
    public function __construct(ConcreteModel $model) { }

    public function validate()
    {
        // you validate your model here
    }
}

class RedisConcreteModelValidator implements Validation
{
    public function __construct(ConcreteModel $model) { }

    public function validate()
    {
        // you validate your model with different set of rules here
    }
}

Якщо в будь-який час у майбутньому вирішите, що ви хочете додати інший метод перевірки для іншого шару збереження (оскільки ви вирішили, що Redis і MySQL більше не є способом), ви просто створите інший Validatorі використовуєте свій IoCконтейнер, щоб отримати правильний екземпляр на вашому config.


1

Для багатьох розробників вподобаний метод жирних моделей проти Stupid Ugly Controllers .

Основна концепція в тексті є

... Тому завжди пам’ятайте, що Модель - це не лише база даних. Навіть отримані дані від веб-служб можуть бути виражені як модель! Так, навіть Атом годує! Каркаси, які стримують вступ до Моделі, майже ніколи не пояснюють цю передову, що лише посилює непорозуміння.

і

Перегляд повинен стосуватися лише створення та представлення інтерфейсу користувача, щоб користувачі могли передавати наміри моделі . Контролери - це оркестрові організації, які переводять входи інтерфейсу користувача в дії на Моделі та передають зворотній вихід з будь-якої точки зору, про яку було відомо про представлення Моделі. Контролери повинні визначати поведінку програми тільки в тому сенсі, що вони відображають введення користувача на виклики в Моделях, але поза цією роллю повинно бути зрозуміло, що вся інша логіка програми міститься в Моделі. Контролери - це істоти з низьким кодом, які просто встановлюють сцену і дозволяють речам працювати організовано.

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

Під час взяття на облік особи кожна особа повинна мати унікальний ідентифікаційний номер, вказаний країною. Ця перевірка (як правило) проводиться за допомогою UNIQUEперевірки ключами в базі даних. Кожен вказаний ідентифікаційний номер повинен відповідати деяким крокам контролю (сума непарних цифр повинна бути дорівнює сумі парних цифр тощо). Цей тип контролю повинен виконуватиModel

Контролер збирає дані з них Modelі передає їх Viewабо реверсує, збирає дані користувача Viewі передає їх Model. Будь-яке обмеження доступу до даних та їх перевірки не повинно робити Controller. Саме Controllerхто збирає дані файлів cookie, саме він Modelперевіряє, чи це дійсний сеанс чи користувач має доступ до цієї частини програми.

View- це інтерфейс користувача, який збирає дані від користувача або представляє дані користувачеві. Прості перевірки можуть бути виконані Viewподібною адресою електронної пошти користувача, яка вводиться, чи ні (таким чином це також можна зробити в IMO).

Перегляд - це клієнтська сторона, і ви не повинні підштовхувати користувацькі дані. Яваскрипти можуть не запускатися на стороні клієнта, користувач може використовувати рукописні скрипти для їх зміни або відключення сценарію за допомогою браузера. Ви можете встановити сценарії перевірки на стороні клієнта, але ніколи не слід їх натягувати і робити реальну перевірку Modelшару.


Підкреслимо лише те, що точка зору, що стосується лише інтерфейсу користувача, не означає, що він не може виконати певну форму перевірки - надання миттєвого зворотного зв’язку користувачам, коли вони помиляються, насправді є важливою частиною того, чому сценарії на стороні клієнта - це корисно, в контексті MVC, застосованого до веб-сайтів.
Майлз Рут

@MilesRout насправді я маю на увазі, що з, Simple checks can be done by the View like the user input e-mail address or not можливо, це не так зрозуміло. Але те, що ви сказали, для мене також справедливо, прості та легкі перевірки можна зробити легко.
FallenAngel

Я з вами не погоджувався.
Майлз Руут

0

Перегляди повинні виконувати перевірки для цілей ff:

  1. ) Перевірка на передньому кінці може зменшити трафік даних на вашому сервері.
  2. ) він обробляє недійсні дані, перш ніж він зможе подорожувати на вашому сервері.
  3. ) якщо ви хочете підвищити рівень безпеки, комбінація переднього та заднього кінців краще.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.