如果其他语句更有效

问题描述:

我试图在java中重新创建一个打印机,我是相当新的编程,所以我在单个函数内部使用巨大的if else块来指示程序的逻辑,我注意到这是在同一个函数内部创建了大量的代码,我想知道是否有一个更有说服力的/有效的方法来做到这一点,下面的打印机类。打印机的逻辑并不太重要,但无论如何,只是一个不是双面打印机,逻辑负责检查墨粉量,确保打印的页面与双面打印机一致或不。如果其他语句更有效

package com.company; 


public class Printer { 
private String name; 
private double tonerLevel = 100; 
private int ammountOfPaper; 
private int numberOfPagesPrinted; 
private boolean isDoubleSided; 

public Printer(String name, double tonerLevel, int ammountOfPaper, boolean isDoubleSided) { 
    this.name = name; 
    if(tonerLevel >= 0 && tonerLevel <= 100) { 
     this.tonerLevel = tonerLevel; 
    } 
    this.ammountOfPaper = ammountOfPaper; 
    this.isDoubleSided = isDoubleSided; 
} 

private boolean isOutOfToner(double numberToPrint) { 
    if((tonerLevel - (numberToPrint/2) < 0)) { 
     return true; 
    } 
    else { 
     return false; 
    } 
} 


private boolean isOutOfPaper(double numberToPrint) { 
    if(((ammountOfPaper - numberToPrint) < 0)) { 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

private boolean twoSideNoPaperEven(double numberToPrint) { 
    if((ammountOfPaper - ((int) numberToPrint/2)) < 0) { 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

private boolean twoSideNoPaperOdd(double numberToPrint) { 
    if(((ammountOfPaper - ((int) numberToPrint/2)) - 1) < 0) { 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

public void printPages(double numberToPrint) { 

    if(isDoubleSided == false) { 
     if(tonerLevel == 0) { 
      System.out.println("Out of toner"); 
     } 
     if(ammountOfPaper == 0) { 
      System.out.println("Out of Paper"); 
     } 
     if(isOutOfToner(numberToPrint) && (tonerLevel != 0)) { 
      double difference = tonerLevel * 2; 
      numberToPrint = difference; 
      ammountOfPaper -= numberToPrint; 
      System.out.println("Will run out of toner after this print, able to print " + (int) numberToPrint + 
        " pages"); 
      tonerLevel = 0; 
     } 
     if(isOutOfPaper(numberToPrint) && (ammountOfPaper != 0)) { 
      double different = ammountOfPaper - numberToPrint; 
      numberToPrint = numberToPrint + different; 
      System.out.println("Will run out of paper after this print, printing " + (int) numberToPrint + " pages"); 
      ammountOfPaper = 0; 
     } 
     else if(!isOutOfToner(numberToPrint) && (!isOutOfPaper(numberToPrint))) { 
      ammountOfPaper -= numberToPrint; 
      tonerLevel = tonerLevel - (numberToPrint/2); 
      showPages(numberToPrint); 
     } 

    } 
    else if(isDoubleSided = true) { 
      if (numberToPrint % 2 == 0) { 
       if(tonerLevel == 0) { 
        System.out.println("Out of Toner"); 
       } 
       if(ammountOfPaper == 0) { 
        System.out.println("Out of Paper"); 
       } 
       if(twoSideNoPaperEven(numberToPrint) && (ammountOfPaper != 0)) { 
        ammountOfPaper -= numberToPrint/2; 
        System.out.println("There is no Paper"); 
       } 
       else if(!twoSideNoPaperEven(numberToPrint)) { 
        tonerLevel = tonerLevel - (numberToPrint/2); 
        ammountOfPaper -= numberToPrint/2; 
        showPages(numberToPrint); 
       } 
      } else { 
       if(tonerLevel == 0) { 
        System.out.println("Out of Toner"); 
       } 
       if(ammountOfPaper == 0) { 
        System.out.println("Out of Paper"); 
       } 
       if(twoSideNoPaperOdd(numberToPrint) && (ammountOfPaper != 0)) { 
        System.out.println("There is no paper"); 
        ammountOfPaper = (ammountOfPaper - ((int) numberToPrint/2)) - 1; 
        ammountOfPaper = 0; 
       } 
       else if(!twoSideNoPaperOdd(numberToPrint)) { 
        tonerLevel = tonerLevel - (numberToPrint/2); 
        ammountOfPaper = (ammountOfPaper - ((int) numberToPrint/2)) - 1; 
        showPages(numberToPrint); 
       } 
      } 
     } 

    } 

public void showPages(double numberToPrint) { 
    System.out.println("Printing " + (int) numberToPrint + " Pages, paper remaining is: " + this.ammountOfPaper 
      + " Toner level is: " + this.tonerLevel); 
} 

public void refillToner() { 
    tonerLevel = 100; 
} 
public void refillPaper(int paper) { 
    if(paper > 50) { 
     System.out.println("Cannot put in more paper"); 
    } 
    else { 
     this.ammountOfPaper += paper; 
    } 
} 

public int getAmmountOfPaper() { 
    return ammountOfPaper; 
} 

public double getTonerLevel() { 
    return tonerLevel; 
} 

public void setTonerLevel(double tonerLevel) { 
    this.tonerLevel = tonerLevel; 
} 

public void setAmmountOfPaper(int ammountOfPaper) { 
    this.ammountOfPaper = ammountOfPaper; 
} 

更改if语句由Nicolas的建议:

public void printPages(double numberToPrint) { 
if(tonerLevel == 0) { 
     System.out.println("Out of toner"); 
     return; 
    } 
    if(ammountOfPaper == 0) { 
     System.out.println("Out of Paper"); 
     return; 
    } 

if(isDoubleSided == false) { 
+1

'if'陈述评价布尔值不管怎么说,有一个在做'如果(somecondition)返回true,否则返回FALSE',你可以只是做回'没有somecondition'点。但这并没有多少效率,它只是消除了几行冗余代码。 –

+0

尽早使用,即'if(tonerLevel == 0){System.out。 ...;返回; }'等等。因此你不必一次又一次检查。还可以尝试将不同的分支分解为不同的方法或类(例如,子类或策略模式),如单面或双面。 – Thomas

+1

我正在投票结束这个问题,因为它已被交叉发布在更适合的Stack Exchange站点上。将来,请仅在单个Stack Exchange站点上发布您的问题。有关更多信息,请参阅[这里](http://meta.stackexchange.com/q/64068)。 (http://codereview.stackexchange.com/questions/138774/simulating-a-printer)。 – Matt

  1. if-statements是多余的。您可以直接返回布尔值。它可以节省您的代码中的12行。例如:

    private boolean twoSideNoPaperOdd(double numberToPrint) { 
        return ((ammountOfPaper - ((int) numberToPrint/2)) - 1) < 0; 
    } 
    
  2. 有很少的条件经常重复,相同的结果。再次,它将班级缩短24行。

    if (tonerLevel == 0) { 
        System.out.println("Out of toner"); 
        return; // leave the rest of method 
    } 
    
    if (ammountOfPaper == 0) { 
        System.out.println("Out of Paper"); 
        return 
    } 
    
+0

嗨尼古拉斯,我已经添加了一些附加到我的问题,如果你不介意看着它,你是否要把if(tonerLevel)和if(ammountOfPaper)语句放在函数的顶部,I想知道我是否可以澄清一下增加回报会达到什么效果,欣赏反馈,谢谢! – PacketSniffer

+0

不立即返回第一个错误的一个优点是输出错误消息将包含解决问题所需的所有步骤。如果您在第一条错误消息之后立即返回,则用户将纠正该问题,然后再次尝试以获得另一个错误;她修复并再次尝试,只是遇到另一个问题,此时,我会踢##$ @ @机器,大喊“为什么你不告诉我,我试过的最后两次?!!!” – FredK