1

我们对包含任意标点符号的任意字符串进行了大量的词法处理。对于是使用魔术字符/字符串还是符号常量,我存在分歧。

尽管大多数示例都是 Java,但这些示例应被视为与语言无关。

标点符号具有语义作用并应被标识为常量的明显示例:

File.separator不是"/""\\";// 很简单,因为它依赖于操作系统

我写XML_PREFIX_SEPARATOR = ":"

但是,假设我需要""用空字符串 ` 替换所有示例。我可以写:

s = s.replaceAll("\"\"", "");

或者

s = s.replaceAll(S_QUOT+S_QUOT, S_EMPTY);

(我已将所有常见的标点符号定义为 S_FOO(字符串)和 C_FOO(字符))

支持魔术字符串/字符:

  1. 它更短
  2. 阅读是很自然的(有时)
  3. 命名常量可能不熟悉(C_APOSvs '\''

支持常数

  1. 更难打错字(例如"''" + '"'对比S_APOS+S_APOS + C_QUOT
  2. 它消除了转义问题 正则表达式应该是"\\s+"or "\s+"or"\\\\s+"吗?
  3. 很容易在代码中搜索标点符号

(这是有限制的——即使正则表达式语法是所有编程中认知功能障碍最严重的部分之一,我也不会以这种方式编写正则表达式。我认为我们需要更好的语法。)

4

2 回答 2

1

如果定义可能会随着时间或安装之间发生变化,我倾向于将这些东西放在配置文件中,并在启动时或按需获取信息(取决于情况)。然后提供一个具有只读接口的静态类,并在属性上清除名称,以便向系统公开信息。

用法可能如下所示:

s = s.replaceAll(CharConfig.Quotation + CharConfig.Quotation, CharConfig.EmtpyString);
于 2009-11-27T08:13:53.960 回答
1

对于一般字符串处理,我不会使用特殊符号。空间永远是空间,阅读(和写作!)更自然:

s.replace("String", " ");

比:

s.replace("String", S_SPACE);

例如,我会特别注意使用“\t”之类的东西来表示制表符,因为它们不容易与字符串中的空格区分开来。

至于XML_PREFIX_SEPARATORorFILE_SEPARATOR之类的东西,您可能永远不必处理这样的常量,因为您应该使用库来为您完成工作。例如,您不应该手写:dir + FILE_SEPARATOR + filename,而应该打电话:(file_system_library.join(dir, filename)或您正在使用的任何等价物)。

通过这种方式,您不仅可以获得诸如常量之类的答案,而且实际上可以更好地处理您现在可能没有考虑的各种边缘情况

于 2009-11-27T08:26:22.750 回答