优雅的方式来替换多个如果政治家抛出异常



我的应用程序有一个服务,其中 3 个方法执行一些验证,并根据返回的结果抛出不同的异常。

  if (!check1stCondition() {
    throw new ValidationException(message1);
  }
  if (!check2ndCondition)
    throw new ValidationException(message2);
  if (!check3rdCondition)
    throw new ValidationException(message3);
}

我怎样才能重新格式化此代码以便将来可维护?将来可以执行新的检查。

您可以定义一个接口,Checker提供一种方法check在这种情况下引发异常。您的代码可以更改为类似

public interface Checker {
    void check() throws ValidationException;
}
public class YourClass {
   private List<Checker> checkers; // initialize through (dependency inhecjetd?) constructor parameter or by simply enumerating checker in the constructor; I personally prefer the first way
   public void yourMethod() {
     for(Checkech checker : checkers) {
        checker.check();
     }
   }
}

显然,您可以向check方法添加参数,以便提供要验证的数据...

更新

如果你确实可以控制条件检查的实现,你可以切换到这样的东西(见文图里尼的评论@Alberto(:

public interface Checker {
    boolean check();
    String message();
}
public class YourClass {
   private List<Checker> checkers; // initialize through (dependency inhecjetd?) constructor parameter or by simply enumerating checker in the constructor; I personally prefer the first way
   public void yourMethod() {
     for(Checkech checker : checkers) {
        if(!checker.check()) {
            throw new ValidationException(checker.message());
        }        
     }
   }
}

您可以使用Map<String, Checker>变量实现具有第一个Checker定义的类似解决方案,该变量保持检查条件和相应错误消息之间的关联,但我绝对更喜欢@Alberto文图里尼提出的多态方法。

我希望这种方法可以帮助您将代码转向更加开放封闭的解决方案!

我看到你有 3 个不同的条件和 3 个不同的消息。值得使用像番石榴这样的 smth 前提条件或编写自己的前提条件。

你的代码会喜欢

checkState(check1stCondition(), message1);
checkState(check2stCondition(), message2);

你不会完全减少if's。但至少你提高了可读性。

您可以尝试使用多态性来减少 if 语句并提高可维护性。

只需使用这样的界面

public interface Example {
void check() throws ValidationException;
}

并实现不同的行为。

有一种方法接近OOP。注意:我不坚持,只是展示一个替代方案。

首先,您可以为每个条件创建一个新类。假设您对某些数据执行检查,它将如下所示:

interface Condition {
    CustomData checkedData();
}
public class Condition1 implements Condition {
    private CustomData data;
    public Condition1(CustomData data) {
        this.data = data;
    }
    public Condition1(Condition condition) {
        this.data = condition.checkedData();
    }
    public CustomData checkedData() {
        // do condition checking here and return CustomData if it's ok
        // throw exception otherwise
    }
}

然后,您可以将每个Condition包装在另一个中:

CustomData data = new Condition1(
                      new Condition2(
                          new Condition3(YOUR_DATA))).checkedData();

现在,您将确定您的数据已检查并准备好进行进一步的工作。

我相信它很容易维护..如果您需要一些新的检查,只需添加一些上面的小类并将您的数据包装在另一个Condition中。如果要更改某些条件,则不必在通用代码中查找它。你有单独的类。

相关内容

  • 没有找到相关文章

最新更新