На чем основан расчет сложности методов?

На странице сложности Sonar Metrics следующий метод имеет сложность 5.

public void process(Car myCar){          <- +1
        if(myCar.isNotMine()){               <- +1
             return;                         <- +1
        }
        car.paint("red");
        car.changeWheel();
        while(car.hasGazol() && car.getDriver().isNotStressed()){   <- +2
             car.drive();
        }
        return;
    }

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

Ключевые слова, увеличивающие сложность: if, for, while, case, catch, throw, return (это не последний оператор метода), &&, ||, ?

Почему операторы case, блоки if и блоки while усложняют метод? Какая интуиция стоит за этим метрическим расчетом сложности методов?


person Geek    schedule 06.03.2013    source источник
comment
Потому что они делают сравнения. default finally нет, потому что они не делают сравнений, потому что сравнения делаются раньше.   -  person shuangwhywhy    schedule 06.03.2013


Ответы (3)


Это потому, что в них есть условия, которые увеличивают количество тестов, необходимых для проверки правильности кода.

Также, вероятно, if имеют меньшую сложность, чем циклы (while, for). Также прочитайте об цикломатической сложности, связанной с этим.

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

person wsdookadr    schedule 06.03.2013

Возможно, он основан на Cyclomatic Complexity Маккейба (по крайней мере, так выглядит).
Этот показатель широко используется в области разработки программного обеспечения.
Взгляните на это: http://en.wikipedia.org/wiki/Cyclomatic_complexity

person Giovani Guizzo    schedule 06.03.2013
comment
Потому что это надежный показатель для измерения сложности. Он используется в большинстве статей в области разработки программного обеспечения, и его эффективность доказана. Я советую вам прочитать статью Маккейба для лучшего понимания или взглянуть на это: guru99.com /цикломатическая-сложность.html - person Giovani Guizzo; 06.03.2013

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

Ключ к ответу на ваш вопрос взят из исследования Томаса Маккейба, опубликованного в декабре 1976 г.:

Можно показать, что цикломатическая сложность любой структурированной программы только с одной точкой входа и одной точкой выхода равна количеству точек принятия решения (то есть операторов «если» или условных циклов), содержащихся в этой программе, плюс один.

Это именно то, что делает Sonar: он находит точки принятия решений, которые происходят из циклов, условных операторов и составных логических выражений, и подсчитывает их количество.

person Sergey Kalinichenko    schedule 06.03.2013
comment
Что вы подразумеваете под линейно независимыми путями? - person Geek; 06.03.2013
comment
@Geek Если вы представляете свою программу в виде графа неориентированных ребер, соединяющих точки принятия решений, циклы, не содержащие других циклов, считаются линейно независимыми путями в коде. В разделе описания вики-страницы, связанной с ответом, есть красивые картинки, чтобы показать, что это значит. - person Sergey Kalinichenko; 06.03.2013