我有一个像下面这样的方法。请帮助避免Cyclomatic复杂性。
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;
}
答案 0 :(得分: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());
// ...
答案 1 :(得分:1)
正如其他人提到的,您最好重写Parameter
和Data
类,以便像这样使用它们:
double total=0;
for (int i=1; i<=8;i++)
if (parameters.hasParam(i))
total+ = data.getParam(i);
return total;
答案 2 :(得分: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;
答案 3 :(得分:0)
这是一个提示。请考虑以下代码:
for (int i = 0; i < 8; i++) {
if (paramGetters[i].get(parameters)) {
total += paramGetters[i].get(data);
}
}
<强> UPDATE1 强>
更多提示如何编译:
paramGetters
是一种具有重载get
方法的某种类型的对象数组:get(paramters)
返回boolean
,get(data)
返回{{1} }}。此外,每个对象都调用一个特定的number
方法。
<强> UPDATE2 强>
以下行设置数组的第一个元素:
getParam
这是基于OP关于要调用的实际方法的评论。我将让你定义类,数组和数组中的其余元素。