Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Бек К. -> "Экстремальное программирование: разработка через тестирование " -> 68

Экстремальное программирование: разработка через тестирование - Бек К.

Бек К. Экстремальное программирование: разработка через тестирование — СПб.: Питер, 2003. — 224 c.
ISBN 5-8046-0051-6
Скачать (прямая ссылка): bek-k..pdf
Предыдущая << 1 .. 62 63 64 65 66 67 < 68 > 69 70 71 72 73 74 .. 81 >> Следующая


Move Method (Перемещение метода)

Каким образом метод можно переместить в новое место, где он должен находиться? Добавьте его в класс, к которому он должен принадлежать, затем обратитесь к нему.

Как

1. Скопируйте метод в буфер обмена.

2. Вставьте метод в целевой класс. Присвойте ему подобающее имя. Откомпилируйте его.

3. Если внутри метода происходит обращение к изначальному объекту, добавьте в метод параметр, при помощи которого внутрь метода будет передаваться изначальный объект. Если внутри метода происходит обращение к переменным-членам изначального объекта, передавайте их в виде параметров. Если внутри метода переменным-членам изначального объекта присваиваются значения, вы должны отказаться от идеи переноса метода в новый объект.

4. Замените тело изначального метода обращением к новому методу.

Зачем

Это один из моих самых любимых рефакторингов, выполняемых в процессе консультирования. Дело в том, что он наиболее эффективно демонстрирует неправильные предположения относительно дизайна кода. Вычисление площади — это обязанность объекта Shape (форма):

Shape

int width= bounds.righto - bounds.leftO; int height= bounds.bottomO - bounds.topO; int area= width * height:

Каждый раз, когда я вижу, что внутри метода, принадлежащего одному объекту, происходит обращение к нескольким методам другого объекта, я начинаю смотреть на код с подозрением. В данном случае я вижу, что в методе, принадлежащем объекту Shape, происходит обращение к четырем методам объекта bounds (класс • Rectangle). Пришло время переместить эту часть метода в класс Rectangle:

Rectangle

public int areaO {

int width= this.righto - this.leftO: int height= this.bottomO - this.topO:

return width * height: '

Shape

int area- bounds.areaO:

Рефакторинг Move Method (Перемещение метода) обладает тремя важными преимуществами:

• Очень легко увидеть необходимость применения этого рефакторинга, при этом не требуется глубокое понимание смысла кода. Как только вы увидите два или больше сообщения, адресованных другому объекту, значит, можно смело приступать.

• Механика выполнения рефакторинга быстра и безопасна.

• Результаты зачастую приводят к просветлению. «Но класс Rectangle не выполняет никаких вычислений... О! Теперь я вижу. Так действительно лучше.»

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

Method Object (Метод в объект)

Каким образом лучше всего реализовать сложный метод, использующий несколько параметров и локальных переменных? Преобразуйте метод в отдельный объект.

Как

1. Создайте класс с таким же количеством параметров, как и оригинальный метод.

2. Сделайте локальные переменные метода экземплярными переменными нового класса.

3. Определите в новом классе метод с именем run(). Тело этого метода будет таким же, как и тело оригинального метода.

4. В оригинальном методе создайте новый объект и обратитесь к методу run() этого объекта.

Зачем

Объекты-методы полезны в качестве подготовительного этапа перед добавлением в систему абсолютно нового вида внутренней логики. Например, представьте, что для вычисления общего денежного потока используется несколько разных методов, позволяющих учесть в вычислении несколько разных компонентов общего денежного потока. Вначале вы можете создать объект-метод, вычисляющий

общий денежный поток первым способом. Затем вы можете описать следующий способ вычислений при помощи тестов меньшего масштаба. После этого добавление в программу нового способа вычислений будет несложным делом.

Объекты-методы также позволяют упростить код, в отношении которого неудобно использовать Extract Method (Выделение метода). В некоторых ситуациях вы вынуждены иметь дело с блоком кода, который работает с обширным набором временных переменных и параметров, и каждый раз, когда вы пытаетесь выделить хотя бы часть этого кода в отдельный метод, вы вынуждены переносить в новый метод пять или шесть временных переменных и параметров. Результирующий выделенный метод выглядит ничем не лучше, чем изначальный код, так как его сигнатура слишком длинна. В результате создания объекта-метода вы получаете в свое распоряжение новое пространство имен, в рамках которого вы можете извлекать методы, без необходимости передачи в них каких-либо параметров.

Add Parameter (Добавление параметра)

Каким образом можно добавить в метод новый параметр?

Как

1. Если метод входит в состав интерфейса, вначале добавьте параметр в интерфейс.

2. Добавьте параметр.

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

Зачем

Добавление параметра зачастую связано с расширением функциональности. Чтобы обеспечить срабатывание первого теста, вы написали код без параметра, однако далее условия изменились, и для корректного выполнения вычислений вам необходимо принять во внимание дополнительные данные.
Предыдущая << 1 .. 62 63 64 65 66 67 < 68 > 69 70 71 72 73 74 .. 81 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100