В этой статье я расскажу, как можно использовать NDepend для погашения технического долга посредством рефакторинга.
Введение
Я получил лицензию от Патрика Смаччиа, создателя NDepend. Однако моя недавняя работа была больше сосредоточена на инфраструктуре, чем на разработке приложений, поэтому у меня не было возможности использовать ее в своей работе. Поэтому я решил провести рефакторинг исходного кода, написанного ранее.
Вот исходный код, который я пытался реорганизовать; это простой инструмент для захвата рабочего стола:
Код был написан 15 лет назад, поэтому он довольно примитивен, но я подумал, что он идеально подойдет для практики рефакторинга.
Патрик предположил, что функция «установить старый проект в качестве основы и сравнить его с рефакторинговым проектом, чтобы визуализировать степень улучшения» будет хорошим дополнением. В этой статье я попробую эту функцию и покажу, как визуализировать улучшения с помощью рефакторинга.
Что такое NDepend?
NDepend — это инструмент статического анализа для анализа кода .NET. Его основные функции включают качество кода и визуализацию архитектуры, а также отслеживание изменений кода.
Вот статья, в которой Патрик рассказывает о NDepend:
Анализ исходного кода
Запустите VisualNDepend.exe и проанализируйте проект VS. Связь с проектом VS может быть сохранена как проект NDepend.
Результаты анализа визуализируются на панели инструментов.
Установка базовой линии
Во-первых, установите базовый уровень перед рефакторингом.
Создайте копию исходного кода `v1.0` и создайте `v2.0`. Затем создайте проекты NDepend для версий 1.0 и 2.0 и установите версию 1.0 в качестве базовой версии для версии 2.0.
Отныне я не буду модифицировать v1.0 и рефакторить v2.0.
Изучение горячих точек
NDepend обладает мощными функциями, помогающими определить области, требующие рефакторинга.
Сосредоточьтесь на «Долг» (технический долг) на панели инструментов.
При выборе «Типы для исправления приоритета» перечислены классы с «проблемами» с низкой точкой останова.
Чем ниже точка останова, тем выше ценность инвестиций в улучшение качества кода, и она служит индикатором для определения приоритета.
Пожалуйста, обратитесь к официальной документации для концепции точек останова:
На этот раз я сосредоточусь на исправлении MainForm+Config с самой низкой точкой останова и рейтингом E.
Обратите внимание, что рейтинг основан на методе SQALE.
Горячие точки рефакторинга
Нажмите «Проблемы» в «Главной форме + Конфигурация», и отобразится список проблем.
Многие проблемы возникают из-за полей, поэтому я заменю их на свойства.
v1.0
/// <summary> /// Configuration /// </summary> private class Config { /// <summary> /// Image format /// </summary> public string ImageType; /// <summary> /// Image magnification /// </summary> public decimal Magnification; }
v2.0
/// <summary> /// Configuration /// </summary> private class Config { /// <summary> /// Image format /// </summary> public string ImageType { get; set; } /// <summary> /// Image magnification /// </summary> public decimal Magnification { get; set; } }
После восстановления и повторного анализа вы можете увидеть, сколько долга было погашено по сравнению с базовым уровнем. Другие показатели, такие как «Сложность метода», также визуализируются.
Новый долг, созданный непреднамеренно
Важно убедиться, что рефакторинг не приведет к возникновению новых долгов.
Я перепечатаю приборную панель из ранее.
Это показывает, что по сравнению с базовым планом возникли четыре новые проблемы. Это долги, созданные в процессе рефакторинга.
При нажатии на «+4» будут перечислены классы с проблемами.
Нажав на `typeIssues` соответствующего класса, вы увидите проблему.
Все эти проблемы указывают на то, что видимость свойств общедоступна, хотя класс MainForm+Config не является общедоступным. Поэтому буду модифицировать их на внутренние.
v2.0
private class Config { /// <summary> /// Image format /// </summary> internal string ImageType { get; set; } /// <summary> /// Image magnification /// </summary> internal decimal Magnification { get; set; } }
После перестроения и повторного анализа убедитесь, что новые проблемы устранены.
Визуализация сравнения с базовой линией
Как упоминалось ранее, вы можете сравнить, сколько долга было погашено по сравнению с базовым уровнем.
Кроме того, вы можете сравнить различные аспекты.
Например, если выбрать в меню [Diff] › [Code Diff Summary] › [Types where code], будут перечислены классы, измененные во время рефакторинга.
При выборе [Diff Source] в контекстном меню отобразится разница между соответствующим классом и базовым уровнем.
Заключение
В этой статье я объяснил, как использовать NDepend для улучшения качества кода, сосредоточившись на сравнении с базовым уровнем.
Попробовав его, я понял, что NDepend может обеспечить следующие преимущества:
- Количественная оценка потерь из-за долга и погашения с помощью рефакторинга, который может быть использован для обращения к бизнес-стороне. Другими словами, его можно использовать в качестве основы для предложения рефакторинга.
- Повышение мотивации разработчиков за счет визуализации показателей достижения улучшения качества кода и текущего качества кода по сравнению с целевыми значениями.
Кроме того, NDepend имеет множество других функций и вариантов использования. Я хотел бы попробовать другие функции в будущем.