Я предлагаю два мыслительных процесса, которые могут помочь объяснить эту загадку:
Концепция state
в вашем примере и книге различаются. (Надеюсь, мыоба имеют отношение к функциональному и реактивному моделированию домена ).
Ваши примеры состояний активации и freeze , вероятно, являются понятиями домена, в то время какВ книге рассказывается о состояниях, которые служат только маркерами .Они не обязательно играют роль в доменной логике и существуют только для устранения неоднозначности состояний рабочего процесса.Ex. применено , одобрено и обогащено .
Функциональное программирование - это реализация поведения, которое не зависит от данныхпереданы в них.
При реализации такого поведения следует отметить два аспекта.
Поведение может быть повторно использовано в разных контекстах. Это может быть абстрактная чертамоноид, если хотите, который принимает любой тип T и выполняет ту же операцию над ним.В вашем примере freeze
может быть таким поведением, применимым к Account
, Loan
, Balance
и т. Д.
Поведение не имеет никаких побочных эффектов. Oneдолжен иметь возможность вызывать поведение снова и снова с одним и тем же набором данных и получать один и тот же ожидаемый ответ без влияния на систему или выдачи ошибки.Ссылаясь на ваш пример, повторный вызов freeze для учетной записи не должен приводить к ошибке.
Комбинируя две точки, можно сказать, что имеет смысл реализовать поведение в качестве фрагмента кода многократного использования в различных контекстах (например, Service
), гарантируя, что входные данные проверены (т. Е. Проверяют состояние объекта, предоставленного в качестве входных данных перед обработкой).
Представляя приемлемое состояние объекта в виде отдельного типа и параметризовав модель / объектс этим явным типом мы могли бы принудительно выполнять статическую проверку ввода во время компиляции.Ссылаясь на пример, приведенный в книге, вы можете только approve andThen enrich
.Любая другая неправильная последовательность вызовет ошибку во время компиляции, что гораздо предпочтительнее, чем использование защитных средств защиты для проверки ввода во время выполнения.
Таким образом, второй подход - это не просто элегантный синтаксис в конце дня.Это механизм для создания проверок во время компиляции, основанный на состоянии объекта.
Таким образом, в то время как выходные данные выглядят как анемичная модель, второй подход использует преимущества некоторых красивыхшаблоны, выкупленные функциональным программированием.