我想我有一个聪明的主意。我想为数据库调用创建回调函数。通常,你会做这样的事情:
(defn on-doc-insert [ts doc] ; the call-back
(do-something-with-doc doc))
(db/on-insert :coll on-doc-insert) ; defining the call-back for collection :coll
现在我聪明的想法是用元信息声明回调:
(defn ^{:on-insert :coll} on-doc-insert [ts doc]
(do-something-with-doc doc))
那么就不需要通过过程函数调用来手动定义它。该程序在启动时查找所有标记的函数并存储它们。
问题是没有简单的方法来检查名称空间。所有标记的函数都会被收集,无论它们是在哪里定义的,这当然会引起一些安全问题。
有更聪明的方法吗?我喜欢声明式编程,所以如果有的话那就太好了。
我自己肯定会选择最明确、最简单的路线,手动调用
db/on-insert
。我不认为将特定回调绑定到特定集合是值得追求的感知声明性的事情。
作为替代方案,无论基于元数据收集回调变量,都可以简单地检查某些允许的命名空间集中的变量。
作为一种中间立场,您可以在每个命名空间中构建一个变量注册表,并调用单个函数来一次处理注册表中的所有函数。