Ценность программы имеет две составляющие — то, что они могут делать для нас сегодня, и то, что они смогут делать завтра. В большинстве случаев мы сосредотачиваемся при программировании на том, что требуется от программы сегодня. Исправляя ошибку или добавляя новую функцию, мы повышаем ценность программы сегодняшнего дня путем расширения ее возможности.
Занимаясь программированием долгое время, нельзя не заметить, что функции, выполняемые системой сегодня, отражают лишь одну сторону вопроса. Если сегодня нужно выполнять ту работу, которая нужна сегодня, но так, что это не гарантирует выполнение той работы, которая понадобится завтра, то вы проиграли. Хотя, конечно, вы знаете что вам нужно сегодня, но не вполне уверенны в том, что потребуется завтра. Это может быть одно, а может быть и другое, а может быть и то, что вы не смогли себе вообразить.
Я знаю достаточно, чтобы выполнить сегодняшнюю задачу. Я знаю не достаточно чтобы выполнить завтрашнюю. Но если я буду работать только на сегодняшний день, завтра я не смогу работать вообще.
Рефакторинг — один из путей решения описанной проблемы. Обнаружив что вчерашнее решение сегодня потеряло смысл, мы его изменяем. Теперь мы можем выполнить сегодняшнюю задачу. Завтра наше сегодняшнее представление задачи покажется наивным, по этому мы и его изменим.
Из-за чего бывает трудно работать с программами? В данный момент мне приходят в голову 4 причини:
— программы трудные для чтения, трудно модифицировать;
— программы в логике которой есть дублирование, трудно модифицировать;
— программы, которым нужно дополнительные функции, что требует изменения в работающем коде, трудно модифицировать,
— программы, реализующие сложную логику условных операторов, трудно модифицировать.Итак нам нужны программы которые легко читать, вся логика которых задана в одном и только одном месте, модификация которых не ставит под угрозу существующие функции и которые позволяют выражать условную логику возможно более простым способом.
Рефакторинг представляет собой процесс улучшения работающей программы не путем изменения ее функций, а путем усиления в ней указательных качеств, позволяющий продолжить разработку с высокой скоростью.
Кент Бек