Книга: Экстремальное программирование. Разработка через тестирование
Миграция данных (Migrate Data)
Миграция данных (Migrate Data)
Как можно перейти от одного представления к другому? Временно дублируйте данные.
Как
Вначале рассмотрим версию «от внутреннего к внешнему». В рамках этого подхода вы изменяете вначале внутреннее представление, а затем внешний интерфейс.
1. Создайте переменную экземпляра в новом формате.
2. Инициализируйте переменную нового формата везде, где инициализируется переменная старого формата.
3. Используйте переменную нового формата везде, где используется переменная старого формата.
4. Удалите старый формат.
5. Измените внешний интерфейс так, чтобы использовать новый формат.
Однако в некоторых ситуациях удобнее сначала изменить API. В этом случае рефакторинг выполняется следующим образом.
1. Добавьте параметр в новом формате.
2. Обеспечьте преобразование параметра в новом формате во внутреннее представление, обладающее старым форматом.
3. Удалите параметр в старом формате.
4. Замените использование старого формата на использование нового формата.
5. Удалите старый формат.
Зачем
Проблема миграции данных возникает каждый раз, когда используется шаблон «От одного ко многим» (One to Many). Предположим, что мы хотим реализовать объект TestSuite, используя шаблон «От одного ко многим» (One to Many). Мы можем начать так:
def testSuite(self):
suite = TestSuite()
suite.add(WasRun("testMethod"))
suite.run(self.result)
assert("1 run, 0 failed" == self.result.summary())
Чтобы реализовать этот тест, начнем с одного элемента test:
class TestSuite:
def add(self, test):
self.test = test
def run(self, result):
self.test.run(result)
Теперь мы приступаем к дублированию данных. Вначале инициализируем коллекцию тестов:
TestSuite
def __init__(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.
- Согласование различий (Reconcile Differences)
- Изоляция изменений (Isolate Change)
- Миграция данных (Migrate Data)
- Выделение метода (Extract Method)
- Встраивание метода (Inline Method)
- Выделение интерфейса (Extract Interface)
- Перемещение метода (Move Method)
- Метод в объект (Method Object)
- Добавление параметра (Add Parameter)
- Параметр метода в параметр конструктора (Method Parameter to Constructor Parameter)
- Резервное копирование базы данных InterBase
- Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
- Резервное копирование многофайловых баз данных
- Восстановление из резервных копий многофайловых баз данных
- Владелец базы данных
- ЧАСТЬ IV. База данных и ее объекты.
- Почему необходима миграция
- Миграция между различными версиями InterBase
- Прямая миграция
- Особый процесс, или обратная миграция
- Перевод базы данных InterBase 6.x на 3-й диалект
- Типы данных для работы с датой и временем