Каков шаблон проектирования для простого обеспечения обратной совместимости файлов данных?

Мы разрабатываем настольное приложение, которое идет в версии. Мы сохраняем данные в файл (в котором есть версия, в которой они сохранены) и открываем его позже для работы с ним. Поскольку наша модель данных постоянно меняется в зависимости от версий, мы продолжаем добавлять такие API, как upgrade_from_ver1_to_ver2. Это становится беспорядочным, так как мы сейчас находимся в версии 10.0. Мы также постепенно прекращаем поддерживать старые версии (скажем, файлы, сохраненные до 4.0). Можете ли вы предложить лучший способ или шаблон проектирования для сохранения и обеспечения обратной совместимости?

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

2

Решение

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

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

3

Другие решения

Первое, что нужно сделать, — это создать отдельный класс (классы) для сохранения ваших данных, чтобы ваши объекты данных не были обременены ответственностью за сохранение.

Далее я бы использовал шаблон шаблона, определяющий основы вашей операции чтения / открытия. Ваш AbstractReader класс может просто определить один Read метод. Затем вы можете создать классы, наследующие от AbstractReader — потенциально один для каждой версии файла. Затем вы можете использовать абстрактный шаблон фабрики, чтобы определить версию открываемого файла, а затем вернуть соответствующий Reader реализация для этой версии.

0