Forma funcional de implementar el diseño impulsado por el dominio


He tenido mucha experiencia con la escritura de aplicaciones basadas en dominio usando C#. Cuantas más aplicaciones escribo, más encuentro que quiero adoptar un enfoque que no encaja tan bien con las técnicas estándar de C#/OO:

  1. Quiero escribir tantas funciones puras como sea posible porque son realmente fáciles de probar.
  2. Quiero escribir mi lógica de negocios de una manera más declarativa.

Así que he estado buscando lenguajes funcionales como F#. Después de todo hay no hay razón por la que el diseño impulsado por dominio tenga para implementarse usando OO.

Me preguntaba si alguien tiene alguna idea/experiencia con hacer 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.
Author: Andy Skirrow, 2011-01-16

4 answers

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 excesivamente enfocada en código en lugar de conceptos generales, pero aquí hay algunas ideas de todos modos...

El enfoque en la comprensión del dominio en lugar de diseñar características u objetos específicos para implementarlos parece muy natural en la forma en que las personas usan los lenguajes de programación funcionales en general. Muy a menudo (al menos en una parte de un aplicación) comienza diseñando una estructura de datos que describa (o modele) el mundo con el que está trabajando. La estructura de datos está separada de la implementación, por lo que modela muy bien el dominio.

Un muy buen ejemplo se describe en documento sobre la composición de los 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, el 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.

Summary 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.

 13
Author: Tomas Petricek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-16 19:19:18

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 resumen, la actitud funcional es genial cuando se combina con el Sorcing de eventos. Le permite crear modelos completamente comprobables muy fácilmente. Y si no desea saltar a un lenguaje completamente nuevo en este momento, C # moderno es un lenguaje bastante bueno para escribir funcional-como código (al menos para la implementación de modelos de dominio comunes)

 5
Author: Szymon Pobiega,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-07 11:58:12

Aquí hay un ejemplo de una implementación idiomática de F#: Diseño basado en dominios Con F# y EventStore

Descargo de responsabilidad: Soy el autor.

 4
Author: eulerfx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-26 18:30:41

Vieja pregunta, pero sorprendentemente sigue siendo relevante hoy en día.

Que yo sepa, el mejor (solo?) el libro sobre el Diseño Basado en Dominios Funcionales es Domain Modeling Made Functional, escrito por Scott Wlaschin, el autor de F# for fun and profit (mencionado anteriormente).

Antes de sumergirse en el libro, la charla Patrones de Diseño de Programación Funcional es un gran resumen de los conceptos (Pista: no hay patrón :)

Los ejemplos están en F# pero son fácil de traducir a cualquier otro lenguaje funcional con tipos algebraicos (Haskell y PureScript en mi caso).

 2
Author: Mathieu François,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-27 01:42:50