我有一段代码,看起来像这样:
double Δt = lastPollTime - pollTime;
double α = 1 - Math.exp(-Δt / τ);
average += α * (x - average);
仅使用Unicode字符作为Java标识符是一个多么糟糕的想法?或者这是完全可以接受的吗?
我有一段代码,看起来像这样:
double Δt = lastPollTime - pollTime;
double α = 1 - Math.exp(-Δt / τ);
average += α * (x - average);
出于多种原因,这是个不好的主意。
很多人的键盘不支持这些字符。如果我在qwerty键盘(或任何其他没有希腊字母的键盘)上维护该代码,我将不得不一直复制和粘贴那些字符。
有些人的编辑器或终端可能无法正确显示这些字符。例如,一些编辑器(不幸的是)仍然默认为某些ISO-8859(拉丁语)变体。 ASCII 之所以如此流行的主要原因是它几乎总是有效的。
即使这些字符可以正常呈现,它们也可能会引起混淆。直接来自 Sun(强调是我的):
外观相同的标识符可能是不同的。 例如,由单个字母组成的标识符 LATIN CAPITAL LETTER A(A,\u0041),LATIN SMALL LETTER A(a,\u0061),GREEK CAPITAL LETTER ALPHA(A,\u0391),CYRILLIC SMALL LETTER A(a,\u0430)和 MATHEMATICAL BOLD ITALIC SMALL A(a,\ud835 \udc82)都是不同的。
...
Unicode 组合字符与分解字符不同。 例如,LATIN CAPITAL LETTER A ACUTE(Á,\u00c1)在排序时可以被认为是与 LATIN CAPITAL LETTER A(A,\u0041)紧随其后的 NON-SPACING ACUTE(´,\u0301)相同,但在标识符中它们是不同的。
这绝非一个虚构的问题:α (U+03b1 GREEK SMALL LETTER ALPHA) 和 ⍺ (U+237a APL FUNCTIONAL SYMBOL ALPHA) 是不同的字符!
无法确定哪些字符是有效的。您代码中的字符可以使用,但当我使用函数符号 ALPHA 时,我的 Java 编译器会抱怨“非法字符:\9082”。尽管在此代码中使用功能符号更为合适。除了 询问 Character.isJavaIdentifierPart()
,似乎没有一个确定的规则来确定哪些字符是可接受的。
即使您可以使其编译通过,看起来不太可能所有 Java 虚拟机实现都经过了Unicode标识符的严格测试。如果这些字符仅用于方法范围内的变量,则它们应该被编译掉,但如果它们是类成员,则它们也将出现在 .class
文件中,可能会在有缺陷的 JVM 实现上破坏您的程序。
-Dfile.encoding
进行控制(是的,这取决于JVM的实现...),但你真的不想依赖它。我认为这是主要的障碍。顺便说一句,很棒的答案,+1。 - BalusC.class
文件的内部,只使用一种编码方式,类似于UTF-8。http://en.wikipedia.org/wiki/Class_%28file_format%29 就我所知,file.encoding
只用于指定InputStreamReader
等类的默认编码方式。 - Thomas看起来很好,因为它使用了正确的符号,但你的团队有多少人知道这些符号的按键组合呢?
我会使用英文表示法,只是为了更容易输入。而且其他人可能没有设置支持这些符号的字符集。
那段代码读起来还好,但是维护起来很糟糕 - 我建议使用类似这样的简单英文标识符:
double deltaTime = lastPollTime - pollTime;
double alpha = 1 - Math.exp(-delta....
if
、while
、public
、class
等,以及运行库中的所有方法。如果使用另一种语言来命名标识符和方法,读者在阅读代码时必须不断地在两种语言之间进行思维切换。即使读者对两种语言都很熟练,这也比只有一种语言更加困难。 - Thorbjørn Ravn Andersen这是一个非常好的想法,说实话。只是现在不太容易实现。我们可以将其记录下来,留待未来参考。我很希望看到三角形、圆形、正方形等图形成为程序代码的一部分。但现在,请试着按照Crozin建议的方式重新编写它。
为什么不呢? 如果编写该代码的人可以轻松输入这些字符,那就可以接受。
但是对于无法显示Unicode或无法输入它们的人来说,情况就会很糟糕。