2015-07-29 9 views
0

Это, вероятно, относится к более чем C и Java, конечно, но те два языка, я более знакомы, так что давайте возьмем этот простой пример:При вычислении циклической сложности следует ли включать в нее выражения, выходящие из текущего метода/функции?

int foo(int arg) 
{ 
    if (arg > 0) 
     return 1; 
    return 0; 
} 

Теперь, я видел две интерпретации как как return:

  • это «другой путь кода», так как он выходит из метода; поэтому любой оператор return должен увеличить сложность на 1. В этом случае приведенный выше примерный код имеет сложность 3; или
  • return просто выходит из метода, никаких оснований считать его. В этом случае образец кода выше, имеет сложность 1.

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

+0

C не имеет _methods_. И это все равно. – Olaf

+0

@ Олаф, который не имеет отношения к обсуждению. Метод или функция - это не что иное, как путь к коду. – fge

+0

Метод связан с объектом, _функция - это более общий термин. Есть веские причины назвать собаку не «волком». – Olaf

ответ

1

Вашего цикломатическое сложность будет 2, вот почему:

Вашего код, по существу, это:

int foo(int arg) 
    { 
     int out; 
     if (arg > 0) 
      out = 1; 
     else 
      out = 0; 
     return out; 
    } 

return равнины утверждение не учитывает сложность. У вас есть только 1 if заявление, нет if else заявлений. Следовательно, ваша циклическая сложность будет равна 2, так как есть один альтернативный путь к основному пути. Если операторы возврата засчитываются, ваша циклическая сложность одного и того же метода может быть 3 ИЛИ 4 (см. Мой код против вашего), это должно четко указать, почему возвратные утверждения не включены.

+1

Я считаю, что цикломатическая сложность кода OP равна 2, так как в коде есть явно 2 линейно независимых пути. – d125q

+0

@ d125q, но тогда в коде всегда есть путь, не так ли? Действительно ли это учитывается при расчетах сложности? Означает ли это, что только функции/методы без каких-либо операторов_ будут иметь сложность 0? – fge

+0

Вы правы, так как всегда есть хотя бы один путь, добавление инструкции if сделает сложность 2: https://en.wikipedia.org/wiki/Cyclomatic_complexity –

3

Этот код имеет два разных пути через функцию: тот, который соответствует arg > 0, являющийся истинным, а другой, соответствующий ему, является ложным.

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

int foo(int arg) 
{ 
    int retval = 0; 
    if (arg > 0) retval = 1; 
    return retval; 
} 

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

+0

Не говоря уже о том, что вы также могли бы написать этот код с ' ?: 'тройной оператор ..Hmm – fge

+1

Тернарный оператор имеет два разных пути через него, поэтому в этом случае ничего не меняется. – Peter