在不知道其类型的情况下计算变量上的算术表达式

时间:2017-03-09 18:07:22

标签: java

我有一个使用(* / + - )运算符的算术表达式。变量有三种类型 - Integer,Float或Double。通过在命令行中写入“double”,“float”或“integer”来选择变量的类型。我已经编写了程序,但我不喜欢我的代码...

import java.io.BufferedReader;
import java.io.InputStreamReader;

class Work {

    InitializeForType init;
    String calculate_for;
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

    void  go() {
        try {
            calculate_for = bufferedReader.readLine();
            if (calculate_for.equals("double")){init = new InitializeForType<Double>();init.setA(1.23);}
            if (calculate_for.equals("float")){init = new InitializeForType<Float>();init.setA(1.23f);}
            if (calculate_for.equals("integer")){init = new InitializeForType<Integer>();init.setA(1);}
        } catch (java.io.IOException io) {
            System.out.println("ERROR!");
        }
        System.out.println(calculate(init.A));
    }


    private String calculate(Object a) {

        boolean is_double = a instanceof Double;
        boolean is_float = a instanceof Float;

        return "(arctg(2*c)/d + 2)/(d + a - 1) " +  " = (arctg(" + 2 *
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a))) + ")/" + a + " + 2)/(" + a + " + " + a + " - 1)" + " = (" + Math.atan(2 *
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a)))) + "/" + a + " + 2)/(" + a + " + " + a + " - 1)" + " = (" + (Math.atan(2 *
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a)))) /
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a))) + 2) + ")/(" + (
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a))) +
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a))) - 1.0) + ")" + " = " + (Math.atan(2 *
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a)))) /
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a))) + 2) / (
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a))) +
            (is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a))) - 1.0);
    }

    private Double toDouble(Object ob) {
        return Double.parseDouble(ob.toString());
    }

    private Float toFloat(Object ob) {
        return Float.parseFloat(ob.toString());
    }

    private Integer toInt(Object ob) {
        return Integer.parseInt(ob.toString());
    }

    private static class InitializeForType<someType> {
        someType A;
        void setA(someType a) {
            this.A = a;
        }
    }
}

我不希望代码的算术部分重复三次。我写的像(is_double ? toDouble(a) : (is_float ? toFloat(a) : toInt(a))) ....我知道这很愚蠢,但它确实有效。

2 个答案:

答案 0 :(得分:1)

如果您希望代码更干,您需要面向对象的解决方案。 然后使用多态来处理每个特例。

您所做的是使用标志和程序编程。这并不可怕;它只是不容易阅读或灵活。如果您需要将String值添加到此程序中该怎么办?那么,你现在必须修改一切。

希望这能为您提供一些指导,而无需重写整个程序。

答案 1 :(得分:0)

为什么不使用String.valueOf(a)代替..(is_double?toDouble(a):( is_float?toFloat(a):toInt(a)))?

See some samples