Supongamos que tenemos un objeto que representa la configuración de una pieza de hardware. Por el bien de la discusión, un controlador de temperatura (TempController). Contiene una propiedad, la temperatura de consigna.La forma orientada a objetos para separar el modelo de su representación
Necesito guardar esta configuración en un archivo para usar en otro dispositivo. El formato de archivo (FormatA) está configurado en piedra. No quiero que el objeto TempController sepa sobre el formato de archivo ... simplemente no es relevante para ese objeto. Así que hago otro objeto, "FormatAExporter", que transforma TempController en el resultado deseado.
Un año más tarde fabricamos un nuevo controlador de temperatura, llamémoslo "AdvancedTempController", que no solo tiene un punto de referencia sino que también tiene control de velocidad, lo que significa una o dos propiedades más. También se inventa un nuevo formato de archivo para almacenar esas propiedades ... llamémoslo FormatB.
Ambos formatos de archivo son capaces de representar ambos dispositivos (supongamos que AdvancedTempController tiene valores predeterminados razonables si carece de configuraciones).
Este es el problema: sin utilizar 'isa' o alguna otra forma de "trampa" para averiguar qué tipo de objeto tengo, ¿cómo puede FormatBExporter manejar ambos casos?
Mi primer instinto es tener un método en cada controlador de temperatura que pueda proporcionar un cliente exportador para esa clase, por ejemplo, TempController.getExporter() y AdvancedTempController.getExporter(). Esto no es compatible con varios formatos de archivo.
El único otro enfoque que me viene a la mente es tener un método en cada controlador de temperatura que devuelva una lista de propiedades y sus valores, y luego el formateador puede decidir cómo generarlos. Funcionaría, pero parece complicado.
ACTUALIZACIÓN: En el futuro, este último enfoque no funciona bien. Si todos sus tipos son simples, podría ser así, pero si sus propiedades son Objetos, termina empujando el problema a un nivel inferior ... se ve obligado a devolver un par de valores de Cadena, Objeto, y el exportador tendrá que saber qué los Objetos en realidad deben hacer uso de ellos. Entonces solo lleva el problema a otro nivel.
¿Hay alguna sugerencia de cómo puedo mantener esto flexible?
Esto también hacer el código más comprobable, ya que a causa mucho más fácil burlarse de los colaboradores. –
Es un toque más elaborado de lo que había planeado, pero me gusta. Proporciona la flexibilidad de devolver todas las propiedades de una lista, pero conservando la información de tipo en toda la interfaz. Y definitivamente ayuda a la capacidad de prueba. –