0

Java の初心者です。これはチュートリアルを参考にして作成した簡単な電卓コードです。これは問題なく動作しますが、ご覧のとおり、このプログラムには「コンストラクター」はありません! そして、それらはスキャナー オブジェクトのみです。私が学ぶための例として、このプログラムをコンストラクターとメソッドを持つ方法でより単純化できますか?

import java.util.Scanner; 
public class apples {
public static void main(String args[]){
    Scanner calculator = new Scanner(System.in);
    double fnum, snum, answer;

    System.out.println("Enter first number: ");
    fnum = calculator.nextDouble();
    System.out.println("Enter second number: ");
    snum = calculator.nextDouble();
    System.out.println("enter any operator: ");
    String op = calculator.next();
    switch (op){
    case ("x") :
        answer = fnum * snum;
        System.out.println(answer);
        break;

    case ("/") :
        answer = fnum / snum;
    System.out.println(answer);
    break;

    case ("+") :
        answer = fnum + snum;
    System.out.println(answer);
    break;

    case ("-") :
        answer = fnum - snum;
    System.out.println(answer);
    break;


    }

    }





}
4

2 に答える 2

1

1 つのアイデアは、より機能的なスタイルを使用して、冗長な演算子と醜いケース スイッチを削減し、コードをより保守しやすくすることです。

import java.util.*;
public class apples {
    protected static final Map<String, BinOp> operators = new HashMap<String, BinOp>() {{
        put("+", new BinOp() { public double calc(double op1, double op2) { return op1 + op2; }; });
        put("-", new BinOp() { public double calc(double op1, double op2) { return op1 - op2; }; });
        put("x", new BinOp() { public double calc(double op1, double op2) { return op1 * op2; }; });
        put("/", new BinOp() { public double calc(double op1, double op2) { return op1 / op2; }; });
    }};
    public static void main(String args[]){
        Scanner calculator = new Scanner(System.in);
        double fnum, snum, answer;

        System.out.println("Enter first number: ");
        fnum = calculator.nextDouble();
        System.out.println("Enter second number: ");
        snum = calculator.nextDouble();
        System.out.println("enter any operator: ");
        String op = calculator.next();
        BinOp opFunction = operators.get(op);
        answer = opFunction.calc(fnum, snum);
        System.out.println(answer);
    }
}

interface BinOp {
    double calc(double op1, double op2);
}

もちろん、入力演算子または存在しない演算子で倍精度値を処理する必要はありません。

別の良いアイデアは、ロジックを分離することです。

import java.util.*;
public class apples {
    public static void main(String args[]){
        Scanner calculator = new Scanner(System.in);
        double fnum, snum, answer;

        System.out.println("Enter first number: ");
        fnum = calculator.nextDouble();
        System.out.println("Enter second number: ");
        snum = calculator.nextDouble();
        System.out.println("enter any operator: ");
        String op = calculator.next();
        answer = calc(op, fnum, snum);
        System.out.println(answer);
    }

    public static double calc(String op, double op1, double op2) {
        switch (op) {
            case ("+"): return op1 + op2;
            case ("-"): return op1 - op2;
            case ("x"): return op1 * op2;
            case ("/"): return op1 / op2;
        }
        throw new RuntimeException("Not implemented!");
    }
}

これにより、コードが読みやすくなり、保守も容易になります。

そして、私は列挙型が本当に好きなので:

import java.util.*;
public class apples {
    public static void main(String args[]){
        Scanner calculator = new Scanner(System.in);
        double fnum, snum, answer;

        System.out.println("Enter first number: ");
        fnum = calculator.nextDouble();
        System.out.println("Enter second number: ");
        snum = calculator.nextDouble();
        System.out.println("enter any operator: ");
        String op = calculator.next();
        Operation operator = Operation.get(op);
        answer = operator.calc(fnum, snum);
        System.out.println(answer);
    }
}

