Рефакторинг: Разве это не красивое слово для очистки вашего кода? [закрыто]

21

До выхода книги Мартина Фаулера «Рефакторинг: улучшение дизайна существующего кода» мы привыкли называть серьезные изменения в коде «реархитектурой», а незначительные изменения - «очисткой». ИМО, методы рефакторинга - это все здравый смысл / очевидные вещи, которыми мы занимаемся вечно.

Как вы думаете, рефакторинг был чем-то новым? Может быть, просто способ обмануть управление распределением времени на очистку кода?

Чак Стефански
источник
Когда вы говорите «до выхода книги», я предполагаю, что вы имеете в виду книгу Мартина Фольвера, это правильно?
AlexC
-1: В чем полезность этого вопроса?
Джим Г.
Да, книга Фаулера.
Чак Стефански

Ответы:

43

Рефакторинг старше холмов, так что нет, ничего нового.

И рефакторинг не убирает. Ну, это может быть, но это не ограничивается уборкой.

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

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

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

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

Frank Shearar
источник
1
Ньютопия: это жизненно важный момент. Если вы не запускали свои тесты, вы не представляете, взломали ли вы что-то случайно или фактически провели рефакторинг . (И, конечно, вам нужен адекватный набор тестов!)
Фрэнк Шиарар
9

Это просто убирает код. По сути, программисты (особенно Мартин Фаулер) заметили, что они склонны выполнять одни и те же задачи каждый раз, когда приводят в порядок свой код. Они определили и пометили методы уборки и связанные с ними проблемы кода и presto! Рефакторинг родился.

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

Там нет магии рефакторинга; это просто новый набор жаргона для описания старой практики.

Муравей
источник
Уильям Опдике, 1992: Рефакторинг объектно-ориентированных структур . Фаулер и Бек с друзьями популяризировали рефакторинг. Джон Брант и Дон Робертс внедрили первый автоматизированный инструмент за некоторое время до 1999 года. Так что «новый набор жаргона» не очень точен.
Фрэнк Шиарар
Если вы согласны с тем, что компьютерное программирование продолжалось со времен Ады Лавлейс в середине 1800-х годов, тогда да - это относительно новый набор жаргонов.
Ant
1
Я думаю, что разница с шаблонами проектирования почти каждый разработчик изучил некоторые новые шаблоны и, следовательно, некоторые новые инструменты торговли из книги. С Refactoring я не чувствую, что кто-то действительно чему-то научился. Есть вторичная ценность в том, чтобы просто присвоить имя чему-либо (и сравнение шаблонов дизайна там имеет место), но он мог бы сделать это с постом в блоге.
Чак Стефански
Действительно, я упомянул, что это был новый жаргон ... по отношению к лямбда-исчислению.
Фрэнк Шиарар
@ Чак, ты читал книгу, Рефакторинг? Если это так, я был бы очень удивлен, если бы вы не узнали что-то новое из этого.
Марси
7

Мы делаем три отдельных действия в нашей компании с выделенным временем для трех:

  • Рефакторинг: состоит в изменении структуры кода, сохраняя при этом поведение.

Пример: разделение уродливого и нечитаемого метода из 100 строк, который выполняет четыре действия на четыре метода, которые можно использовать повторно, по 25 строк в каждом.

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

Пример: удаление закомментированного кода, убедившись, что этот код больше не нужен.

  • Применение правил StyleCop / FxCop: состоит в проверке соответствия кода стандартному набору правил StyleCop или FxCop и, если нет, его изменении в соответствии с этими правилами.

Пример: добавление Culture.Invariantв string.Format(или другую культуру , которая является более подходящим).

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

Арсений Мурзенко
источник
4
Хотя я согласен с тем, что существует фундаментальная разница между очисткой и повторным факторингом, во многих случаях эта линия довольно сильно размывается. Удаление мертвого класса и «очистка» всех ссылок на него из сигнатур методов или оставшихся ассоциаций будет считаться очисткой или рефакторингом? Я также категорически не согласен с тем, что запуск модульных тестов не является обязательным. Вы понятия не имеете, как все может сломаться. Я видел изменения в строке сообщения кода прерывания исключения, потому что кто-то считал, что было бы неплохо проанализировать его на наличие ошибок.
Newtopian
Я должен согласиться с Newtopian, особенно в том, что нет необходимости повторно запускать тесты. Фактически, должен существовать автоматизированный набор тестов, который запускается не реже, чем один раз за коммит. Независимо от того, будет ли это очистка или рефакторинг , если у вас есть изменение кода для подтверждения контроля версий, тесты должны выполняться.
Кодзиро
Вы должны всегда делать полную сборку после любой очистки - даже если это просто пробел и изменения в комментариях. Спросите об этом любого автора Python или Makefile.
JBRWilkinson
3

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

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

user1249
источник
3

