Как вы справляетесь с проверкой данных в модели, используя ColdFusion Model-Glue? - PullRequest
1 голос
/ 03 сентября 2011

В рекомендациях MVC говорится, что модель должна обрабатывать ввод / проверку данных. Допустим, у нас есть модель, которая создает новые учетные записи пользователей со следующими полями и ограничениями:

Username - not null, not already in DB
Password - not null, alphanumeric only
E-mail - not null, not already in DB, valid e-mail format

У нас есть AccountModel с функцией CreateNewUser():

component
{
    public void function CreateNewUser(string username, string password, string email)
    {
        // create account
    }
}

Затем у нас есть контроллер, который обрабатывает сообщение формы и сообщает модели для создания учетной записи:

component
{
    public void function NewUser()
    {
        var username = event.getValue("username");
        var password = event.getValue("password");
        var email = event.getValue("email");

        var accountModel = new AccountModel();
        accountModel.CreateNewUser(username, password, email);

        event.addResult("UserCreated");
}

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

// assumes that ValidateInput() is a function on the controller that returns an array
var validationErrors = ValidateInput(username, password, email);

// if there were any validation errors, return a ValidationError result
if (len(validationErrors)
{
    event.setValue("validationerrors", validationErrors);
    event.addResult("ValidationError");
}
else
{
    event.addResult("UserCreated");
}

И представление извлечет переменную validationerrors и отобразит сообщения об ошибках.

Однако эта логика должна находиться в модели. Как мне это сделать? Я могу придумать два пути:

Метод 1: Перемещение ValidateInput() от контроллера к модели. Теперь контроллер должен сначала вызвать ValidateInput() до CreateNewUser(). Если программист забудет это сделать, CreateNewUser() выдаст исключение проверки. Недостатком этого является то, что теперь для каждой операции с данными, требующей проверки, потребуется блок if / else.

Метод 2: Откажитесь от необходимости звонить ValidateInput() и просто позвоните CreateNewUser() напрямую. Если были какие-либо ошибки проверки, будет выдано исключение, которое будет содержать массив сообщений об ошибках. Этот метод будет работать в C #, но похоже, что ColdFusion не поддерживает возврат данных с исключением, только сообщение об исключении и его тип. Кроме того, каждая операция с данными потребует блока try / catch.

Метод 3: ??

Как бы вы справились с проверкой в ​​этом случае? Является ли метод 1 тем, что делает большинство людей, когда дело доходит до проверки в модели? Или люди обычно используют метод 2? Или есть метод 3, о котором я не думаю?

1 Ответ

0 голосов
/ 03 сентября 2011

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

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

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

Возможно, это немного неортодоксально, но я добавлю метод validateUserData () (или что-то) в мой CFC пользователя, который затем вызывает модель проверки формы, чтобы помочь с проверкой.Это означает, что бизнес-правила для пользователя находятся в одном месте и могут вызываться отдельно.После этого createNewUser () работает по принципу «вход / выход мусора».

Sidenote: createNewUser () - это немного тавтологическое имя, не так ли?Какой другой тип пользователя вы бы создали, кроме нового?Кроме того, если он находится в вашем Account.cfc;это новый пользователь или новая учетная запись, которая создается?Если учетная запись и пользователь не являются синонимами и учетная запись может существовать без пользователя (или наоборот), возможно, вам следует иметь также файл User.cfc.Опять же, этот код, который вы нам дали, может быть просто для иллюстрации, и вы все это охватите.

...