原文标题:Communicate with Text
文本是在系统间进行通信的一种极好的手段。你不需要考虑系统间的同质性。基本数据类型,比如double,的物理表示方式在两个系统间可能是不同的。文本是一种通用语,任何系统都可以把基本数据类型转换为文本。文本可以是有无格式的,也可以是有格式的,比如“用逗号分割的文件”或者XML。另外,文本形式可以被测试人员读懂和创建,以适应依赖数据的测试[*]。
[*]参见《UNIX编程艺术》,作者Eric S. Raymond (Addison-Wesley Professional, 2003) for discussion on text
但在系统内部的文本就是另一会事了。当字符串被读入程序后,它们应该尽快被转换成相应的数据类型。通过这样的转换,可以把针对用户和其它程序的信息的外部表现形式与同一信息的内部使用方法区别开来。如果在外部表现中有错误,失败就会发生在翻译过程中,而不是被推迟到你试图去处理数据的时候。
在前一节中,我们使用枚举类型(enumeration)来定义CDCategories。如果CDCategory的所有可能取值保存在配置文件中,那么它们应该以字符串的形式保存在文件中。从文件中读入数据的时候,字符串值应该被转换为相应的枚举值。如果输入数据拼写错误,或者与任何枚举值都不匹配,(输入程序)应该立刻报告错误,而不是等到以后再来试图处理。
创建枚举数据类型必须依赖于编程语言。如果一种语言不支持枚举类型,那么通过创建包含对应不同枚举值的静态成员的类可以达到同样的效果。这些值与字符串之间的相互转换可以是这个类的一部分。即使一种语言支持枚举类型,那么创建包含此类转换函数的类也是值得的。例如:
class CDCategory
{
static String string_values [] = {
"NewRelease", "GoldenOldie", "Regular"};
static int corresponding_values [] = {
NEW_RELEASE_CD, REGULAR_CD, GOLDIE_OLDIE_CD}
static int NEW_RELEASE_CD = 0;
static int GOLDIE_OLDIE_CD = 1;
static int REGULAR_CD = 2;
String to_string(int category)
{
return string_values[category];
}
int from_string(String a_string) throws BadValueException
{
for (int i = 0; i < string_values.length; i++)
{
if (a_string.equals(string_values[i]))
return corresponding_values[i];
}
throw new BadValueException( );
}
}
译者:Java程序员有福了,终于在JDK 1.5中有了枚举类型。
指导原则:使用文本还是不使用文本 (To Text or Not to Text)
只在程序之间使用文本,而不要在程序内部使用。
译者注:之所以翻译此篇文章,是因为看到公司里一些程序员喜欢在函数之间用字符串来传递一些标志,选项之类的参数。有些明显属于“是/否”开关的参数也使用字符串,而不是使用boolean。所以有针对性地翻译了这一节。