Вопрос о дизайне: Как я могу реорганизовать проверку проверки в другой метод - PullRequest
0 голосов
/ 18 марта 2011

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

Спасибо

public void validate() {

   MyException myException= new MyException();
   try {
      if (!isRule1()) {
         throw MyException.invalidRule(Rule1);
      }
   }
   catch (MyException e) {
      myException.addWrappedException(e);
   }

   try{
       f (!isRule2()) {
             throw MyException.invalidRule(Rule2);
          }
       }
       catch (MyException e) {
          myException.addWrappedException(e);
   }

   ////continue checking...
}

и вот как я хочу их реорганизовать:

public void validate() {


   MyException myException= new MyException();
   validateRule1(myException);
   validateRule2(myException);
   //continue validating....
}
private void validateRule1(myException){
   try {
      if (!isRule1()) {
         throw MyException.invalidRule(Rule1);
      }
   }
   catch (MyException e) {
      myException.addWrappedException(e);
   }
}
private void validateRule2(myException){
   try {
      if (!isRule2()) {
         throw MyException.invalidRule(Rule2);
      }
   }
   catch (MyException e) {
      myException.addWrappedException(e);
   }
}

Ответы [ 3 ]

2 голосов
/ 18 марта 2011

Вы можете использовать шаблон Декоратор здесь.Создайте интерфейс с единственным методом validate (), а затем создайте разные классы, реализующие этот интерфейс, содержащий код проверки.Затем вы можете вызвать validate для объекта, который вы строите, и это повредит все остальные проверки.

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

Простой пример приведен ниже.

public interface Validator {
  void validate(Object input) throws ValidationException
}

public class ValidationOne implements Validator {
  protected Validator validator;

  public ValidationOne(Validator validator) {
    this.validator = validator;
  }

  public void validate(Object input) throws ValidationException {
    if (validator != null) 
      validator.validate(input);
    // do specific ValidationOne checks
    if (!isValid(input)) throw new ValidationException()
  }
}

public class ValidationTwo implements Validator {
  protected Validator validator;

  public ValidationTwo(Validator validator) {
    this.validator = validator;
  }

  public void validate(Object input) throws ValidationException {
    if (validator != null)
      validator.validate(input);
    // do specific ValidationTwo checks
    if (!isValid(input)) throw new ValidationException()
  }
}


public class Tester {

   public void runValidations(Object obj) {
      Validator validator = new ValidationOne(null);
      validator = new ValidationTwo(validator);
      // continue adding validations as needed
      try {
        validator.validate(obj);
      } catch (ValidationException e) {
        System.err.println("Validation error occurred");
      }
   }
}
1 голос
/ 18 марта 2011

Как насчет попытки

MyException myException= new MyException();
if (!isRule1())
    myException.addWrappedException(MyException.invalidRule(Rule1));

или

MyException myException= new MyException();
myException.addWrappedException(checkRule1());

, где checkRule1 () возвращает исключение или ноль, а addWrappedException игнорирует нули.

или

MyException myException= new MyException();
checkRule1(myException);
0 голосов
/ 21 марта 2011

Определенно начните с Replace Method with Method Object.Это не рискованно, и вы не должны бояться этого таким огромным методом.Тогда ваш подход кажется хорошим ... просто обязательно переименуйте такие вещи как validateRule1;)

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