2017-02-14 4 views
1

в состоянии, если в следующемКак уменьшить цикломатическую сложность в условии if?

if(condition1 || condition2 || condition3 || condition4 || condition5) 
... 

, где условия не зависят друг от друга, сложность кода, как правило, высока, есть способ, чтобы реорганизовать эту логику, чтобы уменьшить сложность?

Условия здесь могут представлять методы, которые выполняют валидацию и возвращают логическое значение.

добавить фрагмент кода для ясности

public void doSomething(boolean val, boolean val2, boolean val3, boolean val4, boolean val5, boolean val6) 
    { 
     if(val || val2 || val3|| val4|| val5|| val6) 
     { 
      System.out.println("hello"); 
     } 
     else{ 
      System.out.println("hello world"); 
     } 
    } 

Сложность фрагменте кода выше 7

+0

вы должны показать больше коды, потому что этот код не имеет цикломатическую сложности: у вас есть один путь. – davidxxx

+0

Почему вас беспокоит сложность цикломатов? Не могли бы вы уменьшить удобочитаемость, если бы вы могли уменьшить циклическую сложность? –

+0

Как я понимаю, циклическая сложность - это число линейно независимых путей через код. Простым способом сокращения было бы использовать '|' вместо '||', поскольку это заставляло бы каждый раз оценивать все условия. Тем не менее, мне трудно видеть улучшение. –

ответ

0

Может быть получить булевы флаги заселенных для каждого состояния и использования этих флагов в случае заявления. На мой взгляд, это улучшит читаемость.

+1

Но это не решило бы проблему сложности? –

0

В данном конкретном случае я хотел бы сделать этот код более универсальным:

public void doSomething(boolean... val) { 
    for (boolean v : val) { 
     if (v) { 
      System.out.println("hello"); 
      return; 
     } 
    } 

    System.out.println("hello world"); 
} 

Это позволит вам не развозит количество аргументов в методе, если логика внутри этого метода является то, действительно это (т.е. do ACTION # 1, если какой-либо из аргументов true, в противном случае ACTION # 2).

0

После правки:

«Сложность фрагмента коды выше 7»

Я думаю, что эта проблема является инструментом, который используется для измерения сложности.

Если заменить его

if(val || val2 || val3|| val4|| val5|| val6) 

по

boolean condition = val || val2 || val3|| val4|| val5|| val6;   
    if(condition) 

какова сложность сейчас?


В разработке цикломатическая сложность обычно относится к потенциальным путям в потоке кода. Это достаточно часто связано с вложенными условными блоками.

Мы говорим о коде, который имеет важную циклическую сложность как код стрелки, так как вложенные уровни рисуют вид стрелки.

В примере кода это не проблема, так как у вас есть только три возможных пути:

public void doSomething(boolean val, boolean val2, boolean val3, boolean val4, boolean val5, boolean val6) 
    { 
     if(val || val2 || val3|| val4|| val5|| val6) 
     { 
      System.out.println("hello"); 
     } 
     else{ 
      System.out.println("hello world"); 
     } 
    } 
  • Первый путь: if(val || val2 || val3|| val4|| val5|| val6)
  • Второй путь: else{
  • Третий путь: код между else и окончанием способа

Меньше кода есть возможные пути, более легко читать, тестировать и поддерживать его.

В вашем слишком простом случае вы можете уменьшить сложность, используя инструкцию else. Какой удалить потенциальный путь:

public void doSomething(boolean val, boolean val2, boolean val3, boolean val4, boolean val5, boolean val6) 
    { 
     if(val || val2 || val3|| val4|| val5|| val6) 
     { 
      System.out.println("hello"); 
      return; 
     } 

     System.out.println("hello world");   
    } 

Но ясно, что ваши примеры слишком просты, чтобы проявлять серьезные проблемы, связанные со сложностью.
Ниже приведена измененная версия вашего образца кода, где сложность вопроса о реорганизации кода для уменьшения циклической сложности.

public void doSomething(boolean val, boolean val2, boolean val3, boolean val4, boolean val5, boolean val6) 
    { 
     if(val || val2 || val3|| val4|| val5|| val6) 
     { 
      if (condition){ 
        if (val8 && val9){ 
        ... 
        } 
        else { 
         if (condition2 && condition3){ 
         System.out.println("hello"); 
         } 
        } 
      } 

     } 
     else{ 
      System.out.println("hello world"); 
     } 
    } 

Обычно для уменьшения цикломатической сложности вы должны уменьшить количество возможных путей. Вы можете достичь этого:

  • Избегая не требуется else
  • группировки операторов условий, которые разделены в то время как это может быть один оператор, который
  • выхода из метода, когда условие позволяет это сделать и не дожидаясь для одной точки выхода.

+0

Небольшое примечание: 'return;' необходимо в блоке if, в фрагменте без else, чтобы сохранить тот же результат. – Linuslabo

+0

@ Linuslabo Действительно очень важно. Спасибо. – davidxxx

Смежные вопросы