我有一个使用(* / + - )运算符的算术表达式。变量有三种类型 - 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)))
....我知道这很愚蠢,但它确实有效。
答案 0 :(得分:1)
如果您希望代码更干,您需要面向对象的解决方案。 然后使用多态来处理每个特例。
您所做的是使用标志和程序编程。这并不可怕;它只是不容易阅读或灵活。如果您需要将String值添加到此程序中该怎么办?那么,你现在必须修改一切。
希望这能为您提供一些指导,而无需重写整个程序。
答案 1 :(得分:0)
为什么不使用String.valueOf(a)代替..(is_double?toDouble(a):( is_float?toFloat(a):toInt(a)))?