Где должно происходить преобразование типов для ввода формы - до проверки, как часть проверки или как-то иначе? - PullRequest
0 голосов
/ 21 октября 2011

У меня есть HTML-форма, которая собирает ряд чисел в текстовых полях.

Логически мне нужно сделать следующее, но я не могу придумать, как создать чистую структуру:

  1. Извлечение значений из формы
  2. Проверка того, что строки содержат только числа
  3. Преобразование значений из строк в действительные числа
  4. Проверка того, что каждое число находится вдопустимый диапазон

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

Или у меня есть два метода проверки: первый проверяющий тип, но не изменяющие данные, а второй предполагающий, что типы являютсяправильная и действующая проверка бизнес-правил с функцией мутации между ними, которая запускается, только если проверка типа прошла успешно, и приводит строки к числам.Мне нравится разделение, но это кажется немного сложным.

Я не очень хорошо себя чувствую ни в одном из этих вариантов.Как обычно решается эта проблема?

1 Ответ

1 голос
/ 21 октября 2011

Хмм ... хороший вопрос.

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

// Responsible for mapping string data to an actual FormData instance
public class FormDataMapper
{
    public FormData CreateFormData(string percentText)
    {
        float percent = float.Parse(percent);

        return new FormData(percent);
    }
}

// Responsible for always being in a valid state
public class FormData
{
    public Percent { get; private set; }

    public FormData(float percent)
    {
        if(percent < 0 || percent > 100)
        {
            throw new ArgumentInvalidException("Percent must be between 0 and 100", "percent");
        }

        this.Percent = percent;
    }
}

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

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