2016-08-15 4 views
-2

Ich versuche, einen Drucker in Java neu zu erstellen, bin ich ziemlich neu zu programmieren, also verwende ich riesige wenn sonst Blöcke in einer einzigen Funktion, um die Logik des Programms zu diktieren, ich ' Wenn ich bemerke, dass ich eine Masse von Code innerhalb derselben Funktion erschaffe, frage ich mich, ob es eine elegantere/effizientere Methode gibt, dies zu tun. Logik für den Drucker ist nicht so wichtig, aber um nur zu zeigen, ist einer ein doppelseitiger Drucker, den man nicht ist, und die Logik ist verantwortlich für das Überprüfen des Tonerstands und dafür, dass die gedruckten Seiten mit dem doppelseitigen Drucker übereinstimmen nicht.Effizienter, wenn Block Anweisungen sonst blockieren

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

Ändern der if-Anweisungen, um wie von nicolas vorgeschlagen:

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' Aussagen bewerten sowieso Boolesche Werte, da dabei' keinen Sinn, wenn (somecondition) true sonst zurückkehren false' zurückkehren, könnten Sie gerade tun 'Rückkehr somecondition'. aber das ist nicht wirklich mehr oder weniger effizient, es eliminiert nur ein paar Zeilen redundanten Code. –

+0

Verwenden Sie früh, d. H. 'If (tonerLevel == 0) {System.out. ...; Rückkehr; } 'etc. So müssen Sie nicht immer wieder nachprüfen. Versuchen Sie auch, verschiedene Zweige wie einseitige oder doppelseitige auf verschiedene Methoden oder Klassen (z. B. Unterklassen oder Strategie-Muster) zu berücksichtigen. – Thomas

+1

Ich stimme für das Schließen dieser Frage als Off-Topic ab, da sie auf einer besser geeigneten Stack Exchange-Site gepostet wurde. In Zukunft sollten Sie Ihre Frage nur auf einer einzelnen Stack Exchange-Site veröffentlichen. Weitere Informationen finden Sie unter [hier] (http://meta.stackexchange.com/q/64068). (http://codereview.stackexchange.com/questions/138774/simulating-a-printer). – Matt

Antwort

1
  1. Ihre if-statements redundant sind. Sie können den booleschen Wert direkt zurückgeben. Es speichert 12 Zeilen in Ihrem Code. Zum Beispiel:

    private boolean twoSideNoPaperOdd(double numberToPrint) { 
        return ((ammountOfPaper - ((int) numberToPrint/2)) - 1) < 0; 
    } 
    
  2. Es gibt einige Bedingungen, die oft mit dem gleichen Ergebnis wiederholt werden. Wiederum verkürzt es die Klasse um 24 Zeilen.

    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

Hallo Nicolas, ich habe meiner Frage ein kleines Addendum hinzugefügt, wenn es dir nichts ausmachen würde, es zu betrachten, sagst du, wenn ich die Anweisungen if (tonerLevel) und if (ammountOfPaper) an die Spitze der Funktion setze Ich frage mich, ob ich ein bisschen Klarheit darüber bekommen könnte, was das Hinzufügen der Rückkehr auch bringt, ich schätze das Feedback, danke! – PacketSniffer

+0

Ein Vorteil von NOT sofort beim ersten Fehler ist, dass die Ausgabe Fehlermeldungen alle Schritte enthalten, die zur Lösung des Problems benötigt werden. Wenn Sie unmittelbar nach der ersten Fehlermeldung zurückkehren, behebt der Benutzer das Problem und versucht erneut, nur einen weiteren Fehler zu erhalten. Sie behebt das und versucht es erneut, nur um auf ein anderes Problem zu stoßen. Zu diesem Zeitpunkt würde ich die #% $ @ Maschine treten und schreien: "Warum hast du mir nicht gesagt, dass ich die letzten zwei Male versucht habe? !!!" – FredK