在处理标点符号时使用魔术字符串或常量?

时间:2009-11-27 08:09:54

标签: language-agnostic magic-numbers punctuation

我们使用包含任意标点符号的任意字符串进行大量词法处理。关于是否使用魔术字符/字符串或符号常量,我有分歧。

这些示例应该被视为与语言无关,尽管大多数都是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_APOS vs '\''
  4. 赞成常量

    1. 制作拼写错误更困难(例如"''" + '"' S_APOS+S_APOS + C_QUOT对比
    2. 如果正则表达式为"\\s+""\s+""\\\\s+"
    3. ,它会消除逃避问题
    4. 搜索标点符号很容易
    5. (对此有一个限制 - 我不会以这种方式编写正则表达式,即使正则表达式语法是所有编程中最具认知功能的部分之一。我认为我们需要更好的语法。)

2 个答案:

答案 0 :(得分:1)

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

用法可能如下所示:

s = s.replaceAll(CharConfig.Quotation + CharConfig.Quotation, CharConfig.EmtpyString);

答案 1 :(得分:1)

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

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

比:

s.replace("String", S_SPACE);

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

至于像XML_PREFIX_SEPARATORFILE_SEPARATOR 之类的东西,你应该永远不必处理那样的常量,因为你应该使用一个库为你做这项工作。例如,你不应该手写:dir + FILE_SEPARATOR + filename,而是调用:file_system_library.join(dir, filename)(或者你正在使用的任何等价物)。

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