Шаблоны проектирования OO для проверки
Я нахожусь в процессе написания некоторого кода проверки на основе этих предположений:
- Код проверки должен быть во внешнем классе
- то есть. класс данных не содержит его собственной проверки
- Тот же объект может быть проверен по-разному
- например. проверять только синтаксис; проверять результаты поиска БД; проверять дубликаты; и т.д.
- Выход проверки может отличаться в зависимости от того, что ему нужно
- например. выводит одно сообщение об ошибке; выводит список всех ошибок проверки; аналогично, но в формате JSON и включая коды ошибок; и т.д.
Какую комбинацию шаблонов проектирования OO лучше всего решить? A factory может быть хорошим способом получить конкретный валидатор, но являются ли их лучшие подходы?
Ответы
Ответ 1
Один размер не подходит всем! Сделайте это простым!
Предоставлять валидаторы с общими методами/интерфейсами для вывода данных, категоризировать предупреждения, фильтры/уведомления о процессах, возникающие более одного раза. Не создавайте сложный способ проверки, по крайней мере, не до написания нескольких реальных валидаторов.
Откажитесь от пути и дайте валидаторам делать то, что они должны делать:
for validator in all_validators:
validator.validate(model)
Ответ 2
Я думаю, что сейчас делаю то же самое.
Шаблон, который здесь применяется, - это шаблон фильтра и цепочка фильтров.
Каждый фильтр проверяет один "путь" (как вы их называете).
Сначала для синтаксиса, второй для поиска Db и т.д. (Со второго пуля).
Ответ 3
У меня была такая же проблема, и я нашел шаблон посетителя действительно эффективным для развязки логики проверки с объекта данных. Вам нужно будет измерить иерархию классов данных с помощью методов accept (guest), но если вы строите все, что достаточно просто. Даже если вы используете стороннюю иерархию без поддержки посетителей, вы можете создавать обертки, которые предоставляют дерево обхода принятия, и это довольно близко к тому, чтобы иметь метод внутри класса.
Для выполнения различной проверки вы реализуете другой класс проверки и передаете его методу accept на корневом объекте. Мне также удалось создать других пользователей утилиты вокруг модели, которые позволили мне создать посетителя-генератора, который заполнял все поля выборочными/случайными данными. Я с ума сходил с ума, потому что был так взволнован. Вы, наверное, можете сказать, что я все еще в восторге от этого, особенно с тем, чтобы изменить, чтобы рассказать об этом другому.
Ответ 4
Если вы выполняете какую-либо работу с графическим интерфейсом, вы должны взглянуть на проверку JGoodies: http://www.jgoodies.com/downloads/libraries.html (также некоторые статьи здесь: www.jgoodies.com/articles/).
Я бы создал валидатор для любого класса, который нуждается в проверке. Фактически вы можете создать несколько валидаторов, если вам нужны разные способы проверки, например. строго или нет. Вы можете группировать общие функции и методы в такие классы, как AbstractValidator и ValidationResult (у которых может быть список ошибок, серьезность и т.д.).
Будьте осторожны с чрезмерным дизайном. Попробуйте начать с чего-то простого:
new UserValidator().validate(user)
или для проверки вида:
new UserPanelValidator().validate(userPanel)
Однако это зависит от вашей архитектуры. Например, если вы автоматически распространяете входные данные из представления в домене, вам не нужно делать столько проверок на уровне представления.