Предположим, что у меня есть супер простая регистрация пользователей, чтобы электронная почта пользователя была уникальной для всех пользователей.Как отделить проверку уникальности от слоя сохранения?
Я выразил это требование в таких функциях.
(defn validate-user [user]
(and (:email user) (is-unique? (:email user))))
(defn is-unique? [email]
(not (db-api/user-exists {:email email})))
Но я хочу отделить мою проверку от базы данных, я хочу сделать ее чисто функциональной. Я мог бы, вероятно, также впрыскивать базы данных API в качестве параметра для validate-user
, как
(defn validate-user [db-api user]
(and (:email user) (is-unique? db-api (:email user))))
(defn is-unique? [db-api email]
(not ((:user-exists db-api) {:email email})))
, но я не знаю, если это идиоматическое.
Кроме того, похоже, что потребитель validate-user
не должен заботиться о базе данных api. Похоже, что эта зависимость подрывает всю концепцию отделения уровня бизнес-логики от уровня сохранения. Поэтому я ищу мышление, в котором объясняется, как это сделать правильно или почему это невозможно.
Вы собираетесь ввести пользователя впоследствии? Если да, то с этим подходом у вас будет состояние гонки. (Если вы не держите все электронные письма в памяти и заблокированы). – ClojureMostly
Вы разработчик Ruby, поэтому я должен напомнить вам о [этом разделе руководства Rails по проверке уникальности] (http://guides.rubyonrails.org/active_record_validations.html#uniqueness). Часть этого раздела по-прежнему применяется в Clojure. –