Cuando está escribiendo una aplicación que necesita leer y trabaja con dos versiones de datos de la misma manera, ¿cuál es la mejor manera de estructurar sus clases para representar esos datos? He llegado con tres escenarios:¿Cuál es la forma preferida de almacenar diferentes versiones de datos?
- Common Base/Niños específicos
- Unión de Datos
- estructuras distintas
Versión 1 Ejemplo de coches
byte DoorCount
int Color
byte HasMoonroof
byte HasSpoiler
float EngineSize
byte CylinderCount
Versión 2 coches
byte DoorCount
int Color
enum:int MoonRoofType
enum:int TrunkAccessories
enum:int EngineType
Common Base/Niños específicos
Con este método, no es una clase base de los campos comunes entre las dos versiones de los datos y una clase secundaria para cada versión de los datos.
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;
}
fuertes
- POO Paradigma
debilidades
- existente clases niño tendrá que cambiar si una nueva versión es liberada que elimina un campo común
- Datos para una conc La unidad ética se divide entre dos definiciones, no debido a ninguna división significativa para sí misma.
Unión de Datos
Aquí, un coche se define como la unión de los campos de coches en todas las versiones de los datos.
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
}
fuertes
- Um ... todo está en un solo lugar.
debilidades
- código de caja impulsado forzado.
- Difícil de mantener cuando se lanza otra versión o se elimina la herencia.
- Difícil de conceptualizar. El significado de los campos cambió según la versión.
estructuras distintas
Aquí las estructuras de programación orientada a objetos no tienen ninguna relación entre sí.Sin embargo, ambas clases pueden implementar interfaces si/cuando el código espera tratarlas de la misma manera.
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;
}
fuertes
- enfoque directo
- fácil de mantener si se añade una nueva versión o se retira legado.
debilidades
- Es un anti-patrón.
¿Hay alguna otra manera mejor en la que no haya pensado? Probablemente sea obvio que estoy a favor de la última metodología, pero ¿es la primera mejor?
Bueno, tal vez dije que la última opción era un antipatrón porque no usa una clase base para dos representaciones del "mismo" objeto conceptual. "difícilmente resulta que la clase base esté tan cerca de sus herederos" - Sí, simplemente estaba tratando de idear un pequeño ejemplo para demostrar las metodologías. Entonces, ¿debo entender que recomendaría la tercera opción y que eso cambiaría a la primera si fuera necesario a medida que se escribía el código de la aplicación? –
Sí, ese fue un resumen vergonzosamente breve de mi (larga) respuesta. –
Estoy totalmente de acuerdo. –