Читать «Рефакторинг с использованием шаблонов» онлайн - страница 210

Джошуа Кериевски

J Скомпилируйте и протестируйте.

Когда вы завершите данный рефакторинг, у вас может возникнуть желание удалить неиспользуемые параметры с помощью рефакторинга Remove Parameter [15].

Пример

Этот пример возник при выполнении мною рефакторинга Move Embellishment to Decorator (с. 174). Класс синтаксического анализатора HTML DecodingNode содержит поле delegate, которому в конструкторе DecodingNode присваивается значение нового экземпляра StringNode.

public class DecodingNode implements Node...

private Node delegate;

public DecodingNode(StringBuffer textBuffer, int textBegin, int textEnd) { delegate = new StringNode(textBuffer, textBegin, textEnd);

}

Я применил описанный рефакторинг к данному коду.

1. Поскольку полю delegate значение присваивается в конструкторе DecodingNode, я могу перейти к следующему шагу.

2. Я применил рефакторинг Add Parameter [ 15] и использовал значение по умолчанию new StringNode(textBuffer,textBegin, textEnd). Затем я изменил инструкцию присвоения так, чтобы она присваивала полю delegate значение параметра newDelegate.

public class DecodingNode implements Node...

private Node delegate;

public DecodingNode(StringBuffer textBuffer, int textBegin, int textEnd, Node newDelegate) {

delegate = newDelegate; )

Это изменение влечет за собой обновление кода клиента StringNode таким образом, чтобы он передавал значение для newDelegate.

public class StringNode...

return new DecodingNode( new StringNode(textBuffer, textBegin, textEnd) ) ;

Я скомпилировал и протестировал код, чтобы убедиться в корректности выполненной работы.

Завершив данный рефакторинг, я несколько раз применил Remove Parameter [15], после чего конструктор DecodingNode выглядит так, как показано ниже.

public class DecodingNode implements Node...

private Node delegate;

public DecodingNode (Str-ingBuffer textBuffer-, int textBegin, int textEnd, Node newDelegate) {

delegate = newDelegate;

}

Вот и все об этом коротком и приятном рефакторинге.

Послесловие

Вернемся на минутку в школу, где учитель на уроках алгебры рассказывал о различных приемах, например: “прибавьте одно и то же значение с обеих сторон уравнения” или “свойство коммутативности слежения позволяет нам поменять местами слагаемые”. Затем, после нескольких недель таких рассказов, учитель добирался до задач “Из пункта А в пункт Б...”. Поборов первоначальное чувство паники (разве, прочитав предыдущее предложение, вы не вздрогнули даже сейчас?), вы садились и переводили задачу на язык алгебраических уравнений, а затем применяли рассказанные учителем правила для получения верного ответа.

Шаблоны проектирования представляют собой условия задач в мире программирования, а рефакторинг — алгебру. Книга, которую вы прочитали, содержит ряд подобного рода задач с решениями, выраженными в виде операций рефакторинга. Кто-то попытается прочитать книгу и запомнить шаги, реализующие эти шаблоны. Кто-то будет читать книгу и требовать, чтобы эти рефакторинги были немедленно добавлены в имеющийся инструментарий программирования. Однако оба подхода неверны. Истинная ценность этой книги не в конкретных шагах для достижения определенной цели, но в понимании процесса, ведущего к этим шагам. Научившись мыслить в терминах алгебры рефакторингов, вы научитесь решать стоящие перед вами задачи проектирования и не будете ограничены небольшим подмножеством задач, представленных в этой книге.