Какой шаблон дизайна использовать для проверки

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

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

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

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

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

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

    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

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

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

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

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

Ответ 2

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

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

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