2013-03-22 29 views
1

我有探测PostgreSQL数据库中的元数据,所以我觉得litered与魔术字符串我的代码代码:如何处理魔术串用Clojure

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

其中“整数”,“SMALLINT”等都是值查询返回在数据库中的元数据表。

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

例如为:

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

这是不是真的值得的麻烦,因为它不给我买任何类型的安全性(如将一个枚举在Java中)?

回答

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 
) 
+0

我接受你的答案,但我不明白multimethods如何在调度逻辑是微不足道的时候具有任何优点。与CASE表达式的单一功能似乎在我看来更紧密地结合,并同样易于添加新的病例。或者我错过了什么? (我是新来的多方法) – 2013-04-03 16:06:30