Кодовый запах - Code smell

В компьютерное программирование, а запах кода любая характеристика в исходный код из программа это, возможно, указывает на более глубокую проблему.[1][2] Определение того, что является запахом кода, а что нет, является субъективным и зависит от языка, разработчика и методологии разработки.

Термин был популяризирован Кент Бек на WardsWiki в конце 1990-х гг.[3] Использование этого термина увеличилось после того, как он был показан в книге 1999 года. Рефакторинг: улучшение дизайна существующего кода к Мартин Фаулер.[4] Это также термин, используемый гибкий программисты.[5]

Определение

Один из способов взглянуть на запахи - с точки зрения принципов и качества: «Запахи - это определенные структуры в коде, которые указывают на нарушение фундаментальных принципов проектирования и отрицательно влияют на качество дизайна».[6] Кодовые запахи обычно не ошибки; они не являются технически некорректными и не препятствуют работе программы. Вместо этого они указывают на недостатки в дизайне, которые могут замедлить разработку или увеличить риск ошибок или сбоев в будущем. Запах плохого кода может быть индикатором факторов, которые способствуют технический долг.[1] Роберт С. Мартин называет список кода «системой ценностей» для разработки программного обеспечения.[7]

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

Исследование 2015 г.[1] использование автоматического анализа полумиллиона исходного кода совершает а ручная проверка 9 164 коммитов, обнаруживших "запахи кода", показала, что:

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

Такие инструменты как Checkstyle, PMD, FindBugs, и SonarQube может автоматически определять запахи кода.

Общие запахи кода

Запахи на уровне приложений:[оригинальное исследование? ]

  • Дублированный код: идентичный или очень похожий код существует более чем в одном месте.
  • Надуманная сложность: принудительное использование чрезмерно усложненного шаблоны проектирования там, где было бы достаточно более простого дизайна.
  • Операция с дробовиком: одно изменение должно применяться к нескольким классам одновременно.
  • Неконтролируемые побочные эффекты: очень легко вызвать исключения во время выполнения, и модульные тесты не могут это зафиксировать.
  • Вариабельные мутации: очень сложно рефакторинг кода, так как фактическое значение непредсказуемо, и его трудно понять.
  • Логическая слепота: легко утверждать противоположное значение и все равно проверять тип.

Классовые запахи:[оригинальное исследование? ]

  • Большой класс: а учебный класс это стало слишком большим. Видеть Бог возражает.
  • Особенности зависти: класс, чрезмерно использующий методы другого класса.
  • Несоответствующая близость: класс, который зависит от деталей реализации другого класса. Видеть Объектная оргия.
  • Отказ от завещания: класс, который отменяет метод базового класса таким образом, чтобы договор из базовый класс не почитается производный класс. Видеть Принцип подстановки Лискова.
  • Ленивый класс / халявщик: класс, который делает слишком мало.
  • Чрезмерное использование литералов: они должны быть закодированы как именованные константы, чтобы улучшить читаемость и избежать ошибок программирования. Кроме того, литералы могут и должны быть перенесены в файлы / сценарии ресурсов или другие хранилища данных, такие как базы данных, где это возможно, для облегчения локализации программного обеспечения, если оно предназначено для развертывания в разных регионах.[8]
  • Цикломатическая сложность: слишком много ветвей или петель; это может указывать на то, что функцию необходимо разбить на более мелкие функции или что у нее есть потенциал для упрощения.
  • Понижение: приведение типа, нарушающее модель абстракции; абстракцию, возможно, придется реорганизовать или исключить.[9]
  • Сиротская переменная или постоянный класс: а учебный класс который обычно имеет набор констант, принадлежащих другому месту, где эти константы должны принадлежать одному из других классов-членов.
  • Сгусток данных: Происходит, когда группа переменных передается вместе в различных частях программы. В общем, это говорит о том, что было бы более подходящим формально сгруппировать различные переменные в один объект и вместо этого передавать только этот объект.[10][11]

Запахи на уровне метода:[оригинальное исследование? ]

  • Слишком много параметров: длинный список параметров трудно читать, что усложняет вызов и тестирование функции. Это может указывать на то, что цель функции плохо продумана и что код следует реорганизовать, чтобы ответственность распределялась более четко.
  • Длинный метод: а метод, функция или процедура стали слишком большими.
  • Слишком длинные идентификаторы: в частности, использование соглашения об именах для устранения неоднозначности, которая должна быть неявной в программная архитектура.
  • Чрезмерно короткие идентификаторы: имя переменной должно отражать ее функцию, если функция не очевидна.
  • Чрезмерный возврат данных: функция или метод, который возвращает больше, чем нужно каждому из вызывающих.
  • Чрезмерные комментарии: класс, функция или метод имеют несущественные или тривиальные комментарии. Комментарий к получателю атрибута - хороший пример.
  • Чрезмерно длинная строка кода (или God Line): слишком длинная строка кода, которая затрудняет чтение, понимание, отладку, рефакторинг или даже определение возможностей повторного использования программного обеспечения. Пример:
новый XYZ (s) .doSomething (buildParam1 (x), buildParam2 (x), buildParam3 (x), a + Math.sin (x) * Math.tan (x * y + z)). doAnythingElse (). build ( ).послать запрос();

Смотрите также

Рекомендации

  1. ^ а б c Туфано, Микеле; Паломба, Фабио; Бавота, Габриэле; Оливето, Рокко; Ди Пента, Массимилиано; Де Люсия, Андреа; Пошиваник, Денис (2015). «Когда и почему ваш код начинает плохо пахнуть» (PDF). 2015 37-я Международная конференция IEEE / ACM по разработке программного обеспечения IEEE. С. 403–414. CiteSeerX  10.1.1.709.6783. Дои:10.1109 / ICSE.2015.59. ISBN  978-1-4799-1934-5. S2CID  59100195.
  2. ^ Фаулер, Мартин. "CodeSmell". martinfowler.com/. Получено 19 ноября 2014.
  3. ^ Бек, Кент. "Кодовые запахи". WikiWikiWeb. Уорд Каннингем. Получено 8 апреля 2020.
  4. ^ Фаулер, Мартин (1999). Рефакторинг. Улучшение дизайна существующего кода. Эддисон-Уэсли. ISBN  978-0-201-48567-7.
  5. ^ Бинсток, Эндрю (27.06.2011). "В честь маленького кода". Информационная неделя. Получено 2011-06-27.
  6. ^ Сурьянараяна, Гириш (ноябрь 2014 г.). Рефакторинг для разработки программного обеспечения. Морган Кауфманн. п. 258. ISBN  978-0128013977.
  7. ^ Мартин, Роберт С. (2009). «17: запахи и эвристика». Чистый код: руководство по созданию гибкого программного обеспечения. Прентис Холл. ISBN  978-0-13-235088-4.
  8. ^ «Константы и магические числа». Получено 2020-11-03.
  9. ^ Миллер, Джереми. «Понижение - это запах кода». Архивировано из оригинал 16 февраля 2019 г.. Получено 4 декабря 2014.
  10. ^ Фаулер, Мартин. «DataClump». Получено 2017-02-03.
  11. ^ «Паттерны проектирования и рефакторинг». sourcemaking.com. Получено 2017-02-04.

дальнейшее чтение

внешняя ссылка