Как Вы осуществляете рефакторинг большую грязную кодовую базу?

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

Я нарушил каждое правило, что я читал о за прошлый год. Существуют классы с несколькими обязанностями, существуют косвенные доступы (я забываю термин - что-то как foo.bar.doSomething()), и как я сказал, что это не хорошо прокомментировано. Вдобавок ко всему, это - начало игры, таким образом, графика вместе с данными или местами, где я пытался отделить графику и данные, я сделал данные public для графики, чтобы смочь получить доступ к данным этому нужно...

Это - огромная путаница!С чего начать? Как Вы запустили бы на чем-то вроде этого?

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


Обновите два дня спустя: Я вытягивал подобный диаграммам UML из моих классов и ловил часть "Низко висящего плода" по пути. Я даже нашел некоторые биты кода, которые были началом новых возможностей, но поскольку я пытаюсь сократить все, я смог удалить те биты и сделать инструмент для очистки чувства проекта. Я, вероятно, собираюсь осуществить рефакторинг как можно больше прежде, чем подстроить мои тестовые сценарии (но только вещи, которые на 100% несомненно не повлияют на функциональность, конечно!), так, чтобы я не должен был осуществлять рефакторинг тестовые сценарии, поскольку я изменяю функциональность. (Вы думаете, что я делаю его правильно или был бы он, по Вашему мнению, быть легче для меня высосать его и записать тесты сначала?)

Голосуйте за лучший ответ так, чтобы я мог отметить его справедливо! Не стесняйтесь добавлять свой собственный ответ на набор также, существует все еще комната для Вас! Я дам ему другой день или так и затем вероятно, отмечу проголосовавший самым высоким образом ответ, как принято.

Благодаря всем, кто ответил до сих пор!


25 июня 2010: Я обнаружил сообщение в блоге, которое непосредственно отвечает на этот вопрос от кого-то, у кого, кажется, есть довольно хорошее схватывание программирования: (или возможно не, если Вы читаете его статью :)),

С этой целью я делаю четыре вещи, когда я должен осуществить рефакторинг код:

  1. Определите, какова цель кода была
  2. Потяните UML и схемы действия включенных классов
  3. Найдите приемлемый вариант правильных шаблонов разработки
  4. Определите более ясные названия текущих классов и методов

40
задан SimonHL 22 September 2011 в 09:14
поделиться

14 ответов

Возьмите себе копию книги Мартина Фаулера Рефакторинг. В ней есть несколько хороших советов о том, как разбить вашу проблему рефакторинга на части. Примерно 75% книги - это небольшие шаги по рефакторингу в стиле поваренной книги, которые вы можете выполнить. Она также поддерживает автоматизированные модульные тесты, которые вы можете запускать после каждого шага, чтобы доказать, что ваш код все еще работает.

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

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

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

19
ответ дан 27 November 2019 в 01:35
поделиться

Вы можете посмотреть книгу Мартина Фаулера Рефакторинг . Это книга, которая популяризировала этот термин и технику (моя мысль, когда я проходила его курс: «Я делал много этого все время, я не знал, что у нее есть название»). Цитата из ссылки:

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

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

Вот каталог рефакторингов .

2
ответ дан 27 November 2019 в 01:35
поделиться

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

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

2
ответ дан 27 November 2019 в 01:35
поделиться

очень медленно: D

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

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

3
ответ дан 27 November 2019 в 01:35
поделиться

Просто дополнительный рефакторинг, который важнее, чем вы думаете: назовите вещи правильно!

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

Также документируйте свои материалы. Всякий раз, когда ответ на ПОЧЕМУ? не ясно передан ответом на КАК? (будучи кодом) вам нужно будет добавить некоторую документацию. Принятие проектных решений, вероятно, является самой важной задачей, поскольку это очень сложно сделать в коде.

5
ответ дан 27 November 2019 в 01:35
поделиться

Купите среду IDE с хорошей поддержкой рефакторинга. Я думаю, что IntelliJ - лучший, но теперь он есть и в Eclipse.

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

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

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

Постепенно создавайте страховочную сетку, и вы сможете с некоторой уверенностью провести рефакторинг.

4
ответ дан 27 November 2019 в 01:35
поделиться

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

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

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

Это может быть удивительно освежающим, когда правильно переделанная программа делает то же самое, что делала раньше, только более "чисто". ;)

Как уже говорили другие, юнит-тесты - ваш лучший друг! Они помогут вам убедиться, что ваш рефакторинг работает, а если вы начинаете с "нуля", то это идеальное время для их написания.

5
ответ дан 27 November 2019 в 01:35
поделиться

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

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

  • Простые цели для рефакторинга - это код, который дублируется во многих местах, и длинные методы.
  • Если вы управляете состоянием приложения с помощью статически инициализированных синглтонов или, что еще хуже, глобального состояния, с которым все взаимодействует, подумайте о переносе его в управляемую систему инициализации (т.е. структуру внедрения зависимостей, такую ​​как spring или guice) или, по крайней мере, убедитесь, что что инициализация не связана с остальной частью кода.
  • Централизуйте и стандартизируйте способ доступа к внешним ресурсам, особенно если у вас жестко запрограммированы такие вещи, как расположение файлов или URL-адреса.
4
ответ дан 27 November 2019 в 01:35
поделиться

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

Feathers рассказывает о Characterization Tests , которые представляют собой модульные тесты не для подтверждения известного поведения системы, а для изучения и определения существующего (неясного) поведения - в случае, если вы написали свой собственный устаревший код, и исправить его самостоятельно, это может быть не так важно, но если ваш дизайн небрежный, то вполне возможно, что есть части кода, которые работают «по волшебству», и их поведение неясно. , даже вам - в этом случае вам помогут характеристические тесты.

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

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

11
ответ дан 27 November 2019 в 01:35
поделиться

Выбросьте это, постройте новое.

-2
ответ дан 27 November 2019 в 01:35
поделиться

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

1
ответ дан 27 November 2019 в 01:35
поделиться

Я думаю, вам стоит использовать Eclipse в качестве IDE, потому что у него много плагинов и он бесплатный. Вы должны следовать паттерну MVC и писать тестовые примеры с помощью JUnit. Eclipse также имеет плагин для JUnit и предоставляет возможность рефакторинга кода, так что это сократит вашу работу. И всегда помните, что написание кода не так важно, главное - писать чистый код. Так что теперь везде давайте комментарии, чтобы не только вы, но и любой другой человек, читая код, чувствовал, что читает эссе.

2
ответ дан 27 November 2019 в 01:35
поделиться

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

16
ответ дан 27 November 2019 в 01:35
поделиться

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

Затем я запускаю CPD, чтобы найти доказательства наличия кода вырезания-копирования-вставки.

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

3
ответ дан 27 November 2019 в 01:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: