如何在Clojure中处理魔术字符串

时间:2013-03-22 09:21:13

标签: clojure

我有探测PostgreSQL数据库元数据的代码,所以我发现我的代码用魔术字符串修饰:

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

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

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

E.g:

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

但它真的值得麻烦,因为它不会给我带来任何类型安全性(就像Java中的枚举一样)?

1 个答案:

答案 0 :(得分: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
  )