2016-08-15 8 views
-2

私はJavaでプリンタを作り直そうとしています。私はかなり新しいプログラミングをしていますので、プログラムのロジックを指示するために、これに気づいたのは、同じ関数の中に大量のコードを作成していることです。私は、これを行うより雄弁な/効率的な方法があるのだろうかと思っていました。プリンターのロジックはそれほど重要ではありませんが、とにかく表示するには、両面印刷のプリンターでなければなりません。ロジックはトナーレベルをチェックし、印刷されたページが両面印刷されていることを確認します。ない。他のブロックステートメントより効率的

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; 
} 

ニコラスにより示唆されるようにするかのステートメントを変更する:

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)はfalse'を返すそれ以外はtrueを返す場合、'やっにはポイントがありません、とにかくブール値に評価され、あなただけの 'リターンsomecondition'を行うことができます。しかしそれは実際より多かれ少なかれ効率的ではなく、冗長コードを数行削除するだけです。 –

+0

早めに、つまりif(tonerLevel == 0){System.out。 ...;戻る; } 'など。したがって、何度も何度も確認する必要はありません。また、片側または両側のような異なるブランチを異なる方法またはクラス(例えば、サブクラスまたは戦略パターン)に分解しようとする。 – Thomas

+1

より適切なスタックエクスチェンジサイトにクロスポストされているので、この質問をトピックとしてクローズすることにしました。将来的には、あなたの質問を単一の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

こんにちはNicolas、私はあなたがそれを見て気にしない場合、私の質問に補足のビットを追加しました、if(tonerLevel)とif(ammountOfPaper)文を関数の先頭に置くと言っていますか?私は、リターンを追加することが達成されるかについての少しの明確化を得ることができるかどうか、フィードバックに感謝します、ありがとうございました! – PacketSniffer

+0

最初のエラーですぐに戻らないという利点の1つは、出力エラーメッセージに問題を解決するために必要なすべてのステップが含まれることです。最初のエラー・メッセージの直後に戻ると、ユーザーは問題を訂正し、別のエラーが発生した場合にのみ再試行します。彼女はそれを修正してもう一度試してみましょう。別の問題に遭遇するだけです。この時間までに、私は#%$ @マシンを蹴って "なぜあなたは私が最後に2回試みたことを教えてくれませんでしたか? – FredK