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

如何在Clojure中处理魔术字符串,clojure,Clojure,我有探测PostgreSQL数据库元数据的代码,因此我发现我的代码使用了魔法字符串: (case data_type "integer" ... "smallint" ... "bigint" ... "boolean" ... ... 其中“integer”“smallint”等是从数据库元数据表中的查询返回的值 建议使用关键字,所以也许更好地组织这些字符串的方法是为每个这样的魔术字符串集合定义一对编码/解码函数 例如: 但是它真的值得麻烦吗,因

我有探测PostgreSQL数据库元数据的代码,因此我发现我的代码使用了魔法字符串:

(case data_type
   "integer"   ...
   "smallint"  ...
   "bigint"    ...
   "boolean"   ...
   ...
其中“integer”“smallint”等是从数据库元数据表中的查询返回的值

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

例如:


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

你是对的,因为显而易见的原因,它不会给你买“编译时”类型安全性

关于case语句,您并没有提供太多的上下文,但我可以建议的一种设计方法是使用多种方法对数据类型进行分派,以便您可以轻松地为数据类型添加新的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
  )

我接受你的答案,但我不认为当分派逻辑微不足道时,多方法有什么优点。在我看来,带有case表达式的单个函数似乎更紧密地绑定在一起,并且添加新的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
  )