实践中的Java约定 - 从方法返回多个值

时间:2014-12-11 11:23:57

标签: java naming-conventions

我有两个关于Java Convention的问题。我尝试使用Robert C. Martin的“清洁代码”。

以下案例:

public void startProgressIfAllowed() {
    try {
        tryStartProgressIfAllowed();
    } catch (Exception exception) {
        // log error
    }
}
private void tryStartProgressIfAllowed() {
    if (isStartProgressAllowed()) {
        stopProgressOnCurrentlyStartedTask();
        startProgressOnThisTask();
    }
}

private boolean isStartProgressAllowed() {
    // Calls JOptionPane.showConfirmDialog with JOptionPane.YES_NO_OPTION.
    // Created dialog contains checkbox indicating that saving currently started task is required.
    // returns boolean depending on JOptionPane.YES_NO_OPTION clicked button
} 

private void stopProgressOnCurrentlyStartedTask() {
    // Saves currently started task depending on checkbox selecion property and stops currently started.
    // What is the correct way to get checkbox selecion property?
}

建议的解决方案:

public void tryStartProgressIfAllowed() {
    if (tryToStopProgressOnStartedTaskIfNecessary()) {
        startProgressOnThisTask();
    }
}

private boolean tryToStopProgressOnStartedTaskIfNecessary() {
    // Calls JOptionPane.showConfirmDialog with JOptionPane.YES_NO_OPTION.
    // Created dialog contains checkbox indicating that saving currently started task is required.
    // Depending on checkbox selecion property saves task.
    // returns boolean depending on JOptionPane.YES_NO_OPTION clicked button
}
  1. 但是这种方法不符合“命令查询分离”原则,因为tryToStopProgressOnStartedTaskIfNecessary(...)方法执行一些逻辑并返回成功/失败值。
  2. 我认为这种方法也不符合“每个功能的一级抽象”原则,因为我认为“检查”和“保存”操作处于不同的抽象层次。
  3. 方法名称是否正确以避免虚假信息?也许更好的名字是tryToStopProgressAndSaveStartedTaskIfNecessary(...)?
  4. 对于上述问题,有没有更好的解决方案?

2 个答案:

答案 0 :(得分:1)

以下内容如何:

public void tryStartProgressOnThisTaskIfAllowed() {
    tryStopTaskInProgressIfAllowed()

    if (!isTaskInProgress()) {
        tryStartProgressOnThisTask();
    }
}

private void tryStopTaskInProgressIfAllowed() {
    if (!isTaskInProgress()) {
        return;
    }


    TaskInProgressResult result = whatToDoWithTaskInProgress();
    if (result == Result.KEEP) {
        return;
    } else if (result == Result.DROP)
        tryDropTaskInProgress();
    } else if (result == Result.SAVE) {
        trySaveTaskInProgress();
    }
}

关于你的观点:

  1. 您现在有两种不同的C和Q方法
  2. 我认为whatToDoWithTaskInProgresstryDropTaskInProgress这两件事是相同的抽象层次。如果你内联其中一个或另一个的代码,你当然是绝对正确的。
  3. 我根据自己的口味更改了一些方法名称:)我唯一不喜欢的是#34; OnThisTask"因为这个任务有点无意义。也许只是因为其余代码未知,OnNextTask或OnNewTask可能更好。
  4. 我们遇到的问题是我们在UI术语中考虑YES / NO +复选框值。但在这里用商业术语来思考要好得多。我确定了三个不同的结果:KEEP,SAVE,DROP如何获得答案与调用方法无关。

答案 1 :(得分:1)

这似乎是CodeReview上的问题,请参阅页面左上角的下拉列表。

在Java SE中如何实现这种状态的一个例子:正则表达式匹配器类。

String s = ...
Pattern pattern = Pattern.compile("...");
Matcher m = pattern.matcher(s);
StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, ... m.group(1) ...);
}
m.appendTail(sb);

也可以使用m.matches()m.lookingAt作为替代电路。

简短状态保存在实际数据的处理类中(String here)。