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

 

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

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

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


Isolate Change (Изоляция изменений)

Каким образом можно модифицировать одну часть метода или объекта, состоящего из нескольких частей? Вначале изолируйте изменяемую часть.

Мне приходит в голову аналогия с хирургической операцией: фактически все тело оперируемого пациента покрыто специальной простыней за исключением места, в котором, собственно, осуществляется операция. Благодаря такому покрытию хирург имеет дело с фиксированным набором переменных. Перед выполнением операции врачи сколь угодно долго могут обсуждать, какое влияние на

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

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

Для изоляции изменений можно использовать несколько разных способов. Наиболее часто используется Extract Method (Выделение метода), помимо него также используются Extract Object (Выделение объекта) и Method Object (Метод в объект).

Migrate Data (Миграция данных)

Каким образом можно перейти от одного представления к другому? Временно дублируйте данные.

Как

Вначале рассмотрим версию «от внутреннего к внешнему». В рамках этого подхода вы вначале изменяете внутреннее представление, а затем меняете внешний

интерфейс.

1. Создайте экземплярную переменную в новом формате.

2. Инициализируйте переменную нового формата везде, где инициализируется переменная старого формата.

3. Используйте переменную нового формата везде, где используется переменная старого формата.

4. Удалите старый формат.

5. Измените внешний интерфейс таким образом, чтобы использовать новый

формат.

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

1. Добавьте параметр в новом формате.

2. Обеспечьте преобразование параметра в новом формате во внутреннее представление, обладающее старым форматом.

3. Удалите параметр в старом формате.

4. Замените использование старого формата на использование нового формата.

5. Удалите старый формат.

Зачем

Проблема миграции данных возникает каждый раз, когда вы используете паттерн One to Many (От одного ко многим). Предположим, что мы хотим реализовать объект TestSuite, используя паттерн One to Many (От одного ко многим). Мы можем начать так:

def testSuite(self): suite= TestSuiteO sui te.add(WasRunC"testMethod")) suite.run(self.result)

assertC'l run. 0 failed" == self .result.summaryO) Чтобы реализовать этот тест, начнем с одного элемента test: class TestSuite:

def add(self. test):

self.test= test def run(self. result): self.test.run(result)

Теперь мы приступаем к дублированию данных. Вначале инициализируем коллекцию тестов:

TestSuite

def _lnit_(self):

self.tests= []

В каждом месте, где инициализируется поле test, мы добавляем новый тест в коллекцию:

TestSuite

def add(self, test): self.test= test self.tests.append(test)

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

TestSuite

def run(self. result): for test in self.tests: test.run(result)

Теперь можно удалить не используемую экземплярную переменную test:

TestSuite

def add(self. test): • self.tests.append(test)

Поэтапную миграцию данных можно использовать также при переходе между эквивалентными форматами, использующими различные протоколы, например, если речь идет о Java, при переходе от Vector/Enumerator к Collection/Iterator.

Extract Method (Выделение метода)

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

Как

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

1. Определите фрагмент кода, который можно выделить в отдельный метод. Хорошими кандидатами являются тела циклов, сами циклы, а также ветви условных операторов.

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