2024年Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面了解有关此如何工作的更多信息。

0
Spec
重新标记

我有一个场景,我想定义一些内部和公共的属性,以及一些外部和动态的属性,它们都与同一“事物”相关。具体来说,我正在尝试创建一个交易库。有多个不同的交易所/经纪商/服务,但它们都在谈论类似/等效的事物。
以订单为例,你可以在所有服务中都可以通用的属性

(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]}]))

这种方式,外部服务可以指定它们处理的有关公共层域属性和实体的信息,同时还可以指定它们自己的特定属性。用户可以重用操作公共属性的一组公共函数,如果不同的服务提供了这些公共属性,则可以使用它们互换,同时保持创建针对特定服务的方式隔离特定的功能和选择。

此用例有道理吗?是否有更好的建模方法?

谢谢

1 个答案

0
...