2009-11-27 153 views
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_APOS VS '\''

赞成常数

  1. 这是很难做的错别字(例如对比"''" + '"'S_APOS+S_APOS + C_QUOT
  2. 它消除了转义问题如果正则表达式是"\\s+""\s+""\\\\s+"
  3. 这很容易搜索代码,标点符号

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

回答

1

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

用法看起来是这样的:

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

我很高兴看到我并不孤单地提倡这种程度的冗长 – 2009-11-27 08:17:26

+0

我倾向于在团队中与我合作使用长名称的东西... – 2009-11-27 08:19:02

1

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

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

比:

s.replace("String", S_SPACE); 

我会特别小心,使用像“\ t”的代表标签,例如,因为它们不能轻易地从空间的区别串。

至于喜欢的事情XML_PREFIX_SEPARATORFILE_SEPARATOR,你应该从来没有处理这样的常量,因为你应该使用一个程序库来为你工作。例如,你不应该手写:dir + FILE_SEPARATOR + filename,而是打电话:file_system_library.join(dir, filename)(或者你正在使用的任何等价物)。

这样,你不仅有东西,像常量的答案,你就会得到更好的处理各种边缘的情况下,你可能不会想到,现在

+0

我完全同意图书馆。我使用他们,我写他们。然而,有些时候我需要访问原语 – 2009-11-27 08:28:46

+0

@ peter.murray.rust:是的,当你需要原语时(例如,在编写一个库时!),肯定有很多情况。但是我注意到很多时候当人们询问基元时,答案是更高层次的抽象,所以我想提供它作为另一种选择。 – 2009-11-27 10:38:54