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

Java约定在实践中-从方法返回多个值,java,naming-conventions,Java,Naming Conventions,关于Java约定,我有两个问题。我试图利用罗伯特·C·马丁的“干净代码” 以下情况: public void startProgressIfAllowed() { try { tryStartProgressIfAllowed(); } catch (Exception exception) { // log error } } private void tryStartProgressIfAllowed() { if (isSta

关于Java约定,我有两个问题。我试图利用罗伯特·C·马丁的“干净代码”

以下情况:

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
}
  • 但这种方法不符合“命令-查询分离”原则,因为tryToStopProgressOnStartedTaskIfNecessary(…)方法执行一些逻辑并返回成功/失败值
  • 我认为这种方法也不符合“每个函数一级抽象”的原则,因为我认为“检查”和“保存”操作在不同的抽象级别上
  • 方法名称是否正确以避免虚假信息?可能更好的名称是trytostopprogress和savestartedtask(如果需要)(…)

  • 以上问题有没有更好的解决方案?

    以下几点如何:

    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();
        }
    }
    
    关于你的观点:

  • 现在,C和Q有两种不同的方法
  • 我认为两件事
    whatdowithtaskinprogress
    trhydroptakinprogress
    是相同的抽象层次。如果你内联其中一个的代码,你当然是绝对正确的
  • 我根据自己的喜好更改了一些方法名称:)我唯一不喜欢的是“Onistask”部分,因为这个任务有点没有意义。也许这只是因为代码的其余部分未知,也许OnNextTask或OnNewTask更好

  • 我们遇到的问题是,我们在UI中考虑是/否+复选框值。但在这里,从商业角度考虑要好得多。我确定了三种不同的结果:保留、保存、删除。如何获得答案对调用方法来说应该无关紧要。

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

    在JavaSE中如何实现这种状态的一个示例:regex Matcher类

    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
    作为替代电路


    简而言之,状态是在处理类中保存的实际数据(此处为字符串)。

    真的吗
    trytostopprogressandsavestartedtaskifsneedly()
    是一个非常不专业的名字。我在大学时第一次听说Java约定使用长名字。我得说你做得太过分了!我会简单地称之为
    stopProgress
    ,并将故事的其余部分放在javadoc中。读得快多了。是的,我知道这是一个很长的名称,但根据“干净代码”的说法,描述性方法名称比短而不描述性(需要javadoc注释)要好得多,即使它太长。那么解决方案和列出的原则呢?问题不在于名称本身,而在于该方法做了很多事情。如果你觉得有必要在方法名称中包含“and”,那可能太多了。啊,我在某种程度上想念你的问题:对用户的质询可以有三种结果:保留、保存和删除。我正在相应地更新我的答案。