0

我有以下Java方法:

public ERROR myMainMethod() {
  ERROR ret = invokeFirstSub();
  if (ret != ERROR.NO_ERROR) {
    return ret;
  }
  ret = invokeSecondSub();
  if (ret != ERROR.NO_ERROR) {
    return ret;
  }
  // you get the rest
}

基本上,在每次子调用之后,我们都会检查返回值并在发生任何错误时退出。如何重构?第一个想法是将整个调用序列放在一个 try-catch 循环中,使用断言并捕获第一个 AssertionError,但我觉得它不太优雅。有什么好的做法?

4

3 回答 3

2

基于重构良好实践,有两个可能的改进:

  1. 避免多个 return 语句(对于具有许多 return 语句的大型方法,使代码可读性笨拙)

  2. 尽可能封装逻辑,即将错误检查逻辑作为方法移动isError()到 ERROR 枚举中

    公共错误 myMainMethod() {

    错误 ret = invokeFirstSub();

    ret = (ret.isError()) ?ret : 调用SecondSub();

    ret = (ret.isError()) ?ret : 调用ThirdSub();

    // 以此类推,最后

    ret = (ret.isError()) ?ret : ERROR.NO_ERROR;

    // 你得到剩下的

    返回 ret; }

此外,根据您在管理每个班级或班级中所有潜艇的情况下的可行性,上述策略模式可能适合。

于 2013-04-18T11:10:12.207 回答
1

如果您的设计允许,您可以实现策略模式

public interface CheckStrategy {
    ERROR invoke();
}

public class FirstCheck implements CheckStrategy {
    ERROR invoke() {
        // do something
    }
}

public class SecondCheck implements CheckStrategy {
    ERROR invoke() {
        // do something
    }
}
[...]

你的主要方法:

public ERROR myMainMethod() {
    List<CheckStrategy> checks = new ArrayList<CheckStrategy>();
    checks.add(new FirstCheck());
    checks.add(new SecondCheck());
    [...]

    ERROR ret = ERROR.NO_ERROR;
    for(CheckStrategy check : checks) {
        ret = check.invoke();
        if(ret != ERROR.NO_ERROR) {
            break;
        }
    }

    return ret;
}
于 2013-04-18T10:56:25.963 回答
0

解决方案之一是使用 AOP。根据您的技术堆栈,您可以使用Spring AOPGuice AOP甚至原始AspectJ轻松实现您的目标。

这个想法是定义一个拦截器,它将拦截某些方法并在方法之前和/或之后执行自定义逻辑。

于 2013-04-18T10:40:01.783 回答