Hay una parte de nuestra base de código escrita en el siguiente estilo:
// IScheduledTask.cs
public interface IScheduledTask
{
string TaskName { get; set; }
int TaskPriority { get; set; }
List<IScheduledTask> Subtasks { get; set; }
// ... several more properties in this vein
}
// ScheduledTaskImpl.cs
public class ScheduledTaskImpl : IScheduledTask
{
public string TaskName { get; set; }
public int TaskPriority { get; set; }
public List<IScheduledTask> Subtasks { get; set; }
// ... several more properties in this vein,
// perhaps a constructor or two for convenience.
}
Es decir, hay una gran cantidad de interfaces que especifican solo un conjunto de propiedades sin comportamiento, cada una con una única implementación correspondiente que las implementa con propiedades automáticas. El código está escrito por alguien bastante mayor (mucho más que yo) y está separado de este uso de interfaces de código de procedimiento razonable. Me preguntaba si alguien más había encontrado / usado este estilo y si tiene alguna ventaja sobre el uso de DTO concretos en todas partes sin las interfaces.
Respuestas:
Aquí están mis dos centavos:
ScheduledTask
,ScheduledJob
,ScheduledEvent
,ScheduledInspection
, etc, debe ser sólo una segregadosSchedulable
interfaz de hacer cualquier planificable implementador.TaxSheet
cambie el nombre de una clase concreta cuando algo importante en la forma en que se implementa cambia, por ejemplo, una clase concreta nombrada podría cambiarSessionAwareTaxSheet
porque se realizó una revisión importante, pero la interfazITaxSheet
probablemente no se cambiará de nombre tan fácilmente.Línea de fondo:
fuente
Un problema particular que he visto con los DTO que usan interfaces es que permite esto:
He visto este patrón aplicado como un truco rápido y sucio para implementar algunos comportamientos críticos. Esto lleva a un código que puede tener un comportamiento muy confuso:
Es difícil de mantener y confuso tratar de desenredar o refactorizar. En mi opinión, agregar comportamiento a los DTO viola el principio de responsabilidad única. El propósito de un DTO es representar los datos en un formato que puede ser persistido y poblado por un marco de persistencia.
Los DTO no son modelos de dominio. No deberíamos preocuparnos si los DTO son anémicos. Para citar la discusión de Martin Fowler sobre el modelo de dominio anémico :
fuente