Как рефакторить

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

Чек-лист правильно проведённого рефакторинга

Код должен стать чище.

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

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

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

В процессе рефакторинга не создаётся новая функциональность.

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

Все существующие тесты должны успешно проходить.

Есть два случая, когда после рефакторинга ломаются тесты:

  • Вы допустили ошибку при изменении кода. Тут всё просто — идите и исправьте ошибку.

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

    В этом случае виноваты тесты и единственный способ это исправить — отрефакторить их или написать новые, более высокоуровневые. Такой ситуации можно вообще избежать, создавая тесты в стиле BDD.