Стратегия крупномасштабного рефакторинга

(только для Ipython) вы можете использовать % timeit для измерения среднего времени обработки:

def foo():
    print "hello"

, а затем:

%timeit foo()

результатом является что-то вроде:

10000 loops, best of 3: 27 µs per loop

22
задан Rodja 7 March 2018 в 05:01
поделиться

7 ответов

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

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

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

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

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

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

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

16
ответ дан Aaron Digulla 29 November 2019 в 05:19
поделиться

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

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

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

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

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

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

6
ответ дан David Hall 29 November 2019 в 05:19
поделиться

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

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

1
ответ дан SmacL 29 November 2019 в 05:19
поделиться

Зависит от того, должно ли у Вас всегда быть рабочее состояние, так, чтобы Вы могли исправление ошибки и развертываться каждый раз, когда neccassary, затем Devide и Conquer был бы хорошим решением. Если можно поддержать старый код, при работе над новым (и иметь дисциплину для применения исправлений ошибок к обеим кодовым базам), перезапись может быть лучшим решением.

1
ответ дан Peter Miehle 29 November 2019 в 05:19
поделиться

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

0
ответ дан Rune Grimstad 29 November 2019 в 05:19
поделиться

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

-1
ответ дан Manoj 29 November 2019 в 05:19
поделиться

Для меня это зависит от ситуации.

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

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

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

Делят и Завоевывают, менее опасно, чем BigBang..., но если это - достаточно большая система, это может завершить то, чтобы быть столь же проблематичным как BigBang.

1
ответ дан mezoid 29 November 2019 в 05:19
поделиться
Другие вопросы по тегам:

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