Подтвердить что ты не робот

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

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

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

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

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


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

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

Спасибо всем, кто ответил до сих пор!


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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

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

Идея unit test также важна. Вы захотите иметь набор крупных общих транзакций, которые дадут вам общее поведение кода.

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

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

Создайте эту защитную сетку с течением времени, и вы сможете с достаточной уверенностью реорганизовать.

Ответ 8

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

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

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

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

Ответ 9

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

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

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

Ответ 10

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

Ответ 11

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

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

Ответ 12

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

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

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

Ответ 13

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

Ответ 14

Бросьте его, создайте его новым.