可以将 Clojure 规范设为私有吗?
Can one make a Clojure spec private?
我有一个“顶点”(平面中的二维点,用包含两个双精度值的地图表示)和“矩形”的规范”(平面中一个轴对齐的矩形区域,用两个“vertex”值的映射表示),定义如下:
; vertex coordinates are doubles (need to make sure "=" doesn't try to
; compare floats in one vertex and doubles in another one, which fails)
(s/def ::vtx-x double?)
(s/def ::vtx-y double?)
; vertex is a map representing a 2D point
(s/def ::vertex (s/keys :req [::vtx-x ::vtx-y]))
; rectangle corners "low" (low x,y) and "high" (high x,y) are vertexes
(s/def ::rec-lo ::vertex)
(s/def ::rec-hi ::vertex)
; rectangle has internal sorting constraint, specified via a predicate
(s/def ::rectangle-internally-sorted
(fn [rect]
(let [lo-vtx (::rec-lo rect)
hi-vtx (::rec-hi rect)
lo-x (::vtx-x lo-vtx)
lo-y (::vtx-y lo-vtx)
hi-x (::vtx-x hi-vtx)
hi-y (::vtx-y hi-vtx)]
(< lo-x hi-x) (< lo-y hi-y))))
; rectangle is a map of two vertexes
; representing an axis-aligned rectangular area
(s/def ::rectangle
(s/and
(s/keys :req [::rec-lo ::rec-hi])
::rectangle-internally-sorted))
客户端代码应该只能使用规范 ::vertex
和 ::rectangle
。
我可以隐藏(私有化)支持规格吗?
你不能也不应该。隐藏底层规格只会妨碍您的规格的用户,因为他们无法理解规格或生成故障,或 s/form
返回的表单。从这个意义上说,组件规范不是实现细节,它们不可避免地以某种方式呈现给消费者。
不过,规范是命名空间的。您当然可以将内部结构移动到不同的命名空间,您可以为消费者声明该命名空间超出范围。我会问从中得到什么?信息隐藏在 Clojure 中从来没有被强调过,特别是规范(一种数据描述语言),public/private 区别在我看来有点不合适。
我有一个“顶点”(平面中的二维点,用包含两个双精度值的地图表示)和“矩形”的规范”(平面中一个轴对齐的矩形区域,用两个“vertex”值的映射表示),定义如下:
; vertex coordinates are doubles (need to make sure "=" doesn't try to
; compare floats in one vertex and doubles in another one, which fails)
(s/def ::vtx-x double?)
(s/def ::vtx-y double?)
; vertex is a map representing a 2D point
(s/def ::vertex (s/keys :req [::vtx-x ::vtx-y]))
; rectangle corners "low" (low x,y) and "high" (high x,y) are vertexes
(s/def ::rec-lo ::vertex)
(s/def ::rec-hi ::vertex)
; rectangle has internal sorting constraint, specified via a predicate
(s/def ::rectangle-internally-sorted
(fn [rect]
(let [lo-vtx (::rec-lo rect)
hi-vtx (::rec-hi rect)
lo-x (::vtx-x lo-vtx)
lo-y (::vtx-y lo-vtx)
hi-x (::vtx-x hi-vtx)
hi-y (::vtx-y hi-vtx)]
(< lo-x hi-x) (< lo-y hi-y))))
; rectangle is a map of two vertexes
; representing an axis-aligned rectangular area
(s/def ::rectangle
(s/and
(s/keys :req [::rec-lo ::rec-hi])
::rectangle-internally-sorted))
客户端代码应该只能使用规范 ::vertex
和 ::rectangle
。
我可以隐藏(私有化)支持规格吗?
你不能也不应该。隐藏底层规格只会妨碍您的规格的用户,因为他们无法理解规格或生成故障,或 s/form
返回的表单。从这个意义上说,组件规范不是实现细节,它们不可避免地以某种方式呈现给消费者。
不过,规范是命名空间的。您当然可以将内部结构移动到不同的命名空间,您可以为消费者声明该命名空间超出范围。我会问从中得到什么?信息隐藏在 Clojure 中从来没有被强调过,特别是规范(一种数据描述语言),public/private 区别在我看来有点不合适。