Eri*_*ric 29 java unicode identifier
我有一段代码如下:
double ?t = lastPollTime - pollTime;
double ? = 1 - Math.exp(-?t / ?);
average += ? * (x - average);
Run Code Online (Sandbox Code Playgroud)
在Java标识符中使用unicode字符的想法有多糟糕?或者这完全可以接受?
Tho*_*mas 34
出于各种原因,这是一个坏主意.
许多人的键盘不支持这些字符.如果我要在qwerty键盘(或任何其他没有希腊字母)上维护该代码,我将不得不一直复制和粘贴这些字符.
某些人的编辑或终端可能无法正确显示这些字符.例如,一些编辑(不幸的是)仍默认为某些ISO-8859(拉丁语)变体.ASCII仍然如此普遍的主要原因是它几乎总是有效.
即使可以正确呈现字符,也可能会造成混淆.直接来自太阳(强调我的):
具有相同外观的标识符可能会有所不同.例如,标识符包括单个字母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复合字符与分解的字符不同.例如,拉丁文大写字母A ACUTE(Á,\ u00c1)可被视为与拉丁文大写字母A(A,\ u0041)相同,紧接着是非间距急性(',\ u0301) ,但这些在标识符方面有所不同.
这绝不是一个想象中的问题:α(U + 03b1 GREEK SMALL LETTER ALPHA)和⍺(U + 237a APL功能符号ALPHA)是不同的字符!
无法确定哪些字符有效.代码中的字符可以正常工作,但是当我使用FUNCTIONAL SYMBOL ALPHA时,我的Java编译器会抱怨"非法字符:\ 9082".即使功能符号在此代码中更合适.除了询问 之外,似乎没有关于哪些字符可以接受的可靠规则Character.isJavaIdentifierPart().
即使您可以将其编译,但似乎所有Java虚拟机实现都已使用Unicode标识符进行了严格测试.如果这些字符仅用于方法范围中的变量,那么它们应该被编译掉,但如果它们是类成员,它们也将最终存在于.class文件中,可能会破坏有关错误JVM实现的程序.
该代码很好读,但很难维护 - 我建议使用简单的英文标识符,如下所示:
double deltaTime = lastPollTime - pollTime;
double alpha = 1 - Math.exp(-delta....
Run Code Online (Sandbox Code Playgroud)
如果您的工作组可以接受,那是完全可以接受的.这里的很多答案都是以傲慢的假设运作的,即每个人都用英语编程.非英语程序员这些日子并不罕见,而且他们的加速率也越来越少.当他们拥有完美的语言时,他们为什么要限制自己使用英语版本?
除了英语的傲慢,还有其他合法的理由使用非英语标识符.例如,如果您正在编写数学软件包,那么如果您的目标是数学家,那么使用希腊文就可以了.当每个人都能理解"Δ"并且可能更快地输入时,为什么人们会在你的工作组中输入"delta"?几乎任何问题领域都有自己的行话,有时候行话用拉丁字母表示.为什么在地球上你想尝试将所有东西都塞进ASCII?