Когда вы пишете приложение, которое должно читать и работать с двумя версиями данных таким же образом, как лучше всего структурировать классы для представления этих данных. Я придумал три сценария:Каков предпочтительный способ хранения различных версий данных?
- Общих баз/Отдельные дети
- Союза Data
- отдельных структуры
Версия 1 Пример автомобили
byte DoorCount
int Color
byte HasMoonroof
byte HasSpoiler
float EngineSize
byte CylinderCount
Version 2 автомобиля
byte DoorCount
int Color
enum:int MoonRoofType
enum:int TrunkAccessories
enum:int EngineType
Common Base/Особые дети
С помощью этого метода есть базовый класс общих полей между двумя версиями данных и дочерним классом для каждой версии данных.
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;
}
Сильные
- OOP Paradigm
Слабости
- Существующие дочерние классы должны измениться, если новая версия выпущена, который удаляет общее поле
- Данные для одного конца eptual unit разделяется между двумя определениями не из-за какого-либо деления, значимого для себя.
Союз данных
Здесь, автомобиль определяется как объединение полей автомобилей во всех версиях данных.
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;
}
Сильные
- прямолинейный подход
- Простота в обслуживании, если новая версия добавляется или удаляется наследство.
Слабости
- Это анти-модель.
Есть ли лучший способ, о котором я не думал? Вероятно, очевидно, что я предпочитаю последнюю методологию, но первая лучше?
Ну, может быть, я сказал, что последний вариант был анти-шаблоном, поскольку он не использует базовый класс для двух представлений «того же» концептуального объекта. «вряд ли получится, что базовый класс так близок к его наследникам» - Да, я просто пытался придумать короткий пример, чтобы продемонстрировать методологии. Итак, я должен понять, что вы будете отстаивать третий вариант и что это будет морфировать до первого, если необходимо, в виде кода приложения? –
Да, это было смущающе кратким изложением моего (длинного) ответа. –
Я полностью согласен. –