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

这些示例应该被视为与语言无关,尽管大多数都是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 + QUOT;?
    3. 搜索标点符号很容易
    4. (对此有一个限制 - 我不会以这种方式编写正则表达式,即使正则表达式语法是所有编程中最具认知功能的部分之一。我认为我们需要更好的语法。)

有帮助吗?

解决方案

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

用法可能如下所示:

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)(或者等同于你的任何东西) '正在使用)。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top