我有一个使用 (*/+ -) 运算符的算术表达式。变量分为三种类型 - 整数、浮点或 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)))
....我知道这很愚蠢,但它有效。
最佳答案
如果您希望代码更加 DRY,那么您需要面向对象的解决方案。 然后使用多态性来处理每种特殊情况。
您所做的是使用标志和过程编程。这并不可怕;它只是不易于阅读或灵活。如果您需要向该程序添加字符串值怎么办?好吧,现在您必须修改所有内容。
希望这能为您提供一些指导,而无需您重写整个程序。
关于java - 在不知道变量类型的情况下计算变量的算术表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42702465/