Кодовый запах - 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 ( ).послать запрос();
Смотрите также
Рекомендации
- ^ а б 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.
- ^ Фаулер, Мартин. "CodeSmell". martinfowler.com/. Получено 19 ноября 2014.
- ^ Бек, Кент. "Кодовые запахи". WikiWikiWeb. Уорд Каннингем. Получено 8 апреля 2020.
- ^ Фаулер, Мартин (1999). Рефакторинг. Улучшение дизайна существующего кода. Эддисон-Уэсли. ISBN 978-0-201-48567-7.
- ^ Бинсток, Эндрю (27.06.2011). "В честь маленького кода". Информационная неделя. Получено 2011-06-27.
- ^ Сурьянараяна, Гириш (ноябрь 2014 г.). Рефакторинг для разработки программного обеспечения. Морган Кауфманн. п. 258. ISBN 978-0128013977.
- ^ Мартин, Роберт С. (2009). «17: запахи и эвристика». Чистый код: руководство по созданию гибкого программного обеспечения. Прентис Холл. ISBN 978-0-13-235088-4.
- ^ «Константы и магические числа». Получено 2020-11-03.
- ^ Миллер, Джереми. «Понижение - это запах кода». Архивировано из оригинал 16 февраля 2019 г.. Получено 4 декабря 2014.
- ^ Фаулер, Мартин. «DataClump». Получено 2017-02-03.
- ^ «Паттерны проектирования и рефакторинг». sourcemaking.com. Получено 2017-02-04.
дальнейшее чтение
- Гаруси, Вахид; Кучук, Барыш (2018). «Запахи в коде тестирования программного обеспечения: обзор знаний в промышленности и академических кругах». Журнал систем и программного обеспечения. 138: 52–81. Дои:10.1016 / j.jss.2017.12.013.
- Шарма, Тушар; Спинеллис, Диомидис (2018). «Обзор запахов ПО». Журнал систем и программного обеспечения. 138: 158–173. Дои:10.1016 / j.jss.2017.12.034.
внешняя ссылка
- CodeSmell на c2.com
- Таксономия кодовых запахов
- Обзор многих запахов кода
- CodeSmell
- Баунди, Дэвид, Программный рак: семь первых предупреждающих знаков или же Вот, ACM SIGSOFT Software Engineering Notes, Vol. 18 № 2 (апрель 1993 г.), Association for Computing Machinery, New York, NY, USA