Цикломатическая сложность с составными условиями и коротким замыканием

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

V(G) = # of predicate nodes (with outdegree = 2) + 1

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

V(G) = 2

Граф программы с цикломатической сложностью два

Я также видел определения цикломатической сложности, данные как

V(G) = # edges - # nodes + 2

Что также работает для графика, приведенного выше. Однако у нас есть составные условия для предикатных узлов. И мы рассматриваем язык и систему, настроенную на автоматическое короткое замыкание, мне кажется, что график внизу слева должен быть расширен до графика. Если это так, как показано ниже, становится ли цикломатическая сложность равной 3, даже если в реальном исходном коде у нас может быть только один оператор if, или все еще V(G) = 2? .

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


person Cory Gross    schedule 06.03.2013    source источник


Ответы (1)


В C (C++, Java, C#) оператор «&&» добавляет единицу к сложности, потому что он определен для использования оценки с коротким замыканием. Цикломатическая сложность в этом случае будет равна 3.

См. http://hissa.nist.gov/HHRFdata/Artifacts/ITLdoc/235/chapter4.htm

«Булевы операторы добавляют к сложности либо единицу, либо ничего, в зависимости от того, имеют ли они семантику оценки короткого замыкания, которая может привести к условному выполнению побочных эффектов».

На рис. 4-4 представлен аннотированный исходный код и соответствующий блок-схема, демонстрирующий, как определяется сложность.

См. также Цикломатическая сложность IF((A›B) И (C›D)) и ЕСЛИ ((A›B) ИЛИ (C›D))

person Dan    schedule 09.03.2013