2013-08-19 5 views
16

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

Я опубликовал веб-сервис (на котором у меня нет никакого контроля, и я не могу его изменить) из старой системы, и все клиенты используют его. Я получаю запросы от веб-службы, и объект, который я получаю, является очень сложным, но для примера можно сказать, что я получаю объект A от вызова веб-службы, который содержит несколько других объектов, таких как Object B, Object C и т. Д. И т. Д. кроме того, объекты B & C также имеют некоторые примитивные типы данных, а также некоторые другие объекты в них. Моя проблема в том, что я хочу проверить весь объект A (все объекты и суб объекты), какой шаблон дизайна рекомендуется здесь? Во-вторых, основной момент здесь заключается в том, что я могу получить различные типы объектов A из веб-службы. То, что я действительно подразумеваю под разными типами объектов A, заключается в том, что объект A зависит от клиента, то есть некоторые клиенты будут отправлять объект A без заполнения данных в содержащем объекте B или даже частично заполнить объект B, а затем отправить его в Object A . Поэтому я должен проверить объект A на основе клиента (поскольку некоторым клиентам потребуется содержать объект B, некоторые не будут, некоторые потребуют нескольких элементов в объекте B и т. Д.). Таким образом, другими словами, у меня будет место, где я также буду хранить правила проверки для каждого клиента, который скажет мне что-то вроде этого, что клиент ABC хочет, чтобы поле abc в объекте B имело строку типа, а максимальная длина - 25 символов, и это является обязательным для получения данных в этой области.

Некоторые валидаций, которые я хотел бы выполнить это

Проверка полей какого-либо объекта (скажем, объект В) для типов данных, длина конкретной области, это поле, необходимое для этого клиента, или это необязательно и т.д. и т.п. ...

Любой конкретный рабочий пример будет чрезвычайно полезен.

Структура объекта А для данного конкретного примера выглядит следующим образом.

public class A 
    { 
     private B objectB; 
     private C objectC; 
     // and so on 
    } 

    public class B{ 
     private E objectE; 
     private String name; 
     private int age; 
     // and so on 
    } 

    public class C 
    { 
     private F objectF; 
     private String address; 
     private String country; 
    } 

    public class E 
    { 
     // Members here 
    } 

    public class F 
    { 
     // Members here 
    } 

P.S: Я дал произвольные имена классам и членам только для общего понимания. O да, я забыл упомянуть, что я использую java здесь, но это не имеет особого значения, поскольку принципы дизайна или шаблоны могут применяться к любому языку. Надеюсь услышать от вас, ребята, скоро. :)

+1

Валидация может быть проведена различными способами и основана на мнениях. Посмотрите на [Стратегический шаблон] (http://en.wikipedia.org/wiki/Strategy_pattern). – Bart

+0

Можете ли вы порекомендовать любую альтернативу, кроме шаблона стратегии? –

+0

Предлагаю вам использовать комбинацию Visitor и Factory/AbstractFactory. Фабрика может создавать любые классы валидатора по типу клиента со специальными правилами. Посетительский автомобиль проверяет всю структуру с использованием класса валидатора –

ответ

6

Валидация - это проблема перекрестной резки. Существует несколько способов и несколько вариантов дизайна.

В Asp.net это выполняется через атрибуты, в Java Spring это делается с помощью аннотаций, чтобы код был чистым, читабельным и поддерживаемым.

Вы можете найти множество разных подходов, что вам нужно иметь в виду, так это подход этих фреймворков. т.е. поддержание кода, удобочитаемость и чистый код.

Нет серебряной пули. Вы даже можете написать подтверждение в своем коде.

+0

Вы упомянули очень хороший момент здесь (который я полностью забыл), что валидация - это проблема, связанная с перекрестными проблемами. Спасибо за это. Если я напишу код проверки в своих бизнес-объектах или любом объекте, не будет ли он загромождать код? Я думаю, что это нарушит принцип единой ответственности, что вы скажете? –

+1

Да, это так, и поэтому валидация - это проблема, связанная с перекрестными проблемами, так же, как вырубка, иногда вы не можете ее избежать. то, что вам нужно обратить внимание, является правильность вашего кода, чистая, читаемая, не повторяющаяся и поддерживаемая. – DarthVader

+0

Можете ли вы предложить мне шаблон дизайна, отличный от шаблона стратегии? Я стараюсь, чтобы мой код был чистым, читабельным, поддерживаемым, и я следую принципу DRY, но я думаю, что дошел до того, что мне нужно было испачкать руки. :) –

0

Каждый класс должен знать, как проверить себя. Вы можете получить каждый класс из интерфейса (скажем, IValidatable), который имеет метод .Validate(). Когда вы вызываете .Validate() на объекте A, проверяйте его, а затем вызывайте .Validate() для всех детей. Эти дети могут утверждать себя аналогичным образом.

Я думаю, что это действительно простая версия шаблона команды. Вроде.

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

+3

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

+0

Короткий ответ: это зависит. Если вы использовали Domain Driven Design, вы можете проверить все свойства в сеттерах, что, безусловно, было бы безопасным способом сделать это, если вы беспокоитесь о единой ответственности. Я думаю, что, используя сценарий стратегии Validator, вы по-прежнему в безопасности. Валидатор несет ответственность за проверку. на него просто ссылается объект, который он проверяет. –