2014-01-22 4 views
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; 
} 
+1

Этот код не будет компилироваться, так что нет ничего, чтобы уменьшить. – Kayaman

+0

Звучит как вопрос для http://codereview.stackexchange.com. Пожалуйста, переместите его –

+0

Оператор 'if' указывает, что' getParamX' возвращает логическое значение, но if-body указывает, что оператор '+ =' может использоваться, что невозможно при булевом. Пожалуйста, сделайте это разумным. –

ответ

0

Для данного примера кода, можно только уменьшить boilderplate с помощью отражения, например:

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; 
+0

Я работал над подобным подходом, но без отражения. Reflect убивает статическую проверку типа и т. Д., И IMHO, вероятно, ухудшает общее качество кода, чем оригинал. –

+0

@MiserableVariable Да, это действительно не лучшая практика и нечитабельно, но единственный вариант, который я знаю, чтобы уменьшить шаблон в этом случае. – Chriss

+0

Это не уменьшает циклическую сложность как в ваших торговых операциях 8 if для цикла for, который насчитывает до 8. Параметрирование getMethod() с i увеличивает число состояний в точности столько же, сколько уменьшает количество состояний, устраняя операторы if. – waTeim

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()); 
    // ... 
+0

Или просто 'возвращай? b: 0: ' – assylias

+0

@ assylias sure :-) –

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) возвращает number. Кроме того, каждый объект вызывает один из конкретных методов getParam.

UPDATE2

Следующие строки устанавливают первый элемент массива:

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

Это основано на комментарий OP в о реальных методах можно назвать. Я оставлю его для определения класса, массива и остальных элементов массива.

+0

Извините, парни. Я думаю, что неправильно приводил пример. По соображениям безопасности я изменяю имена параметров, такие как param1, param2 и т. Д. Имена параметров очень разные, как игра, гостиница и т. Д. – user3222372

+0

Правильный пример: private double getSum (данные) { double total = 0; if (parameters.getGame()) всего + = data.getGameValue(); if (parameters.getHotel()) всего + = data.gethotelValue(); если (параметры.getBar()) всего + = data.getBar Value(); общая сумма возврата; } – user3222372

+0

Вы все еще можете сделать это с моим примером. Я добавлю еще один намек –

1

Как другие упоминали, вы будете лучше из переписать свой Parameter и Data класс, чтобы их использует, как это:

double total=0; 
for (int i=1; i<=8;i++) 
    if (parameters.hasParam(i)) 
     total+ = data.getParam(i); 
return total; 
Смежные вопросы