我有一个场景,我想定义一些内部和通用的属性,以及一些外部和动态的属性,这些都是与同一“事物”相关的。具体来说,我正在尝试建模一个交易平台。有多个不同的交易所/经纪人/服务,但它们都在谈论类似的东西。
以订单为例,你可以有一些在所有服务中都可能存在的属性。
(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?))
我在想使用一种多规范返回的模式,这样每个服务都可以为订单定义要使用的模式,例如::service/name,但所有这些都可以从:order/order中“选择”到。
(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]}]))
这样,外部服务可以指定它们处理的常见层域属性和实体的信息,以及指定它们自己的属性。用户可以重用一组在常见属性上操作的共同函数,如果不同的服务提供了这些共同属性,它们可以互换使用,同时保留创建针对特定服务的特定函数和选择的方法。
这个用例有意义吗?有没有更好的建模方法?
谢谢