Средство оценки качества кода в MS Visual Studio

Введение


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

Microsoft предоставляет встроенное в Visual Studio средство, которое позволяет оценить код вашего проекта.



Получить оценку вашего кода можно нажав правой кнопкой на проекте и выбрав пункт “Calculate Code Metrics” (Эта функциональность доступна в Visual Studio 2008 Team System и Visual Studio 2010 начиная с Premium версии).

Описание метрик


Результаты содержат 5 метрик для вашего кода.

  1. Maintainability Index – комплексный показатель качества кода. Этот показатель разработан специалистами из Carnegie Mellon Software Engineering Institute. Рассчитывается метрика по следующей формуле:

    MI = MAX(0, (171 — 5.2 * ln(HV) — 0.23 * CC — 16.2 * ln(LoC)) * 100 / 171)

    • HV – Halstead Volume, вычислительная сложность. Чем больше операторов, тем больше значение этой метрики;
    • CC – Cyclomatic Complexity. Эта метрика описана ниже;
    • LoC – количество строк кода.

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

    Visual Studio помечает методы/классы зеленым цветом, если значение метрики находится в пределах от 20 до 100, желтым цветом, если значение находится в пределах от 10 до 20, и красным цветом, когда значение меньше 10.
  2. Cyclomatic Complexity – показывает структурную сложность кода, т.е. количество различных ветвей в коде. Чем больше этот показатель, тем больше тестов должно быть написано, для полного покрытия кода.
  3. Depth of Inheritance – глубина наследования. Эта метрика показывает для каждого класса, какой он по счету в цепочке наследования. Например, есть 3 класса A, B, C, B унаследован от А, а С унаследован от В, то значение этой метрики для классов A,B и C будет равно соответственно 1, 2 и 3.
  4. Class Coupling – показывает степень зависимости классов друг с другом. В расчет берутся уникальные классы из параметров, локальных переменных, возвращаемого типа, базового класса, атрибутов (полный список можно найти в MSDN). Хороший дизайн программного обеспечения предполагает небольшое количество связанных классов. Чем их больше, тем сложнее в дальнейшем переиспользовать этот класс, а также поддерживать, т.к. существует очень много зависимостей.
  5. Lines of Code – показывает количество строк кода. Этот показатель показывает не точное количество строк в вашем файле, т.к. подсчет основан на IL-коде. В расчет не берутся пустые строчки, комментарии, строчки со скобками, объявление типов и пространств имен. Большое количество строк в методе/классе может показывать на ошибки в проектировании и на то, что этот код можно разделить на несколько частей.

Более подробно про то, как считаются эти метрики, можно прочитать здесь.

Реальное использование


Когда я первый раз запустил анализ на одном из проектов, все значения Maintainability Index были зеленые. Это казалось несколько странным, т.к. там явно был код, который надо было бы переписать. Значения MI для таких участков кода были около 30-40. Получается, что показатели по умолчанию являются, скорее всего, субъективными, и решение о том, какой код считать некачественным, придется принимать самим программистам.

Для своих проектов я стараюсь для большинства методов поддерживать показатель MI около 70-90. Бывают методы, у которых этот показатель равен 50-60, и их можно переписать, но стоит оценивать затраты и выгоды.

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

Спасибо большое.

Источники


  1. MSDN
  2. PC Week
  3. Code Analysis Team Blog

Похожие публикации

Средняя зарплата в IT

120 000 ₽/мес.
Средняя зарплата по всем IT-специализациям на основании 3 560 анкет, за 1-ое пол. 2021 года Узнать свою зарплату
Реклама
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее

Комментарии 20

  • НЛО прилетело и опубликовало эту надпись здесь
      +1
      (Эта функциональность доступна в Visual Studio 2008 Team System и Visual Studio 2010 начиная с Premium версии)


      Очень жаль, наряду с профайлером и другими плюшками…
        0
        Из бесплатного посмотрите на
        Gendarme (http://www.mono-project.com/Gendarme)
        FxCop (входит в Windows SDK)
        Это немного не то, но может оказаться очень полезным при анализе кода.

          –1
          FxCоp — он больше за стилистику кода отвечает.
          Насчет Gendarme — спасибо, посмотрю.
            +2
            Больше за стилистику — это StyleCop.
              0
              А Gendarme — это прямая альтернатива FxCop для Mono.
              +1
              Gendarme — это хорошо, но немного не из той области.
              В Monodevelop есть конкретно code metrics addin с похожими возможностями.

              Например:
                0
                Полезное безусловно, но это совсем другое. Это утилиты для статического анализа кода сборок. Определяет соответствие кода правилам, определенным Microsoft'ом. Я так понимаю, туда заложены общие гайдлайны для .NET, придуманные ими.
                0
                из бесплатного еще add-in для reflector'а есть
                  0
                  а из платного, можно DevExpress CodeRush посмотреть тут и тут.
                +1
                Хорошая вещь для командной работы.

                Встроенное стредство неплохо и вполне юзабельно, но все же не сравнится по удобству и гибкости с NDepend. У NDepend, как всегда, один большой недостаток — он очень сильно не бесплатный.
                  +1
                  Как раз если бы не его цена, то я бы с ним бы с удовольствием бы поразбирался. Хотя с другой стороны, за ту разницу в цене на VS2010 Professional и Premium можно и приобрести NDepend.
                    0
                    Это да, но тут еще такой момент — ПО от MS организации и стартапы могут получать через всякого рода программы аля BizSpark. В том числе самые навороченные версии. Чего не скажешь про NDepend.
                    0
                    Для использования в научных целях и учебы вполне бесплатно :)
                      0
                      А вы пробовали бесплатную версию? Ну кроме как для метрик? Собственно работа с графами/матрицами зависимости напоминает Танталовы муки: ну вот же оно, вот, только здесь развернуть, здесь сгрупировать и сейчас я его увижу… клик-клик-клик… Ограничение! И все сначала.
                        0
                        Ограничений, скорее всего, не заметил. Имеете в виду развернутый просмотр зависимостей компонентов? Запомнилось что при экспорте этих графов и матриц поверх рисовалось куча страшных логотипов, пришлось Print Screen с программы делать :)
                        Понравилась метрика Type Rank (рейтинг класса) — чем больше к нему зависимостей и обращений тем он выше, и относиться к нему следует аккуратней.

                        А вас профиль тоже не со всех интернетов открывается из-за подчеркивания(_)?
                          0
                          Что в матрице, что в дереве зависимостей в триальной версии есть ограничение на количество действий-преобразований — кажется 10. По достижении этого числа всё сворачивается в начальное положение. Это была одна из причин побудивших меня его купить.

                          Относительно профиля: никогда не обращал внимание :) Только сейчас заметил, что ник у меня — через подчеркивание, а профиль — через минус :)
                    0
                    Сколько использую ms — никогда не замечал этого пункта. Спасибо
                      0
                      Спасибо за статью, хорошая информация для моей дипломной работы.
                        0
                        На прошлой работе, ввиду ограничения лицензий студий, для анализа метрик использовали — SourceMonitor (полный аналог студийного анализатора).
                        www.campwoodsw.com/sourcemonitor.html

                        Для анализа Warning'ов и стилистики (как выше упоминалось) использовались FxCop + StyleCop, опять таки, из-за ограничения Professional редакции :(

                        Да, не так удобно как в студии, приходилось запускать три отдельных приложения (хотя, StyleCop можно интегрировать в студию), но зато бесплатно. Цены на Premium кусючие.

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое