Подтвердить что ты не робот

Цикломатическая сложность scala

Есть ли инструмент для генерации циклической сложности кода scala?

Спасибо

4b9b3361

Ответ 1

Насколько мне известно, таких инструментов нет. Я считаю важным отметить, что цикломатическая сложность является принципиально процедурной метрикой, и она полностью падает, когда у вас есть функции более высокого порядка на вашем языке. Если вы пишете код в стиле "хороший" Scala, циклическая сложность буквально переходит в 1 для всей вашей базы кода. Причина в том, что структуры более высокого порядка имеют тенденцию избегать явных ветвей вообще. Все кодируется в терминах функций, и не совсем ясно, как измерить циклическую сложность функции более высокого порядка (следовательно, все идет до 1).

Я бы посоветовал отказаться от идеи измерения циклической сложности в контексте Scala или действительно любого другого функционального языка. Лучше, и на самом деле более информативная метрика, будет просто grep через код для операторов if и match/case. Когда вы их найдете, подумайте о том, чтобы заставить их уйти. Эти утверждения не являются плохими любыми способами, но есть много случаев, когда они могут быть заменены прямолинейной функцией более высокого порядка. Этот экзамен выполнит ту же задачу, что и показатель циклической сложности, но гораздо полезнее w.r.t. функциональная парадигма. И, в конце концов, вполне вероятно, что ваш код будет намного более "функциональным" и значительно более сложным в результате.

Чтобы продлить комментарий Daniel, те же самые проблемы возникают в любое время, когда вы можете кодировать функции более высокого порядка. Это означает, что, в частности, цикломатическая сложность не очень хорошо применима к ОО. Если метод вызывает b.foo, тогда существует невидимая точка ветвления - ветвь к любому из методов foo, которые могут быть достигнуты таким образом. Тем не менее большинство цикломерных мер сложности для Java или того, что не учитывает messsage, отправляется как точки ветвления. Это вполне возможно (хотя и не часто практикуется), чтобы удалить все ifs, все fors и whiles и т.д. Через обычное старое OO. Единственная разница между OO и FP в этих строках заключается в том, что замена циклов и условных обозначений на конструкции более высокого уровня считается обычной практикой FP.

Ответ 3

Вы можете запустить задачу в инструменте SBT, чтобы проверить общие проблемы стиля. Между прочим, он будет вызывать предупреждение, если циклическая сложность будет превышать 10 в любом блоке. Подробнее см. Здесь: http://www.scala-sbt.org/

Задача называется styleCheck.