Я изучаю цикломатическую сложность на своем курсе по обеспечению качества программного обеспечения в университете, и мне трудно понять, как это работает, когда у вас есть составные условия в операторе предиката или узле. Я видел несколько определений цикломатической сложности, основное из которых использовало мое в моем классе:
V(G) = # of predicate nodes (with outdegree = 2) + 1
Таким образом, для графа программы, такого как этот, цикломатическая сложность будет равна двум:
V(G) = 2
Я также видел определения цикломатической сложности, данные как
V(G) = # edges - # nodes + 2
Что также работает для графика, приведенного выше. Однако у нас есть составные условия для предикатных узлов. И мы рассматриваем язык и систему, настроенную на автоматическое короткое замыкание, мне кажется, что график внизу слева должен быть расширен до графика. Если это так, как показано ниже, становится ли цикломатическая сложность равной 3, даже если в реальном исходном коде у нас может быть только один оператор if, или все еще V(G) = 2? .
Это сбивает с толку, потому что большинство определений цикломатической сложности, которые я вижу, говорят о предикатных узлах, и, как я понимаю предикаты, они могут содержать несколько условий короткого замыкания. Если это не так, похоже, что поведение короткого замыкания, хотя и увеличивает производительность, на самом деле увеличивает сложность цикломатики, если ее рассматривать. Если предоставлен исходный код, должны ли все условия быть разбиты на отдельные узлы, такие как график слева, прежде чем мы сможем вычислить цикломатическую сложность?