Когда ваша интуиция говорит вам, что вам, вероятно, следует провести некоторый рефакторинг, скорее всего, это ваши инстинкты, говорящие вам немного поздно, что вы слишком долго откладывали что-то важное.
Я понимаю «запахи кода», красно-зеленый-рефакторинг и другие мысли, но часто мне кажется, что лучшее время для рефакторинга - это не первый раз, когда вы пишете код, а второй или третий раз, когда вы используете код и понимаете, что это на самом деле проблема и находится в фактическом использовании.
Фактически существует два уровня рефакторинга. Первый - это очевидные проблемы, которые появляются при первом коде. Это небольшие оптимизации, которые стоят очень мало, чтобы сделать заранее. Такие вещи, как сохранение ваших методов и классов маленькими, а также соблюдение DRY и SRP. Затем у вас есть дополнительный этап работы с серьезными недостатками в вашем дизайне, которые могут не сразу проявиться, пока ваш код не пройдет пару миль. Это второй уровень, о котором вы говорите, и все же, чтобы гарантировать, что последующее рефакторинг не будет слишком дорогостоящим, вы должны уже написать свой код таким образом, чтобы усилия, которые вы планируете позже, стали проще и дешевле, что означает ранний рефакторинг.
Как отметил Джефф в своем ответе, «время - деньги» , особенно в компаниях, где рабочая нагрузка высока, а риски еще выше. Время, потраченное на то, чтобы убедиться, что код находится в наилучшем возможном состоянии, сэкономит время позже, когда выявление того, что должно было быть легким рефакторингом, оказывается основной операцией.
При написании программного обеспечения каждый момент, потраченный на усовершенствование вашего кода, экономится время, когда оно действительно понадобится. Чем раньше вы проведете рефакторинг, тем яснее будут ваши последующие изменения. Это похоже на внесение первоначального взноса в сегодняшних долларах против будущих технических долгов, которые будут в завтрашних завышенных долларах.
В любом случае, рефакторинг не должен быть задачей, которую вы откладываете до какого-то таинственного будущего, когда программное обеспечение уже завершено и стабильно, поскольку это увеличивает ваши риски позже, когда ставки намного выше, а продукт намного сложнее изменить. Рефакторинг должен быть частью вашей повседневной деятельности, и в этом суть философии Red-Green-Refactor, которую вы упомянули.