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) {
'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. –
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
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