我们使用包含任意标点符号的任意字符串进行大量词法处理。关于是否使用魔术字符/字符串或符号常量,我有分歧。
这些示例应该被视为与语言无关,尽管大多数都是Java。
标点符号具有语义角色,应该被标识为常量:
File.separator
不是"/"
或"\\"
; //一个明智的选择,因为它依赖于操作系统
我写XML_PREFIX_SEPARATOR = ":"
;
但是,假设我需要用空字符串``替换""
的所有示例。我可以写:
s = s.replaceAll("\"\"", "");
或
s = s.replaceAll(S_QUOT+S_QUOT, S_EMPTY);
(我已将所有常见的标点符号定义为S_FOO(字符串)和C_FOO(字符))
赞成魔术字符串/字符:
C_APOS
vs '\''
)赞成常量
"''" + '"'
S_APOS+S_APOS + C_QUOT
对比"\\s+"
或"\s+"
或"\\\\s+"
?(对此有一个限制 - 我不会以这种方式编写正则表达式,即使正则表达式语法是所有编程中最具认知功能的部分之一。我认为我们需要更好的语法。)
答案 0 :(得分:1)
如果定义可能随着时间的推移或安装之间的变化而变化,我倾向于将这些内容放在配置文件中,并在启动时或按需获取信息(取决于具体情况)。然后在属性上提供一个带有只读接口和明确名称的静态类,以便将信息公开给系统。
用法可能如下所示:
s = s.replaceAll(CharConfig.Quotation + CharConfig.Quotation, CharConfig.EmtpyString);
答案 1 :(得分:1)
对于一般字符串处理,我不会使用特殊符号。空间总是一个空间,阅读(写作!)更自然:
s.replace("String", " ");
比:
s.replace("String", S_SPACE);
我会特别注意使用“\ t”之类的东西来表示标签,例如,因为它们不能轻易地与字符串中的空格区分开来。
至于像XML_PREFIX_SEPARATOR
或FILE_SEPARATOR
之类的东西,你应该永远不必处理那样的常量,因为你应该使用一个库为你做这项工作。例如,你不应该手写:dir + FILE_SEPARATOR + filename
,而是调用:file_system_library.join(dir, filename)
(或者你正在使用的任何等价物)。
通过这种方式,您不仅可以获得常量等问题的答案,而且您实际上可以更好地处理各种边缘情况,而您现在可能没有考虑过这些情况