enum Operation {
    ADD("+") {
        public double calc(double op1, double op2) {
            return op1 + op2;
        }
    },
    SUB("-") {
        public double calc(double op1, double op2) {
            return op1 - op2;
        }
    },
    MUL("x") {
        public double calc(double op1, double op2) {
            return op1 * op2;
        }
    },
    DIV("/") {
        public double calc(double op1, double op2) {
            return op1 / op2;
        }   
    },
    ;

    Operation(String op) {
        this.op = op;
    }
    protected String op;
    public abstract double calc(double op1, double op2);
    public static Operation get(String op) {
        for (Operation operation : values()) {
            if (operation.op.equals(op)) {
                return operation;
            }
        }
        throw new RuntimeException("Not implemented!");
    }
}

他の場所でも次のように使用できます。

answer = Operation.MUL(2, 3);

すべての操作を簡単に繰り返したり、名前を取得したりできます。

于 2012-11-01T12:11:45.380 に答える
0

更新しました - - - - - - - - - - - - - - - - -

これが私の解決策です;):

ランチャー(たとえば、必要に応じてサーブレットからのものでもかまいません):

  public class Launcher {

    private final Scanner scanner;

    public Launcher(Scanner scanner) {
        this.scanner = scanner;
    }

    public Scanner getScanner() {
        return scanner;
    }

    public static void main(String args[]) {
        Launcher launcher = new Launcher(new Scanner(System.in));
        launcher.printResult(launcher.takeOperandInput("first"), launcher.takeOperandInput("second"),
                launcher.takeOperatorInput());
    }

    private String takeOperandInput(String operandNumber) {
        askForOperand(operandNumber);
        return getElement();
    }

    private void askForOperand(String operand) {
        System.out.println("Enter " + operand + " :");
    }

    private String takeOperatorInput() {
        askForOperator();
        return getElement();
    }

    private void askForOperator() {
        System.out.println("enter any operator (+,-,/,*): ");
    }

    private String getElement() {
        return scanner.next();
    }

    private void printResult(String leftOperand, String rightOperand, String operator) {
        Calculator calculator = new Calculator(leftOperand, rightOperand, operator);
        System.out.println(calculator.calculate());
    }
}

ここでCalculatorクラス:

public class Calculator {

    private final Operands operands;

    private final OperationType operationType;

    public Calculator(String leftOperand, String rightOperand, String operationType) {
        this.operands = new Operands(leftOperand,  rightOperand);
        this.operationType = OperationType.transform(operationType);;
    }

    public double calculate() {
        return operationType.calculate(operands);
    }
}

不変Operandsクラスは次のとおりです。

final class Operands {

    private final double leftOperand;

    private final double rightOperand;

    public Operands(String leftOperand, String rightOperand) {
        this.leftOperand = Double.parseDouble(leftOperand);
        this.rightOperand = Double.parseDouble(rightOperand);
    }

    public final double getLeftOperand() {
        return leftOperand;
    }

    public final double getRightOperand() {
        return rightOperand;
    }
}

OperationTypeロジックを含む列挙型は次のとおりです。

enum OperationType {

    ADDITION("+") {
        public double calculate(Operands operands) {
            return operands.getLeftOperand() + operands.getRightOperand();
        }
    },
    SUBTRACTION("-") {
        public double calculate(Operands operands) {
            return operands.getLeftOperand() - operands.getRightOperand();
        }
    },
    MULTIPLICATION("*") {
        public double calculate(Operands operands) {
            return operands.getLeftOperand() * operands.getRightOperand();
        }
    },
    DIVISION("/") {
        public double calculate(Operands operands) {
            return operands.getLeftOperand() / operands.getRightOperand();
        }
    };

    private String operationType;

    private OperationType(String operationType) {
        this.operationType = operationType;
    }

    abstract double calculate(Operands operands);

    static OperationType transform(String operationType) {
        for (OperationType ot : values()) {
            if (ot.operationType.equals(operationType)) {
                return ot;
            }
        }
        throw new IllegalArgumentException("Unknown operator, please redo your operation.");
    }
}
于 2012-11-01T12:32:10.187 に答える