Я согласен с «рефакторинг - это модное слово для очистки кода», но не с «просто». Люди используют причудливые слова по причине: иногда потому, что они хотят выглядеть умно, а иногда потому, что они передают более или более точное значение, и рефакторинг ИМХО (даже если иногда неправильно) обычно относится к последнему.

«Очистить» может означать что угодно, от «немного переформатировать» до «переписывать большие куски».

«Рефакторинг» означает, в частности, что-то вроде «небольших постепенных изменений в коде, предназначенных для поддержания той же функциональности при одновременном преобразовании его в лучший дизайн». И есть множество лучших практик, касающихся того, что вы делаете: некоторые из них ad-hoc, но есть общие принципы, такие как использование модульных тестов, извлечение части функций в новые функции или классы и т. Д., Которые люди могут и должны изучить ,

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

Джек В.
источник
2

Рефакторинг - это кодирование, как нормализация - реляционные данные. Это процесс абстрагирования понятий в более четкие, ясные и эффективные представления их роли в приложении.

sunwukung
источник
1
Это интересный способ взглянуть на это. Возможно, это происходит из моей базы данных, но есть кое-что, что раздражает меня в связи с упором на рефакторинг, и вы помогли мне понять это. Дело в том, что в базе данных то, что вы не исправляете в дизайне, занимает в 10 раз больше времени для исправления в тестировании и, вероятно, в 1000 раз больше в производстве. Таким образом, хороший администратор баз данных старается как можно быстрее привести все в порядок. Мне кажется, что слишком много времени на рефакторинг на более поздних этапах свидетельствует о том, что слишком мало времени уходит на разработку.
user21007
@ user21007: Код намного сложнее, чем схема базы данных, но его гораздо проще изменить и развернуть.
Кевин Клайн
1

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

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

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

Яцек Прусия
источник
0

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

Код «очистки» - это то, что мы делаем непрерывно без специально отведенного для этого времени. Для меня «очистка» - это обычно переименование, удаление комментариев и т. Д.

Mantisen
источник
1
переименование является стандартной техникой рефакторинга!
Чак Стефански
0

Я бы сказал нет

Там может быть очистка в процессе рефакторинга, но это не суть.

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

СУХОЙ является ключевым фактором в рефакторинге.

При добавлении новых кодов в существующую кодовую базу рефакторинг выполняется естественным образом по принципу СУХОЙ.

Просто мой 0,02

ohho
источник
0

Очистка вашего кода - это как уборка вашего дома, рефакторинг - это как разрушение стены и, возможно, установка ее в другом месте

Homde
источник
0

Когда кто-то еще убирает ваш дом, вы ничего не можете найти, потому что цель - убрать вещи с дороги. Рефакторинг построил бы и обозначил комнаты, шкафы, шкафы, полки, мусорные ведра и т. Д. Он по-прежнему вмещает в себя почти все то же самое (вы все равно можете приготовить бутерброд с сыром на гриле и съесть его в гостиной), но он должен сделать это. легче найти и, возможно, иметь эффективные места для размещения новых вещей.

JeffO
источник
Я не фанат модных словечек, но иногда общие задачи должны быть помечены и формализованы, чтобы все знали, о чем вы говорите. Клиент сообщает об ошибке, а менеджер кричит: «Иди почисти свой код!» Вы знаете, что они не говорят о рефакторинге.
JeffO
0

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

Smandoli
источник
-1

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

Вилли Уилер
источник
2
опасное отношение. Удаление всего мертвого кода и мертвой конфигурации - это очистка и изменение сигнатуры одного метода рефакторинга. Тем не менее, в обоих случаях я хотел бы получить хорошую тестовую дисциплину, чтобы убедиться, что я ничего не сломал.
Newtopian
Я не говорю, что это хорошо / безопасно / желательно делать серьезные изменения без тестовой дисциплины. Я говорю, что рефакторинг как методология подразумевает тестовую дисциплину, в то время как «очистка» не является методологией вообще.
Вилли Уилер
Так что, если я правильно понимаю, если у него нет подходящего причудливого имени, тогда мы идем! : -Я просто шучу, я вижу, что ты пытаешься сказать, правда, что очистка вещей вряд ли может быть названа методологией, но опять же, ни рефакторинг. Это просто причудливое слово, в котором говорится, что вы меняете код, не меняя его поведения. Само по себе это не имеет никакого отношения к тестированию. В соответствии с хорошей практикой кодирования будет указано, что если код изменился, его следует протестировать независимо от того, как вы называете действие, сгенерировавшее изменение.
Newtopian
1
Конечно, я могу купить это. Тестовая дисциплина больше связана с проведением рефакторинга, но она не является неотъемлемой частью определения. (То есть я могу рефакторинг кода вообще без каких-либо тестов.) Я не знаю, могу ли я согласиться с тем, что рефакторинг - это не методология - есть целые книги, написанные с пошаговыми шаблонами и так далее.
Вилли Уилер
-1

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

PSU
источник
-2

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

DVK
источник