我的应用程序有一个服务,其中 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
中。如果要更改某些条件,则不必在通用代码中查找它。你有单独的类。