Рекомендации о том, как реализовать класс проверки? - PullRequest
0 голосов
/ 20 ноября 2008

Я реализую класс проверки в классическом ASP. Как интерфейс валидации должен взаимодействовать с другими моими классами?

Моя текущая настройка: Методы set класса User вызывают соответствующий метод проверки в классе проверки. Все возникающие ошибки хранятся в User.mError. Например, вот мой метод set для переменной-члена Email в ASP Classic:

Class User
  Property Let Email(EmailInput)
     If (myValidation.isEmail(EmailInput)) then
        mEmail = EmailInput
     Else
        mError = "Invalid Email Address format."
     End If

Мне не нравится, как мне понадобится переменная-член ошибки для каждого объекта, который вызывает мой класс проверки. Предложения по лучшей настройке?

Какие-либо предложения по архитектуре валидации, которые я должен рассмотреть в качестве эталона?

Ответы [ 4 ]

2 голосов
/ 21 ноября 2008

Вам следует попробовать концепцию проверки, используемую в ajaxed (которая является библиотекой AJAX для классического ASP - www.webdevbros.net / ajaxed / ). К сожалению, валидатор будет официально выпущен в версии 2.0, но он уже доступен в SVN - вы можете легко использовать его без всей библиотеки (автономно)

Ajaxed имеет класс под названием validator, который вы можете использовать для проверки ваших бизнес-объектов. Это требует создания метода isValid (), который принимает Validator в качестве аргумента и возвращает, если экземпляр действителен или нет. Метод isValid () вызывается перед сохранением экземпляра. Он выполняет все проверки и заполняет данный валидатор, если что-либо недопустимо.

Пример:

class User
    public firstname
    public lastname

    'validates the user instance
    '- call before save()
    public function isValid(byRef v)
        isValid = true
        if len(firstname) < 5 then
            v.add "firstname", "Firstname must be at least 5 chars long."
            isValid = false
        end if
        if len(lastname) < 5 then
            v.add "lastname", "Lastname must be at least 5 chars long."
            isValid = false
        end if
    end function

    public sub save()
        'do some DB stuff
    end sub
end class

'usage scenario 1 (simple - we just know if valid or not)
set u = new User
if u.isValid(new Validator) then
    u.save()
else
    response.write("User is invalid. some error happend")
end if

'usage scenario 2 (detailed - we have an error summary)
set u = new User
u.firstname = "Michal"
set v = new Validator
if u.isValid(v) then
    u.save()
else
    'the validator offers a helper to create a validation summary
    response.write(v.getErrorSummary("<div><ul>", "<ul/></div>", "<li>", "</li>"))
end if

'usage scenario 3 (we can even validator more users in one go)
set u1 = new User
set u2 = new User
set v = new Validator
u1.isValid(v)
u2.isValid(v)

if v then
    u1.save()
    u2.save()
else
    response.write("something is invalid")
end if

Я использую этот подход уже много лет, и он очень гибкий. Вы можете использовать класс Validator как отдельный, но я бы порекомендовал вам использовать библиотеку ajaxed в целом. Это позволяет вам легче разрабатывать ASP.

0 голосов
/ 20 ноября 2008

Spring имеет собственный шаблон проверки для проверки сложных объектов и возврата нескольких ошибок. Подробно здесь .

0 голосов
/ 21 ноября 2008

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

class Validation
{

    // define the properties for dealing with different type validations
    public static $firstNamePattern = '/[-a-zA-Z0-9._ ]{2,}/';
    public static $lastNamePattern = '/[-a-zA-Z0-9._ ]{2,}/';
    // ... more fields


    public static function validateText($type, $text, $fieldName)
    {
        $pattern = $type."Pattern";
        if ($this->$pattern != '')
        {
            // perfom the validation
            // ...
            return true; // or false
        }
    }

    // other validation methods below
    // ...

}

Затем вы можете вызывать этот метод из любого места (например, при проверке ввода формы).

if (Validation->validateText('firstName', $formFirstName, 'First Name'))
{
    // validation passed
}
else
{
    // validation failed
}

Я прошу прощения за то, что выше написано на PHP, и вопрос был о ASP, но вы меня поняли.

0 голосов
/ 20 ноября 2008

Я бы посоветовал взглянуть на связанные с Validator классы, предоставляемые .net framework.

В вашем случае вы можете иметь класс Validator (в частности EmailValidator), который может иметь метод с именем Validate, который принимает строку и возвращает логическое значение

Вы также можете передать ErrorMessage как один из параметров функции Validate. например


Psuedo Code.

class EmailValidator
...
function Validate(byval EmailAddress as string, optional byval Result as string) as boolean)
..
if (condition success)
result = success
elseif (emailafddress doesnt have @)
result = "invalid email address. missing @"
endif
end function
end class

Вы можете вывести сообщение об ошибке, если хотите контролировать его.

Я приглашаю других ТАК ребят предложить любые недостатки в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...