2016-08-15 197 views
-2

我試圖在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
  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