有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java设计问题:如何将验证检查重构为另一个方法

我有一个巨大的验证方法,我想重构它。这里有一个例子。我已经提供了初步的验证,以及我自己的建议。你认为这是一个很好的重构方法还是有更好的重构方法

谢谢

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) 个答案

  1. # 1 楼答案

    试一试怎么样

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

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

    其中checkRule1()返回异常或null,addWrappedException忽略null

    MyException myException= new MyException();
    checkRule1(myException);
    
  2. # 2 楼答案

    一定要从Replace Method with Method Object开始。这没有风险,你也不应该用这么大的方法来害怕。那么你的方法似乎很好。。。只需确保重命名validateRule1;)

  3. # 3 楼答案

    你可以在这里使用装饰图案。创建一个具有单个方法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");
          }
       }
    }