An interesting thread surgió cuando escribí esta pregunta en este momento. Sin embargo, no creo que responda mi pregunta.¿Puede un "modelo de dominio enriquecido" violar el principio de responsabilidad única?
He estado trabajando mucho con .NET MVC3, donde es deseable tener un modelo anémico. Ver modelos y editar modelos es mejor que nada como contenedores de datos estúpidos que puedes pasar de un controlador a una vista. Cualquier tipo de flujo de aplicaciones debería provenir de los controladores, y las vistas manejan las preocupaciones de UI. En MVC, no queremos ningún comportamiento en el modelo.
Sin embargo, tampoco queremos lógica comercial en los controladores. Para aplicaciones más grandes es mejor mantener el código de dominio separado e independiente de los modelos, vistas y controladores (y HTTP en general para el caso). Entonces, hay un proyecto separado que proporciona, antes que nada, un modelo de dominio (con entidades y objetos de valor, compuestos en agregados de acuerdo con DDD).
He hecho algunos intentos para pasar de un modelo anémico a uno más rico en el código de dominio, y estoy pensando en renunciar. Me parece que tener clases de entidades que contienen datos y comportamiento viola el SRP.
Tomemos como ejemplo un escenario muy común en la web, componiendo correos electrónicos. Dado algún evento, es responsabilidad del dominio componer un objeto EmailMessage dado un EmailTemplate, EmailAddress y valores personalizados. La plantilla existe como una entidad con propiedades y el usuario proporciona valores personalizados como entrada. Digamos también por el argumento de que la dirección FROM de EmailMessage puede ser provista por un servicio externo (IConfigurationManager.DefaultFromMailAddress). Teniendo en cuenta estos requisitos, se parece como un modelo de dominio rico podría dar la EmailTemplate la responsabilidad de componer la EmailMessage:
public class EmailTemplate
{
public EmailMessage ComposeMessageTo(EmailAddress to,
IDictionary<string, string> customValues, IConfigurationManager config)
{
var emailMessage = new EmailMessage(); // internal constructor
// extension method
emailMessage.Body = this.BodyFormat.ApplyCustomValues(customValues);
emailMessage.From = this.From ?? config.DefaultFromMailAddress;
// bla bla bla
return emailMessage;
}
}
Este fue uno de mis intentos de modelo de dominio rico. Sin embargo, después de agregar este método, era responsabilidad de EmailTemplate contener las propiedades de los datos de la entidad y redactar los mensajes. Tenía alrededor de 15 líneas, y parecía distraer a la clase de lo que realmente significa ser una EmailTemplate, que, IMO, solo almacena datos (formato de sujeto, formato del cuerpo, archivos adjuntos y direcciones opcionales desde/respuesta a))
Terminé refaccionando este método en una clase dedicada, cuya única responsabilidad es componer un mensaje de correo electrónico dados los argumentos anteriores, y estoy mucho más feliz con él. De hecho, estoy empezando a preferir los dominios anémicos porque me ayuda a mantener las responsabilidades separadas, haciendo que las clases y las pruebas de unidad sean más cortas, más concisas y más centradas. Parece que hacer que las entidades y otros objetos de datos "carezcan de comportamiento" puede ser bueno para separar la responsabilidad. ¿O estoy fuera de pista aquí?
Un modelo de dominio enriquecido debe ser rico solo lo suficiente para el contexto donde sea relevante. –