程序员整天在和各种值和变量在打交道。变量类型似乎是一种不用动脑筋的选择:名字 name 应该肯定是字符串吧?重量 weight 肯定是一个浮点数?

类型的抉择肯定是一个非常影响设计的因素,在 Java 这样的强类型语言中,想给一个库里的变量、参数来改个类型,绝对不是轻松活。即使是在应用程序中,你的一段代码只要有使用者,它的类型信息就往往是不容易改变的。对于 Clojure 这样的鸭子类型语言,它不显式地声明类型,但我们都需要了解参数、返回值的类型,在这种语言中给东西改类型,比强类型语言更加危险。因为没有了编译器的检查。

正因为如此,程序员需要抵御住方便性的诱惑,将类型设计为本质,而不应该用它的表象。我们在类型方面最常犯的错误,就是滥用字符串:

  • 用字符串代替枚举。字符串的特点是可以包含任意数量的字符,是无限集合,可以进行各种运算;而枚举是有限的,每个值是明确不可运算的。例如,在一个处理银行卡的程序中,由于经常要显示卡的类型,我们可能会受到诱惑设计一个 cardTypeName 属性,字符串类型,只能取值为“信用卡”、“借记卡”等。但更为本质的设计是 cardType 枚举,有 CREDITDEBIT 等取值。在 Clojure 中可以直接使用 keyword,如 :credit:debit
  • 用字符串代替日期。日期的格式在许多程序中都是一个麻烦,而显示日期又是那么常见的需要。常常可以看到程序中用字符串来表达一个日期。这又偏离了这种量的本质。
  • 用字符串代替其他各种数据结构。例如用来表达一个列表,或者一个 map。

robertluo
738 声望21 粉丝

引用和评论

0 条评论