В какой момент рефакторинг не стоит?

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

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

Ответ 1

Джоэл написал хорошее эссе по этой теме:

Вещи, которые вы не должны делать, часть 1

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

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

Ответ 3

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

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

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

В Интернете есть хорошая статья о о том, как Netscape 6 был написан с нуля, и это было плохой идеей для бизнеса.

Ответ 4

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

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

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

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

Ответ 5

В тот момент, когда программное обеспечение не выполняет то, что оно должно делать. Рефакторинг (изменение кода без изменения функциональности) имеет смысл тогда и только тогда, когда функциональность "по назначению".

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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

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

Ответ 9

Дядя Боб весит в со следующим:

Когда редизайн правильной стратегии?

Я рад, что вы задали этот вопрос. Вот ответ. Никогда.

Посмотрите, вы сделали беспорядок, теперь очистите его.

Ответ 10

Когда вы тратите больше времени на рефакторинг, чем на самом деле писать код.

Ответ 11

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

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

Ответ 12

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

Ответ 13

Мне не повезло с небольшими инкрементальными изменениями, когда код, который я наследую, действительно плох. Теоретически небольшой пошаговый подход звучит неплохо, но на практике все, что у него получается, - это лучшее, но все же плохо разработанное приложение, которое все думают, это ВАШ дизайн. Когда что-то ломается, люди больше не думают, что это из-за предыдущего кода, теперь он становится ВАШЕЙ ошибкой. Таким образом, я бы не использовал слово redesign, refactor или что-нибудь еще, что подразумевает тип менеджера, который вы меняете на свой путь, если я действительно не буду делать это по-своему. В противном случае, несмотря на то, что у вас могут быть исправлены десятки проблем, любые проблемы, которые все еще существуют (но не были обнаружены), теперь будут отнесены на вашу доработку. И будьте уверены, что если код плохой, ваши исправления обнаружат намного больше ошибок, которые просто игнорировались раньше, потому что код был настолько плохим, чтобы начать с.

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

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