Me pregunto si debería cambiar la arquitectura del software de uno de mis proyectos.¿Es una buena práctica anular la funcionalidad heredada que no se usará?
Estoy desarrollando un software para un proyecto en el que dos lados (de hecho, un host y un dispositivo) usan código compartido. Eso ayuda porque los datos compartidos, p. las enumeraciones se pueden almacenar en un lugar central.
Estoy trabajando con lo que llamamos un "canal" para transferir datos entre el dispositivo y el host. Cada canal debe implementarse en el dispositivo y el lado del host. Tenemos diferentes tipos de canales, ordinarios y canales especiales que transfieren datos de medición.
Mi solución actual tiene el código compartido en una clase base abstracta. A partir de ahí, el código se divide entre los dos lados. Como ha resultado, hay algunos casos en los que habríamos compartido código pero no podemos compartirlo, tenemos que implementarlo en cada lado.
El principio de DRY (no te repitas) dice que no deberías tener código dos veces.
Mi idea era concatenar la funcionalidad de p. Ej. el canal de medición abstracto en el lado del dispositivo y el lado del host en una clase abstracta con código compartido. Sin embargo, eso significa que una vez que creamos una clase real para el dispositivo o el lado del host para ese canal, tenemos que ocultar la funcionalidad que utiliza el otro lado.
es esto una cosa aceptable para hacer:
public abstract class ChannelAbstract
{
protected void ChannelAbstractMethodUsedByDeviceSide() { }
protected void ChannelAbstractMethodUsedByHostSide() { }
}
public abstract class MeasurementChannelAbstract : ChannelAbstract
{
protected void MeasurementChannelAbstractMethodUsedByDeviceSide() { }
protected void MeasurementChannelAbstractMethodUsedByHostSide() { }
}
public class DeviceMeasurementChannel : MeasurementChannelAbstract
{
public new void MeasurementChannelAbstractMethodUsedByDeviceSide()
{
base.MeasurementChannelAbstractMethodUsedByDeviceSide();
}
public new void ChannelAbstractMethodUsedByDeviceSide()
{
base.ChannelAbstractMethodUsedByDeviceSide();
}
}
public class HostMeasurementChannel : MeasurementChannelAbstract
{
public new void MeasurementChannelAbstractMethodUsedByHostSide()
{
base.MeasurementChannelAbstractMethodUsedByHostSide();
}
public new void ChannelAbstractMethodUsedByHostSide()
{
base.ChannelAbstractMethodUsedByHostSide();
}
}
Ahora, DeviceMeasurementChannel
está utilizando sólo la funcionalidad para el lado del dispositivo de MeasurementChannelAbstract
. Al declarar todos los métodos/miembros de MeasurementChannelAbstract protected
, debe usar la palabra clave new
para permitir el acceso a esa funcionalidad desde el exterior.
¿Eso es aceptable o hay algún inconveniente, advertencia, etc. que pueda surgir más tarde al usar el código?
¿Has dicho en varios lugares que comparten código y luego en varios otros lugares en los que has tenido que implementar algo por separado? ¿Qué es exactamente lo que se comparte entre ellos que te impide dividirlos? –
@Jon Cage: en este momento (antes de cambiar la arquitectura sw al ejemplo anterior) tengo DeviceMeasurementChannelAbstract y HostMeasurementChannelAbstract. Uno para el lado del dispositivo y otro para el lado del host. Los dos canales heredan de DeviceChannelAbstract y de HostChannelAbstract, respectivamente. Estos dos heredan de una clase abstracta compartida llamada ChannelAbstract. Ahora tengo dos variables que todos los canales de medición deben tener pero no los canales ordinarios. Ese es el problema. Espero que esto lo aclare más de lo que te confundió: S –