.net - microservicios - Manera funcional de implementar diseño impulsado por dominio.
domain driven design (4)
Este es un ejemplo de una implementación idiomática de F #: Diseño controlado por dominio con F # y EventStore
Descargo de responsabilidad: Soy el autor.
He tenido mucha experiencia en la escritura de aplicaciones controladas por dominios usando C #. Cuantas más aplicaciones escribo, más me parece que quiero adoptar un enfoque que no encaja bien con las técnicas estándar de C # / OO:
- Quiero escribir tantas funciones puras como sea posible porque son realmente fáciles de probar.
- Quiero escribir mi lógica de negocios de una manera más declarativa.
Así que he estado buscando en lenguajes funcionales como F #. Después de todo, no hay ninguna razón por la que el diseño controlado por dominio deba implementarse utilizando OO.
Me preguntaba si alguien tiene alguna idea o experiencia con el diseño de diseño impulsado por Dominio mientras usa un lenguaje funcional. Especialmente:
- ¿Cómo sería un modelo de dominio funcional?
- ¿Cómo abstraería la capa de acceso a datos del modelo de dominio?
Hay una nueva idea de usar Clojure (una versión moderna de Lisp), que es un lenguaje funcional, para crear modelos de dominio. Esta presentación es una introducción bastante buena (y también es una demostración impresionante de HTML5).
En pocas palabras, la actitud funcional es genial cuando se combina con Event Sorcing. Te permite crear modelos totalmente verificables muy fácilmente. Y si no quiere saltar a un lenguaje completamente nuevo en este momento, C # moderno es un lenguaje bastante bueno para escribir código de tipo funcional (al menos para implementar modelos de dominio comunes)
Pregunta antigua pero sorprendentemente aún hoy relevante.
Que yo sepa, el mejor (¿solo?) Libro sobre Diseño Dirigido por Dominio Funcional es el Modelado de Dominio Hecho Funcional , escrito por Scott Wlaschin, el autor de F # para diversión y beneficio (mencionado anteriormente).
Antes de sumergirse en el libro, la charla de patrones de diseño de programación funcional es un gran resumen de los conceptos (Sugerencia: no hay un patrón :)
Los ejemplos están en F # pero son fáciles de traducir a cualquier otro lenguaje funcional con tipos algebraicos (Haskell y PureScript en mi caso).
Descargo de responsabilidad: solo tengo un conocimiento vago sobre el diseño impulsado por el dominio, por lo que la respuesta puede no usar los términos correctos y puede estar demasiado centrada en el código en lugar de conceptos generales, pero aquí hay algunas ideas de todos modos ...
El enfoque en entender el dominio en lugar de diseñar características u objetos específicos para implementarlos parece muy natural en cómo las personas usan los lenguajes de programación funcionales en general. Muy a menudo (al menos en una parte de una aplicación funcional), comienza por diseñar una estructura de datos que describe (o modela) el mundo con el que está trabajando. La estructura de datos está separada de la implementación, por lo que modela bien el dominio.
Un buen ejemplo se describe en un documento sobre la composición de contratos financieros . El ejemplo es una solicitud de valoración (y otro procesamiento) de contratos financieros. Lo más importante es crear un modelo de los contratos, ¿qué son en realidad? Para responder a eso, los autores diseñan una estructura de datos para describir los contratos. Algo como:
type Contract =
| Zero // No trades
| Single of string * float // Single trade (buy something for some price)
| And of Contract * Contract // Combine two contracts
| Until of Contract * DateTime // Contract that can be executed only until...
// (...)
Hay algunos otros casos, pero la estructura de datos es muy simple y modela una amplia gama de contratos bastante complejos que se utilizan en la industria financiera.
En resumen , creo que el enfoque en las estructuras de datos que se utilizan para modelar el mundo (y están separadas de la implementación que las utiliza) está muy cerca de los conceptos clave de DDD.