Java 如何重构代码以删除if语句?
我在任何地方都学到,如果可以避免使用if语句,那么使用if语句是一种不好的做法。我正在努力学习如何编写干净的代码,似乎有些设计模式也会有所帮助,所以我想知道是否有可能重构这段代码,以便从中删除if语句,下面是代码演示:Java 如何重构代码以删除if语句?,java,if-statement,Java,If Statement,我在任何地方都学到,如果可以避免使用if语句,那么使用if语句是一种不好的做法。我正在努力学习如何编写干净的代码,似乎有些设计模式也会有所帮助,所以我想知道是否有可能重构这段代码,以便从中删除if语句,下面是代码演示: public class Printer { private boolean on=false; private Job currentJob=null; private String name; public String getName()
public class Printer {
private boolean on=false;
private Job currentJob=null;
private String name;
public String getName(){
return name;
}
public void setName(String name) {
this.name=name;
}
public void setOn(boolean _on){
this.on=_on;
}
public boolean getOn(){
return this.on;
}
public void setCurrentJob(Job _currentJob){
this.currentJob=_currentJob;
}
public Job getCurrentJob(){
return this.currentJob;
}
private boolean getOnStart(){
setOn(true);
return getOn();
}
public boolean start(){
setOn(true);
return on;
}
public boolean stop(){
setOn(false);
return !on;
}
public boolean suspend(){
if (!isPrinting()) {
throw new IllegalStateException("Error");
}
currentJob.setState(Job.WAINTING);
return true;
}
public boolean resume(){
if (this.currentJob==null && currentJob.getState()!=0) {
throw new IllegalStateException("Error");
}
currentJob.setState(Job.PRINTING);
return true;
}
public boolean cancel(){
if (this.currentJob==null && currentJob.getState()!=0) {
throw new IllegalStateException("Error");
}
currentJob = null;
return true;
}
public boolean print(Job aJob){
if (isAvailable()){
currentJob=aJob;
aJob.setPrinter(this);
aJob.setState(Job.PRINTING);
return true;
}
System.err.println("Error");
return false;
}
public boolean printingCompleted(){
if (isPrinting()){
currentJob.setPrinter(null);
currentJob.setState(Job.COMPLETED);
currentJob=null;
return true;
}
System.err.println("Error");
return false;
}
public void setSpooler(Spooler spool){
spool.join(this);
}
public boolean isAvailable(){
return on && currentJob==null;
}
public boolean isPrinting(){
return on && currentJob!=null;
}
}
依我看,如果有正当的需要,拥有
ifs
没有什么错。但是您应该在方法中避免多个退出点。您可以重写:
public boolean print(Job aJob){
boolean result = false;
if (isAvailable()){
currentJob=aJob;
aJob.setPrinter(this);
aJob.setState(Job.PRINTING);
result = true;
}
System.err.println("Error");
return result;
}
我在任何地方都学到,当
有可能避免它们
我确实同意这一点。也许我对措辞过于敏感,但如果可以避免,对我来说,这意味着一开始就不需要它们。写得不好的代码肯定会包含做同样事情的不必要逻辑
if
s是语言的一个重要方面。认为应该不惜一切代价避免它们是愚蠢的。在需要的地方使用它们,这就是它们的用途 如果不正确或过度使用if
有时可能表示有代码气味,但我不会说应该避免
在你的情况下,它们确实有点不确定。我会把你的逻辑编成这样
public void print(Job aJob) {
if (!isAvailable()) {
throw new IllegalStateException("Cannot print when printer not available.");
}
currentJob = aJob;
aJob.setPrinter(this);
aJob.setState(Job.PRINTING);
}
public void printingCompleted() {
if (!isPrinting()) {
throw new IllegalStateException("Attempt to complete printing when no printing in progress.");
}
currentJob.setPrinter(null);
currentJob.setState(Job.COMPLETED);
currentJob = null;
}
这有三个好处:
true
或false
来表示成功/失败(一种常见的气味)我认为方法中的多个退出点(读取返回)是不好的。如果他们正确地对待代码,那么拥有多个if并不一定是不好的。“使用if语句是不好的做法”--谁告诉你的?我看你的
if
语句没有任何错误。我会说保留它们这不是codereview.stackexchange.com的一个问题吗?我投票将这个问题作为离题题来结束,因为它更适合codereview.stackexchange.com“你应该避免方法中的多个退出点”——你们从何处获得这些“智慧”?附加的result
变量会降低可读性。在我看来,应该避免在一个方法中使用多个返回语句。我被告知这是一个很好的编码标准单输入单输出(SESE)
。我如何避免这种情况?@Ryan:如果需要,您不需要避免我提到的ifs
。