2013-03-06 3 views
3

От Sonar Metrics complexity page следующий метод имеет сложность 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; 
    } 

Это, как инструмент расчета сложности:

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

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

+0

Потому что они делают сравнения. 'default'' finally' не потому, что они не делают сравнения, потому что сравнения выполняются раньше. – shuangwhywhy

ответ

2

Это потому, что в них есть условия, которые увеличиваются the number of tests needed to ensure that the code is correct.

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

Read this blog post, он описывает реальную реальность того, что вы не можете протестировать все и простое количество тестов, которые вам требуются, чтобы проверить все.

1

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

+0

да, но я не понимаю, почему?. – Geek

+0

Потому что это заслуживающая доверия метрика для измерения сложности. Большинство документов в области разработки программного обеспечения используют его, и оно доказано, что оно действительно. Я советую вам прочитать статью МакКейба для лучшего понимания или взглянуть на это: http://www.guru99.com/cyclomatic-complexity.html –

1

Somar измеряет cyclomatic complexity, который представляет собой число линейно независимых путей через исходный код.

Ключ к ответу на ваш вопрос исходит от research paper of Thomas McCabe, published in December of 1976:

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

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

+0

Сонар фактически использует цикломатическую сложность. – Geek

+0

@ Geek Вы правы, после некоторого чтения я думаю, что я понял, что происходит. Проверьте обновленный ответ. – dasblinkenlight

+0

Что вы подразумеваете под линейно независимыми дорожками? – Geek

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