2008-10-15 2 views
18

Мне было интересно, как другие разработчики начинают рефакторинг. Каков ваш первый шаг? Как этот процесс (рефакторинг) отличается от вашего рефакторингового кода, который не является вашим? Вы пишете тесты во время рефакторинга?Как вы реорганизуете?

+1

См http://stackoverflow.com/questions/20262/refactoring-for -testability-на-на существующей системе. См. Http://stackoverflow.com/questions/48817/where-to-find-resources-on-refactoring. Ничего из этого не помогло? http://stackoverflow.com/questions/tagged/refactoring – 2008-10-20 12:00:29

ответ

24
  1. ничего нетривиального, что уже не имеют модульные тесты
  2. модульные тесты записи, затем рефакторинг
  3. рефакторинг мелкие кусочки и повторно запустить тесты Окрашенные
  4. остановки рефакторинга, когда код не реорганизовывать суха * чистый

* DRY = не повторяйте себе

+0

DRY = Не повторяй себя, я не знал, пока не посмотрю, поэтому я подумал, что буду давать другим головы. – 2008-10-17 12:07:06

+0

@ [nemo]: спасибо, отредактированный для ясности – 2008-10-17 15:55:41

2

Для меня во-первых, убедитесь, что код попадает во все лучшие практики нашего офиса. Например, с использованием строгих предупреждений и предупреждений для наших скриптов Perl.

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

И, наконец, посмотрите, есть ли способ сделать код более читаемым. Обычно это достигается путем превращения 5 небольших скриптов, которые делают подобные вещи в 1 модуль (класс).

2

I рефакторинг пока новый код, используя unit тесты. Я также буду реорганизовывать старый код, как мой, так и чужой, если методы слишком длинны или переменные называются плохо, или я вижу дублирование и т. Д.

2

Начните с получения модульных тестов, а затем используйте автоматические инструменты рефакторинга. Если рефакторинг не может быть автоматизирован, то это не механическая трансформация кода и, следовательно, не рефакторинг. Модульные тесты состоят в том, чтобы убедиться, что вы действительно выполняете механические преобразования от одной кодовой базы до эквивалентной.

4

Я беру дерьмо и делаю его менее дерьмовым. :-)

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

Первый шаг для меня - заметить, что я могу абстрагироваться от чего-то и сделать его более общим (и полезным в других местах, которым сейчас нужна функциональность), или я замечаю, что что-то плохое и может быть лучше (субъективно). Я не реорганизую общность без причины. YAGNI principle.

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

2

Рефакторинг без Испытание устройства является опасным. Всегда проверяйте единицы измерения. Если вы что-то измените без хорошего тестирования, вы можете быть в безопасности для некоторой части кода, но что-то в другом месте может не иметь такого же поведения. С помощью Unit Testing вы защищаете любые изменения.

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

2

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

4

книга Read Martin Fowler «s„Refactoring

BTW - это собственная ссылка Amazon Exec Мартина Фаулера, если вам интересно :)

1

Я согласен с другими плакатами, когда вы рефакторинга кода, который вы написал.

Если это код, который вы не писали, и особенно если его много, я бы начал с использования таких инструментов, как fxCop, Visual Studio Code Analysis, DevPartner - я уверен, что есть и другие хорошие. Они дадут вам представление о том, с чего начать и каковы наиболее распространенные проблемы с кодированием. Я бы также сделал стресс-тестирование, чтобы увидеть, где узкие места, поэтому наибольшую отдачу от ваших усилий по улучшению кода.

Мне нравится реорганизовывать свой код, но его можно переусердствовать. Если вы не улучшаете производительность приложения или серьезно улучшаете читаемость кода, вам стоит остановиться. Всегда есть возможность вводить новые ошибки при рефакторе, особенно если вы работаете без модульных тестов.

3

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

Если у меня есть рефакторинг, например, мне недавно пришлось переносить кучу ASCII на C++ в UNICODE, я стараюсь, чтобы у меня были хорошие регрессионные тесты, которые работают как на конечных пользователях, так и на уровне единицы. Опять же, я стараюсь использовать инструменты, а не вручную рефакторинг, поскольку это менее подвержено ошибкам, а ошибки, которые вы получаете, являются систематическими, а не случайными.

