Примеры написаны на F #, но их легко перевести на любой другой функциональный язык с алгебраическими типами (в моем случае Haskell и PureScript).
=================================================================================================================================================

я был большой опыт написания доменных приложений с использованием C #. Чем больше приложений я пишу, тем больше я нахожу, что хочу использовать подход, который не очень хорошо подходит для стандартных методов C # / OO:

Я хочу написать как можно больше чистых функций, потому что их действительно легко протестировать.Я хочу написать свою бизнес-логику более декларативным способом.Поэтому я смотрю на функциональные языки, такие как F #. В конце концов, нет никаких причин, по которым доменный дизайнимеет быть реализован с использованием ОО.

Мне было интересно, есть ли у кого-нибудь какие-либо идеи / опыт в разработке дизайна, ориентированного на домен, с использованием функционального языка. Особенно:

Как будет выглядеть функциональная модель предметной области?Как бы вы абстрагировали слой доступа к данным от модели предметной области?

**Отказ от ответственности:** У меня есть только смутные знания о дизайне, управляемом доменом, поэтому в ответе могут не использоваться правильные термины, и он может быть чрезмерно сфокусирован на коде, а не на общих понятиях, но в любом случае вот некоторые мысли ...

Внимание к пониманиюдомен вместо того, чтобы разрабатывать конкретные функции или объекты для их реализации, кажется очень естественным то, как люди используют функциональные языки программирования в целом. Очень часто (по крайней мере, в части функционального приложения) вы начинаете с разработки структуры данных, которая описывает (или моделирует) мир, с которым вы работаете. Структура данных отделена от реализации, поэтому она хорошо моделирует домен.

Очень хороший пример описан в[статья о составлении финансовых договоров](http://research.microsoft.com/en-us/um/people/simonpj/papers/financial-contracts/contracts-icfp.htm), Примером является приложение для оценки (и другой обработки) финансовых контрактов. Самое главное, чтобы создать модель контрактов - что они на самом деле? Чтобы ответить на это, авторы проектируют структуру данных для описания контрактов. Что-то вроде:

Есть несколько других случаев, но структура данных очень проста и моделирует широкий спектр довольно сложных контрактов, которые используются в финансовой индустрии.

**Резюме** Я думаю, что фокус на структурах данных, которые используются для моделирования мира (и отделены от реализации, которая их использует), очень близок к ключевым концепциям DDD.



 который является функциональным языком, для создания моделей предметной области.[Эта презентация](http://static.intelie.com.br/qconsp2010/presentation.html) неплохое вступление (и это также потрясающая демонстрация HTML5).

Короче говоря, функциональное отношение прекрасно в сочетании с Event Sorcing. Это позволяет очень легко создавать полностью тестируемые модели. И если вы не хотите прямо сейчас переходить на совершенно новый язык, современный C # - неплохой язык для написания функционально-подобного кода (по крайней мере, для реализации моделей общих доменов).



Насколько мне известно, лучшая (только?) Книга о функционально-ориентированном доменном дизайне[Моделирование домена сделано функциональным](https://fsharpforfunandprofit.com/books/), написанный Скоттом Влащиным, автором[F # для удовольствия и прибыли](https://fsharpforfunandprofit.com/) (упомянутое выше).

Прежде чем погрузиться в книгу, поговорим[Функциональное программирование проектирования шаблонов](https://fsharpforfunandprofit.com/fppatterns/) большое резюме концепций (подсказка: нет шаблона :)

Примеры написаны на F #, но их легко перевести на любой другой функциональный язык с алгебраическими типами (в моем случае Haskell и PureScript).



[Домен-управляемый дизайн с F # и EventStore](http://gorodinski.com/blog/2013/02/17/domain-driven-design-with-fsharp-and-eventstore/)

Отказ от ответственности: я автор.