Подтвердить что ты не робот

Функциональный способ реализации проекта, управляемого доменом

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

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

Итак, я смотрю на функциональные языки, такие как F #. В конце концов, нет причин, по которым проект, управляемый доменом, должен быть реализован с использованием OO.

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

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

Ответ 1

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

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

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

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...
  // (...)

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

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

Ответ 2

Существует новая идея использования Clojure (современной версии Lisp), которая является функциональным языком, для создания моделей домена. Эта презентация - неплохое введение (и это также потрясающая демонстрация HTML5).

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