我有一个场景,我想定义一些内部和公共的属性,以及一些外部和动态的属性,它们都与同一“事物”相关。具体来说,我正在尝试创建一个交易库。有多个不同的交易所/经纪商/服务,但它们都在谈论类似/等效的事物。
以订单为例,你可以在所有服务中都可以通用的属性
(spec/def :order/id string?)
(spec/def :order/quantity number?)
(spec/def :order/side #{:buy :sell})
然后,每个外部服务都可以有特定于该服务如何处理订单的属性
(spec/def :service1-order/execution-instructions (spec/coll-of string?))
(spec/def :service2-order/iceberg-quantity (spec/coll-of string?))
我在想有一个多规格返回的方案,这样每个服务都可以定义针对订单应使用哪种方案,在一个类似冒号:服务/名称的键上,但所有的都可以从:订单/订单中选取
(defmulti order-schema :service/name)
(defmethod order-schema :service1
[_]
(spec/schema [:order/id :order/quantity :order/side :service1-order/execution-instructions]))
(defmethod order-schema :service2
[_]
(spec/schema [:order/id :order/quantity :order/side :service2-order/iceberg-quantity]))
(defmethod order-schema :default
[_]
(spec/schema [:order/id :order/quantity :order/side]))
(spec/def :order/order (spec/multi-spec order-schema :service/name))
当嵌套对象时,这也很有用。想象一下,我有一个帐户,它将包含订单。帐户也可以指定为每个服务的多规格
(spec/def :account/id string?)
(spec/def :account/orders (spec/coll-of :order/order))
(spec/def :service1-account/type #{:spot :margin :futures})
(defmulti account-schema :service/id)
(defmethod account-schema :service1
[_]
(spec/schema [:account/id :account/orders :service1-account/type]))
(defmethod account-schema :default
[_]
(spec/schema [:account/id :account/orders]))
(spec/def :account/account (spec/multi-spec account-schema :service/id))
这样,您可以选择以下模式
(spec/def ::service1-account-info (spec/select :account/account [:service1-account/type :account/orders {:account/orders [:order/id :order/quantity :service1-order/execution-instructions]}]))
这种方式,外部服务可以指定它们处理的有关公共层域属性和实体的信息,同时还可以指定它们自己的特定属性。用户可以重用操作公共属性的一组公共函数,如果不同的服务提供了这些公共属性,则可以使用它们互换,同时保持创建针对特定服务的方式隔离特定的功能和选择。
此用例有道理吗?是否有更好的建模方法?
谢谢