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

欢迎!请访问关于页面,了解更多有关该功能的信息。

投票数:0

我有一个场景,我想定义一些内部和通用的属性,以及一些外部和动态的属性,这些都是与同一“事物”相关的。具体来说,我正在尝试建模一个交易平台。有多个不同的交易所/经纪人/服务,但它们都在谈论类似的东西。
以订单为例,你可以有一些在所有服务中都可能存在的属性。

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

这样,外部服务可以指定它们处理的常见层域属性和实体的信息,以及指定它们自己的属性。用户可以重用一组在常见属性上操作的共同函数,如果不同的服务提供了这些共同属性,它们可以互换使用,同时保留创建针对特定服务的特定函数和选择的方法。

这个用例有意义吗?有没有更好的建模方法?

谢谢

回答数:1 个回答

投票数:0
...