将unicode符号用作Java标识符是一个好主意吗?

我有一段代码如下:

double Δt = lastPollTime - pollTime; double α = 1 - Math.exp(-Δt / τ); average += α * (x - average); 

在Java标识符中使用unicode字符的想法有多糟糕? 或者这完全可以接受?

出于各种原因,这是一个坏主意。

  • 许多人的键盘不支持这些字符。 如果我要在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 APLfunction符号ALPHA)是不同的字符!

  • 无法确定哪些字符有效。 您的代码中的字符可以正常工作,但是当我使用FUNCTIONAL SYMBOL ALPHA时,我的Java编译器会抱怨“非法字符:\ 9082”。 即使function符号在此代码中更合适。 除了询问 Character.isJavaIdentifierPart()之外,似乎没有关于哪些字符可以接受的可靠规则。

  • 即使您可以将其编译,但似乎所有Java虚拟机实现都已使用Unicode标识符进行了严格测试。 如果这些字符仅用于方法范围中的变量,那么它们应该被编译掉,但如果它们是类成员,它们也将最终出现在.class文件中,可能会破坏有缺陷的JVM实现的程序。

看起来很好,因为它使用正确的符号,但你的团队中有多少人会知道这些符号的按键?

我会使用英文表示,以便更容易输入。 其他人可能没有支持在他们的电脑上设置的符号的字符集。

如果您的工作组可以接受,那是完全可以接受的。 这里的很多答案都是以傲慢的假设运作的,即每个人都用英语编程。 非英语程序员这些日子并不罕见,而且他们的加速率也越来越少。 当他们拥有完美的语言时,他们为什么要将自己限制在英语版本?

除了英语的傲慢,还有其他合法的理由使用非英语标识符。 例如,如果您正在编写数学软件包,那么如果您的目标是数学家,那么使用希腊语就可以了。 当每个人都能理解“Δ”并且可能更快地输入时,为什么人们会在你的工作组中输入“delta”? 几乎任何问题领域都有自己的行话,有时候行话用拉丁字母表示的东西表示。 为什么在地球上你想尝试将所有东西都塞进ASCII?

该代码可以阅读,但维护起来很糟糕 – 我建议使用简单的英文标识符,如下所示:

 double deltaTime = lastPollTime - pollTime; double alpha = 1 - Math.exp(-delta.... 

这是个好主意。 诚实。 这在当时并不容易实用。 让我们继续参考它。 我希望看到三角形,圆形,正方形等……作为程序代码的一部分。 但就目前而言,请尝试重新编写它,就像Crozin所说的那样。

为什么不? 如果处理该代码的人可以轻松输入,那么这是可以接受的。

但上帝帮助那些无法显示unicode或无法输入unicode的人。

在完美的世界中,这将是推荐的方式。

不幸的是,当你移动到普通的7位ASCII字符(UTF-8不同于ISO-Latin-1不同于UTF-16等)时会遇到字符编码,这意味着你最终会遇到问题。 从Windows迁移到Linux时,这种情况发生在我身上。 我们的国家斯堪的纳维亚人物在这个过程中破裂了,但幸运的是只有弦乐。 然后我们使用\ u编码来表示所有这些。

如果您绝对可以肯定您永远不会遇到这样的事情 – 例如,如果您的文件包含适当的BOM – 那么无论如何都要这样做。 它将使您的代码更具可读性。 如果至少有最小的疑问,那就不要了。

(请注意,“使用非英语语言”是另一回事。我只是在考虑使用符号而不是字母)。