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