2

Я гораздо больше отказываюсь от кода рефакторинга, написанного другими, чем для рефакторинга моего собственного.

Если это было написано одним из моих предшественников, я обычно реорганизую только внутри функции. Например. Я могу заменить оператор if с помощью переключателя. Все, что намного больше, чем обычно, выходит за рамки, а не в рамках бюджета.

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

8

: Что это было?

Первый шаг - запустить модульные тесты, чтобы убедиться, что все они проходят. В самом деле, вы можете потратить много времени на поиск того, какие из ваших изменений нарушили тест, если он уже был сломан до ваш код.

Как этот процесс отличается от кода рефакторинга, который не является вашим?

Я, конечно, делаю небольшие шаги при рефакторинге кода, который я не писал (или код, который я написал давно). Я также могу проверить тестовое покрытие, прежде чем продолжать, чтобы не полагаться на единичные тесты, которые всегда проходят ... но это не проверяет область, над которой я работаю.

Вы пишете тесты во время рефакторинга?

я обычно не делаю, но я могу добавить новые тесты в следующих случаях (список не является исчерпывающим):

  • идея нового испытанием блесток в моем сознании («Что произойдет, если. ? ..» - написать тест, чтобы знать)
  • обнаружить дыру в тестовом покрытии

это также зависит от рефакторинга выполняется. При извлечении функции я могу создать новый тест, если он может быть вызван другим способом, каким он был раньше.


Вот некоторые общие советы:

Первая вещь, чтобы сохранить список из code smells заметил во время работы над кодом. Это позволяет освободить свой разум от бремени запоминания того, что было замечено в коде. Кроме того,

Золотое правило никогда не рефакторизуется, когда тесты устройства не проходят полностью.

Рефакторинг, когда код стабилен, перед добавлением чего-то, что, как вы знаете, повлияет на будущий рефакторинг, прежде чем интегрировать и, прежде всего, , прежде чем произносить сделанные вами.

В отсутствие модульных испытаний вам нужно будет поместить часть кода, которую вы хотите проверить в ходе рефакторинга. Если юнит-тесты слишком сложно модифицировать, как это обычно бывает, то вы можете создать characterization tests, как рекомендовано для Michael Feathers in Working Effectively with Legacy Code. Короче говоря, это сквозные тесты, которые позволяют вам фиксировать текущее поведение кода (который, как предполагается, не работает идеально все время).

Не бойтесь делать детские ступени. Не делайте одновременно две вещи. Если вы заметили что-то, требующее рефакторинга, обратите внимание на это, не исправляйте его прямо сейчас, даже если это кажется очень простым.

Заходите очень часто, когда проходят испытания. Чтобы вы могли отказаться от плохого рефакторинга, не теряя того, что было сделано раньше.

Помните, что рефакторинг не повышает ценность вашего клиента (это может быть обсуждено), но клиент не платит вам за рефакторинг. Одно эмпирическое правило состоит в том, чтобы рефакторировать, прежде чем вносить изменения или добавлять новые возможности в код.

0

Первый шаг: Определить code smell.

Второй шаг: Рассмотреть альтернативные реализации и какие компромиссы являются и которые я принимаю, в терминах которых является «лучше».

Третий шаг: воплотить лучшее решение.

Это не отличается, если код мой или нет, поскольку иногда я могу вернуться назад по коду, который я написал несколько месяцев назад, и он будет выглядеть как код от кого-то другого. Я могу писать тесты, если я делаю новые методы или не хватает адекватных тестов для кода, IMO.

0

Общий подход

Я могу начать с выглядывал на программное обеспечение (компонент) из птичьей зрения. Анализ зависимостей и инструменты графического отображения - вот большая помощь здесь (см. Последующие разделы). Я ищу круг в зависимости от уровня пакета или уровня класса, а также для классов со слишком большим количеством зависимостей. Это хорошие кандидаты на рефакторинг.

Инструменты торговли

Dependency инструменты анализа: