Входит в Эффективная работа с унаследованным кодом “Эффективная работа с унаследованным кодом”

@sprout-method:Отведение метода (метод-росток)

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

  1. Определите место, в котором необходимо внесение изменений.
  2. В случае, если изменения могут быть выражены в виде единой и неразрывной последовательности операторов, добавьте вызов нового (еще не существующего) метода в месте, где необходима эта функциональность, и закомментируйте вызов.
  3. Определите, какие локальные переменные из исходного метода понадобятся в новом методе и передайте их в качестве аргументов.
  4. Определите, должен ли “отведенный” метод возвращать какое-либо значение в исходный метод. Если да, измените вызов таким образом, чтобы присвоить его возвращаемое значение переменной.
  5. Напишите “отведенный” метод, предпочтительно с использованием TDD. В любом случае, покройте новый код тестами.
  6. Раскомментируйте вызов метода, чтобы подключить функциональность.

Вынесение новой функциональности в отдельный метод куда лучше, чем ее встраивание в существующий код.

Новый метод можно создать как public static, чтобы облегчить тестирование.

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

@sprout-class:Отведение класса (класс-росток)

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

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

  1. Определите место, в котором необходимо внесение изменений.
  2. В случае, если изменения могут быть выражены в виде единой и неразрывной последовательности операторов, придумайте хорошее имя для класса, который будет инкапсулировать эти изменения. Затем получите экземпляр этого класса в нужном месте старого кода и вызовите его метод, выполняющий новую операцию. Закомментируйте эти строки.
  3. Определите, какие локальные переменные из исходного метода понадобятся в методе нового класса и передайте их в качестве аргументов в конструктор класса.
  4. Определите, должен ли “отведенный” класс возвращать какое-либо значение в исходный метод. Если да, создайте метод в новом классе, позволяющий получить требуемые значения.
  5. Напишите код нового класса.
  6. Раскомментируйте строки получения экземпляра и вызова его метода.