Проект наследования для интерфейсов Validate - PullRequest
1 голос
/ 08 октября 2008

Я никогда не был так хорош в дизайне, потому что есть так много разных возможностей, и у них у всех есть свои плюсы и минусы, и я никогда не уверен, с кем идти. В любом случае, вот моя проблема, мне нужно, чтобы много разных классов, связанных со свободным доступом, проходили валидацию. Однако некоторым из этих классов потребуется дополнительная информация для проверки. Я хочу иметь метод validate, который можно использовать для проверки объекта, и я хочу определить, можно ли проверить объект с помощью интерфейса, скажем, Validatable. Ниже приведены два основных решения, которые я могу иметь.

interface Validatable {
  public void validate() throws ValidateException;
}
interface Object1Validatable {
  public void validate(Object1Converse converse) throws ValidateException;
}
class Object1 implements Object1Validatable {
  ...
  public void validate() throws ValidateException {
    throw new UnsupportedOperationException();
  }
}
class Object2 implements Validatable {
  ...
  public void validate() throws ValidateException {
    ...
  }
}

Это первое решение, благодаря которому у меня есть общий глобальный интерфейс, который реализует что-то, что можно проверить, и я мог бы использовать validate() для проверки, но Object1 не поддерживает это, так что это своего рода defunc, но Object2 поддерживает его и так может много других классов.

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

interface Object1Validatable {
  public void validate(Object1Converse converse) throws ValidateException;
}
class Object1 implements Object1Validatable {
  ...
  public void validate(Object1Converse converse) throws ValidateException {
    ...
  }
}
interface Object2Validatable {
  public void validate() throws ValidateException;
}
class Object2 implements Object2Validatable {
  ...
  public void validate() throws ValidateException {
    ...
  }
}

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

Ответы [ 4 ]

2 голосов
/ 08 октября 2008

что по этому поводу:

interface Validatable {
  void validate(Validator v);
}

class Object1 implements Validatable{
  void validate(Validator v){
    v.foo
    v.bar
  }
}
class Object1Converse implements Validator{
 //....
}
class Object2 implements Validatable{
  void validate(Validator v){
    //do whatever you need and ingore validator ? 
  }
}

Какое вам дело, если Object2 получает ненужный аргумент? если он способен работать правильно без него, он может просто игнорировать это правильно?

Если вы беспокоитесь о введении ненужной зависимости между object2 и Object1Converse, просто укажите интерфейс для их разделения и используйте его в качестве валидатора.

Теперь я должен добавить, что наличие смешанной модели, в которой у вас есть как объект, способный к самопроверке, так и объект, который нуждается во внешней информации о состоянии для проверки звучит странно.

хотите проиллюстрировать?

0 голосов
/ 08 октября 2008

В качестве простого решения проблемы «может ли объект быть проверен» можно добавить третий интерфейс.

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

Пример:

interface Validateable
{
}

interface EmptyValidateable inherits Validateable //Or is it implements?
{
     void validate() throws ValidateException;
}

interface Objectvalidateable inherits Validateable
{
     void validate(Object validateObj);
}
0 голосов
/ 08 октября 2008

Это в C #, но те же идеи можно реализовать во многих других языках.

public class MyClass {
    //Properties and methods here
}

public class MyClassValidator : IValidator<MyClass> {
    IList<IValidatorError> IValidator.Validate(MyClass obj) {
        //Perform some checks here
    }
}

//...

public void RegisterValidators() {
    Validators.Add<MyClassValidator>();
}

//...

public void PerformSomeLogic() {
    var myobj = new MyClass { };
    //Set some properties, call some methods, etc.
    var v = Validators.Get<MyClass>();
    if(v.GetErrors(myobj).Count() > 0)
        throw new Exception();
    SaveToDatabase(myobj);
}
0 голосов
/ 08 октября 2008

Возможно, проект *1002* * для проверки Apache Commons был бы полезен здесь - либо непосредственно, либо в качестве модели для решения вашей проблемы. У них фактически есть параллельный набор объектов, которые выполняют валидацию - поэтому у объектов нет интерфейса, только наличие / отсутствие связанного валидатора для объекта / класса.

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