程序员整天在和各种值和变量在打交道。变量类型似乎是一种不用动脑筋的选择:名字 name 应该肯定是字符串吧?重量 weight 肯定是一个浮点数?
类型的抉择肯定是一个非常影响设计的因素,在 Java 这样的强类型语言中,想给一个库里的变量、参数来改个类型,绝对不是轻松活。即使是在应用程序中,你的一段代码只要有使用者,它的类型信息就往往是不容易改变的。对于 Clojure 这样的鸭子类型语言,它不显式地声明类型,但我们都需要了解参数、返回值的类型,在这种语言中给东西改类型,比强类型语言更加危险。因为没有了编译器的检查。
正因为如此,程序员需要抵御住方便性的诱惑,将类型设计为本质,而不应该用它的表象。我们在类型方面最常犯的错误,就是滥用字符串:
- 用字符串代替枚举。字符串的特点是可以包含任意数量的字符,是无限集合,可以进行各种运算;而枚举是有限的,每个值是明确不可运算的。例如,在一个处理银行卡的程序中,由于经常要显示卡的类型,我们可能会受到诱惑设计一个
cardTypeName
属性,字符串类型,只能取值为“信用卡”、“借记卡”等。但更为本质的设计是cardType
枚举,有CREDIT
和DEBIT
等取值。在 Clojure 中可以直接使用 keyword,如:credit
和:debit
。 - 用字符串代替日期。日期的格式在许多程序中都是一个麻烦,而显示日期又是那么常见的需要。常常可以看到程序中用字符串来表达一个日期。这又偏离了这种量的本质。
- 用字符串代替其他各种数据结构。例如用来表达一个列表,或者一个 map。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。