Estoy intentando aplicar el patrón de estrategia a una situación particular, pero tengo un problema con cómo evitar acoplar cada estrategia concreta al objeto de contexto que proporciona datos para él. El siguiente es un caso simplificado de un patrón que ocurre de diferentes maneras, pero debe manejarse de manera similar.Evitando el acoplamiento con el patrón de estrategia
Tenemos un objeto Acquisition
que proporciona datos relevantes para un marco de tiempo específico, básicamente un conjunto de datos externos recopilados utilizando diferentes piezas de hardware. Ya es demasiado grande debido a la cantidad de datos que contiene, por lo que no quiero darle ninguna otra responsabilidad. Ahora necesitamos tomar algunos de estos datos y, de acuerdo con alguna configuración, enviar un voltaje correspondiente a una pieza de hardware.
Por lo tanto, imaginar el (muy simplificado) clases siguientes:
class Acquisition
{
public Int32 IntegrationTime { get; set; }
public Double Battery { get; set; }
public Double Signal { get; set; }
}
interface IAnalogOutputter
{
double getVoltage(Acquisition acq);
}
class BatteryAnalogOutputter : IAnalogOutputter
{
double getVoltage(Acquisition acq)
{
return acq.Battery;
}
}
Ahora, todas las clases estrategia concreta tiene que acoplarse a mi clase de adquisición, que es también una de las clases más probabilidades de ser modificado desde es esencial para nuestra aplicación. Esto sigue siendo una mejora con respecto al diseño antiguo, que era una declaración de cambio gigante dentro de clase Acquisition
. Cada tipo de datos puede tener un método de conversión diferente (mientras que la batería es un simple paso, otros no son tan simples), así que creo que el patrón de estrategia o similar debería ser el camino a seguir.
También notaré que en la implementación final, IAnalogOutputter
sería una clase abstracta en lugar de una interfaz. Estas clases estarán en una lista configurable por el usuario y serializada en un archivo XML. La lista debe poder editarse en tiempo de ejecución y recordarse, por lo que Serializable debe ser parte de nuestra solución final. En caso de que haga una diferencia.
¿Cómo puedo garantizar que cada clase de implementación obtenga los datos que necesita para trabajar, sin vincularlos a una de mis clases más importantes? ¿O me estoy acercando a este tipo de problema de la manera completamente incorrecta?
Para aclarar: los datos de adquisición contienen aproximadamente 20 elementos de información, todos los cuales serán utilizados por varios generadores de voltaje. Cada implementación solo usaría una pieza de datos, pero habrá el mismo número (20) de diferentes implementaciones posibles de un generador de voltaje. Entonces, ¿cómo puedo pasar de 'Acquisition' a" otra clase [para] pasarlo a los implementadores de estrategias "? Buen punto acerca de la serialización sin embargo, lo consideraré con seguridad. – drharris