更高效的 if else 块语句

More efficient if else block statements

我正在尝试在 java 中重新创建打印机,我对编程还很陌生,所以我在单个函数中使用巨大的 if else 块来指示程序的逻辑,我'我注意到这在同一个函数中创建了大量代码,我想知道是否有更多 eloquent/efficient 方法来执行此操作,下面的打印机 class。打印机的逻辑不太重要,但只是为了表明,一个是双面打印机,一个不是,逻辑负责检查碳粉量并确保打印的页面与双面打印机一致或没有。

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

按照 nicolas 的建议将 If 语句更改为:

 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-statements是多余的。你可以直接return布尔值。它为您节省了 12 行代码。例如:

    private boolean twoSideNoPaperOdd(double numberToPrint) {
        return ((ammountOfPaper - ((int) numberToPrint / 2)) - 1) < 0;
    }
    
  2. 很少有条件经常重复出现相同的结果。同样,它将 class 缩短了 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
    }