1

我有一个像下面这样的方法。请帮助避免循环复杂性。

private double getSum(Data data) {
    double total = 0;

    if(parameters.getParam1())
      total += data.getParam1();

    if(parameters.getParam2())
      total += data.getParam2();

    if(parameters.getParam3())
      total += data.getParam3();

    if(parameters.getParam4())
      total += data.getParam4();

    if(parameters.getParam5())
      total += data.getParam6();

    if(parameters.getParam6())
      total += data.getParam6();

    if(parameters.getParam7())
      total += data.getParam7();

    if(parameters.getParam8())
      total += data.getParam8();

    return total;
}
4

4 回答 4

1

我会创建一个这样的方法:

double doubleOrZero(boolean condition, double value) {
    return condition ? value : 0.0;
}

然后为每个paramX调用它,如下所示:

private double getSum(Data data) {
    double total = 0.0;

    total += doubleOrZero(parameters.getParam1(), data.getParam1());
    total += doubleOrZero(parameters.getParam2(), data.getParam2());
    // ...
于 2014-01-22T07:25:26.740 回答
1

正如其他提到的,你最好重写你的ParameterData类,像这样使用它们:

double total=0; 
for (int i=1; i<=8;i++)
    if (parameters.hasParam(i))
        total+ = data.getParam(i);
return total;
于 2014-01-22T07:41:35.427 回答
0

这里有一个提示。考虑以下代码:

for (int i = 0; i < 8; i++) {
  if (paramGetters[i].get(parameters)) {
    total += paramGetters[i].get(data);
  }
}

更新1

更多提示如何编译:

paramGetters是具有重载get方法的某种类型的对象数组:get(paramters)返回 a booleanget(data)返回 a number。此外,每个对象都调用特定getParam方法之一。

更新2

以下行设置数组的第一个元素:

paramGetters[0] = new ParamGetter() {
    boolean get(Parameters p) { return p.getGame(); }
    double get(Data d) { return d.getGameValue(); }
}

这是基于 OP 对要调用的实际方法的评论。我将由您来定义类、数组和数组中的其余元素。

于 2014-01-22T07:25:48.403 回答
0

对于给定的代码示例,只能通过使用反射来减少样板,如下所示:

double total=0; 
for (int i=1; i<=8;i++)
    if (parameters.getClass().getMethod("getParam"+i).invoke(parameters)==Boolean.TRUE)
        total+ = (double)data.getClass().getMethod("getParam"+i).invoke(data);
return total;
于 2014-01-22T07:18:54.427 回答