我有两个关于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
}
对于上述问题,有没有更好的解决方案?
答案 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();
}
}
关于你的观点:
whatToDoWithTaskInProgress
和tryDropTaskInProgress
这两件事是相同的抽象层次。如果你内联其中一个或另一个的代码,你当然是绝对正确的。我们遇到的问题是我们在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)。