Где я должен поставить код проверки? - PullRequest
1 голос
/ 11 марта 2010

Я создаю интерфейсы и абстрактные классы, представляющие среду обмена сообщениями для коротких текстовых сообщений, таких как SMS, электронная почта, twitter, xml и т. Д., И мне было интересно, куда мне поместить код проверки сообщения.

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

  • в абстрактном суперклассе «Сообщение», есть абстрактный метод «isValid». Вариант этого заключается в том, что isValid будет вызываться при вызове конструктора Message, создавая исключение MalformedMessageException, если сообщение отформатировано неправильно.

  • на транспортном уровне, непосредственно перед отправкой, проверьте сообщение. Я хотел бы иметь метод send (Message), который вызывает метод isValid (Message) непосредственно перед отправкой.

  • имеет валидатор одноэлементного сообщения со статическим методом isValid (Message), который вызывается в некоторой точке.

Я уверен, что есть другие варианты, которые мне не хватает. В настоящее время я склоняюсь к первому, но мне кажется неправильным иметь проверочный код в том, что должно быть объектом домена.

1 Ответ

0 голосов
/ 11 марта 2010

Послание это одно. Контейнер данных.

Проверка - это отдельная вещь. Валидация отделена от сообщения, потому что проверка зависит от данных, не относящихся к сообщению. Валидация включает в себя один или несколько алгоритмов, которые устанавливают, можно ли построить достоверное Сообщение из некоторых данных.

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

Следовательно, Сообщение не должно содержать никакой логики проверки. Эта логика живет за пределами действительного Послания. Это часть MessageFactory или MessageValiadtor, которая определяет, может ли некоторая заданная лужа данных использоваться для построения действительного Сообщения.

У вас есть две вещи: MessageValidator (или MessageFactory) и Message.

В сообщении нет isValid. Он должен быть действительным или не существовать.

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

Рассмотрим возможные мутации: многовариантные подклассы Message. Валидатор может идентифицировать определенный подкласс. Для реализации этого не требуется никаких изменений приложения.

Несколько валидаторов для особых ситуаций, исключений, расширений и т. Д. Это просто подкласс MessageValidator с тем же интерфейсом, который есть у всех валидаторов, и испускает экземпляр Message (или один из его подклассов).

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

...