2011-01-16 16 views
22

He tenido mucha experiencia en la escritura de aplicaciones controladas por dominio usando C#. Cuantas más aplicaciones que escribo más encuentro que quiero adoptar un enfoque que no encaja muy bien con las técnicas de C#/OO estándar:Forma funcional de implementar el diseño impulsado por dominio

  1. Quiero escribir tantas funciones puras como sea posible, ya que son realmente fácil de probar.
  2. 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 cual el diseño impulsado por dominio tenga para ser implementado usando OO.

Me preguntaba si alguien tiene alguna idea/experiencia con el diseño de diseño impulsado por Dominio al tiempo que utiliza 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.
+1

Esta es una muy buena pregunta y es algo en lo que estoy tratando de trabajar también. Creo que los ORM tradicionales no funcionarán en lenguajes funcionales como F # porque los valores son inmutables por defecto, pero siempre hay cambios en los datos que deberían persistir. En cuanto al modelo de dominio, supongo que podría ser algún tipo de biblioteca funcional compuesta de registros y uniones discriminadas. También existe la opinión de que FP puede no ser la opción correcta para escribir aplicaciones de usuario final, es más una tecnología para construir frameworks asincrónicos paralelos. ¡Me aseguraré de seguir esta discusión! – Hakeem

+0

Recomiendo leer la serie ["Diseñar con tipos"] (http://fsharpforfunandprofit.com/series/designing-with-types.html) en [F # para diversión y ganancias] (http://fsharpforfunandprofit.com /). – MattDavey

Respuesta

13

responsabilidad: sólo tengo un vago conocimiento sobre el diseño de dominio impulsada, por lo que la respuesta no puede utilizar los términos correctos y puede ser demasiado centrado en el código en lugar de conceptos generales, pero aquí están 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 la forma en que las personas usan los lenguajes de programación funcionales en general Alabama. Muy a menudo (al menos en una parte de una aplicación funcional) comienzas diseñando una estructura de datos que describe (o modela) el mundo con el que estás 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 paper about composing financial contracts. 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 eso, los autores diseñan una estructura de datos para describir los contratos. Algo así 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 los modelos de una amplia gama de contratos muy complejos que se utilizan en la industria financiera.

Resumen Creo que el enfoque en las estructuras de datos que se usan para modelar el mundo (y están separadas de la implementación que las usa) está muy cerca de los conceptos clave de DDD.

+0

Todavía no lo he analizado en detalle, pero ese artículo parece bastante interesante. Gracias –

5

Hay una nueva idea de usar Clojure (una versión moderna de Lisp), que es un lenguaje funcional, para crear modelos de dominio. This presentation es una introducción bastante buena (y también es una demo impresionante de HTML5).

La larga historia, la actitud funcional es genial cuando se combina con Event Sorcing. Te permite crear modelos totalmente comprobables muy fácilmente. Y si no quiere saltar en su totalidad nuevo lenguaje en este momento, moderno C# es un muy buen lenguaje para escribir código funcional similar (al menos para la implementación de modelos de dominio común)

+0

enlaces no es correcto –

Cuestiones relacionadas