簡體   English   中英

設計問題:如何將驗證檢查重構為另一種方法

[英]Design Question : How can I refactor a validation check into another method

我有一個很大的驗證方法可以重構。 這是一個例子。 我提供了初始驗證和我自己的建議。 您認為這是重構的好方法還是有更好的重構方法?

謝謝,

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);
   }
}

您可以在此處使用Decorator模式。 創建具有單個方法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");
      }
   }
}

嘗試一下

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);

絕對從使用Replace Method with Method Object開始。 它沒有風險,並且您不應該以如此巨大的方法擔心它。 那么您的方法似乎很好...只需確保重命名諸如validateRule1 ;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM