Входит в Эффективная работа с унаследованным кодом “Эффективная работа с унаследованным кодом”
@sprout-method:Отведение метода (метод-росток)
Если новая функциональность может быть выражена в виде абсолютно нового кода, поместите ее в новый отдельный метод. Вызовите этот метод из всех нужных мест.
- Определите место, в котором необходимо внесение изменений.
- В случае, если изменения могут быть выражены в виде единой и неразрывной последовательности операторов, добавьте вызов нового (еще не существующего) метода в месте, где необходима эта функциональность, и закомментируйте вызов.
- Определите, какие локальные переменные из исходного метода понадобятся в новом методе и передайте их в качестве аргументов.
- Определите, должен ли “отведенный” метод возвращать какое-либо значение в исходный метод. Если да, измените вызов таким образом, чтобы присвоить его возвращаемое значение переменной.
- Напишите “отведенный” метод, предпочтительно с использованием TDD. В любом случае, покройте новый код тестами.
- Раскомментируйте вызов метода, чтобы подключить функциональность.
Вынесение новой функциональности в отдельный метод куда лучше, чем ее встраивание в существующий код.
Новый метод можно создать как public static
, чтобы облегчить тестирование.
Использование такого подхода позволяет четко разделить старый и новый код. Более того, все изменения сконцентрированы в одном месте, где можно увидеть все затронутые переменные, что позволит в дальнейшем определить, принадлежит ли данный код этому контексту.
@sprout-class:Отведение класса (класс-росток)
Этот метод стоит применять в том случае, если класс, в который планируется добавить новое поведение, слишком сложно поместить в тестовую среду. Также этим методом стоит воспользоваться, если добавляемое поведение не является частью абстракции, выраженной в существующем классе (например, проверки дат в классах, которые выполняют другую бизнес-функцию).
Вновь созданный класс вполне может впоследствии оказаться частью какой-нибудь более серьезной концепции.
- Определите место, в котором необходимо внесение изменений.
- В случае, если изменения могут быть выражены в виде единой и неразрывной последовательности операторов, придумайте хорошее имя для класса, который будет инкапсулировать эти изменения. Затем получите экземпляр этого класса в нужном месте старого кода и вызовите его метод, выполняющий новую операцию. Закомментируйте эти строки.
- Определите, какие локальные переменные из исходного метода понадобятся в методе нового класса и передайте их в качестве аргументов в конструктор класса.
- Определите, должен ли “отведенный” класс возвращать какое-либо значение в исходный метод. Если да, создайте метод в новом классе, позволяющий получить требуемые значения.
- Напишите код нового класса.
- Раскомментируйте строки получения экземпляра и вызова его метода.