Общие причины цикломатической сложности и их решения

На работе мы изучаем распространенные проблемы, которые приводят к высокой цикломатической сложности. Например, наличие большого оператора if-else может привести к высокой цикломатической сложности, но это можно решить, заменив условные операторы полиморфизмом. Какие еще примеры вы нашли?


person Daniel    schedule 02.02.2010    source источник
comment
Любая конструкция, имеющая поведение ветвления, увеличивает цикломатическую сложность.   -  person Mitch Wheat    schedule 02.02.2010
comment
en.wikipedia.org/wiki/Cyclomatic_complexity:   -  person Mitch Wheat    schedule 02.02.2010
comment
Вы говорите о цикломатической сложности так, как будто это плохо по своей сути. Разве вы не сделаете лучше, если посмотрите, что вызывает настоящие проблемы?   -  person David Thornley    schedule 02.02.2010
comment
Да, мы знаем, что такое cc, и хорошей практикой является убедиться, что cc не высок, иначе вы увеличите риск внесения новых ошибок при попытке отладки ошибок в этом регионе, потому что это слишком сложно. Существуют распространенные плохие практики, которые приводят к этим нежелательно высоким уровням cc - например, большие операторы if else, мне было интересно, сталкивались ли другие с другими плохими практиками, ведущими к неприемлемо высоким уровням.   -  person Daniel    schedule 02.02.2010


Ответы (2)


См. определение цикломатической сложности от NDepend.

Глубина вложенности также является отличным показателем кода.

Цикломатическая сложность — популярная метрика процедурного программного обеспечения, равная количеству решений, которые могут быть приняты в процедуре. Конкретно, в C# CC метода равен 1 + {количество следующих выражений, найденных в теле метода}:

если | пока | для | foreach | случай | по умолчанию | продолжить | перейти | && | || | поймать | тернарный оператор ?: | ??

Следующие выражения не учитываются при вычислении CC:

еще | делать | переключатель | попробовать | используя | бросить | наконец | вернуться | создание объекта | вызов метода | доступ к полю

Адаптированная к миру OO, эта метрика определяется как для методов, так и для классов/структур (как сумма ее методов CC). Обратите внимание, что CC анонимного метода не учитывается при вычислении CC его внешнего метода.

Рекомендации: Методы, в которых CC выше 15, трудно понять и поддерживать. Методы, в которых CC выше 30, чрезвычайно сложны и должны быть разделены на более мелкие методы (за исключением случаев, когда они автоматически генерируются инструментом).

person Patrick from NDepend team    schedule 28.08.2010
comment
Хорошо, что вы добавили, как это вычисляется. - person LAFK says Reinstate Monica; 27.12.2012

Еще один пример того, как избежать использования большого количества «если», — это реализация конечного автомата. Поскольку события запускают переходы, условные операторы более понятным образом неявны с этими переходами, которые изменяют состояние System. Управление проще.

Оставьте вам ссылку, где упоминаются некоторые из его преимуществ:

http://www.skorks.com/2011/09/why-developers-never-use-state-machines/

person dreinoso    schedule 26.12.2016