1

我有代码可以探测 PostgreSQL 数据库的元数据,所以我发现我的代码中包含了魔法字符串:

(case data_type
   "integer"   ...
   "smallint"  ...
   "bigint"    ...
   "boolean"   ...
   ...

其中“integer”“smallint”等是从数据库元数据表中的查询返回的值。

这篇文章建议使用关键字,所以也许更好地组织这些字符串的一种方法是为每个这样的魔术字符串集合定义一对编码/解码函数?

例如:

(defn datatypes-val->kwd [val] ;; return keyword from value
(defn datatypes-kwd->val [kwd] ;; return value from keyword

但它真的值得麻烦吗,因为它没有给我任何类型安全(就像Java 中的枚举一样)?

4

1 回答 1

2

您是对的,出于显而易见的原因,它不会为您购买“编译时间”类型安全。

您没有提供关于 case 语句的太多上下文,但我可以建议的一种设计方法是使用多种方法来调度数据类型,以便您可以轻松地为数据类型添加新案例。如下所示:

(defmulti get-data (fn [type val] type))

(defmethod get-data "integer" [type val]
  ;do something with val and return result
  )

(defmethod get-data "smallint" [type val]
  ;do something with val and return result
  )
于 2013-03-22T10:30:36.667 回答