Когда вы пишете приложение, которое должно читать и работать с двумя версиями данных одинаково, каков наилучший способ структурировать ваши классы для представления этих данных. Я придумал три сценария:
- Общая база / Конкретные дети
- Data Union
- Отдельные структуры
Пример 1 версии автомобиля
byte DoorCount
int Color
byte HasMoonroof
byte HasSpoiler
float EngineSize
byte CylinderCount
Версия 2 Car
byte DoorCount
int Color
enum:int MoonRoofType
enum:int TrunkAccessories
enum:int EngineType
Общая база / Конкретные дети
При использовании этого метода существует базовый класс общих полей между двумя версиями данных и дочерним классом для каждой версии данных.
class Car {
byte DoorCount;
int Color;
}
class CarVersion1 : Car {
byte HasMoonroof;
byte HasSpoiler;
float EngineSize;
byte CylinderCount;
}
class CarVersion2 : Car {
int MoonRoofType;
int TrunkAccessories;
int EngineType;
}
1024 * Сильные стороны *
Слабые стороны
- Существующие дочерние классы должны будут измениться, если будет выпущена новая версия, удаляющая общее поле
- Данные для одной концептуальной единицы разделены между двумя определениями не из-за какого-либо значимого для нее деления.
Объединение данных
Здесь Car определяется как объединение полей Car во всех версиях данных.
class Car {
CarVersion version;
byte DoorCount;
int Color;
int MoonRoofType; //boolean if Version 1
int TrunkAccessories; //boolean if Version 1
int EngineType; //CylinderCount if Version 1
float EngineSize; //Not used if Version2
}
Сильные стороны
- Хм ... Все в одном месте.
Слабые стороны * * тысяча пятьдесят-одна
- Принудительный регистр, управляемый кодом.
- Сложно поддерживать, когда выпускается другая версия или удаляется устаревшая.
- Трудно осмыслить. Значения полей изменились в зависимости от версии.
Отдельные структуры
Здесь структуры не имеют ООП-отношений друг с другом. Однако интерфейсы могут быть реализованы обоими классами, если / когда код ожидает, что они будут обрабатывать их одинаково.
class CarVersion1 {
byte DoorCount;
int Color;
byte HasMoonroof;
byte HasSpoiler;
float EngineSize;
byte CylinderCount;
}
class CarVersion2 {
byte DoorCount;
int Color;
int MoonRoofType;
int TrunkAccessories;
int EngineType;
}
Сильные стороны
- Простой подход
- Простота обслуживания, если добавлена новая версия или удалено устаревшее.
Слабые стороны
Есть ли лучший способ, о котором я не думал? Вероятно, очевидно, что я предпочитаю последнюю методологию, но лучше ли первая?