30

我有一个如下所示的代码片段:

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

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

4

7 回答 7

36

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

  • 许多人的键盘不支持这些字符。如果我要在 qwerty 键盘(或任何其他没有希腊字母的键盘)上维护该代码,我将不得不一直复制和粘贴这些字符。

  • 有些人的编辑器或终端可能无法正确显示这些字符。例如,一些编辑器(不幸的是)仍然默认使用一些 ISO-8859(拉丁)变体。ASCII 仍然如此流行的主要原因是它几乎总是有效的。

  • 即使可以正确渲染字符,也可能会引起混乱。直接来自太阳(强调我的):

    具有相同外观的标识符可能不同。例如,由单个字母 LATIN CAPITAL LETTER A (A, \u0041)、LATIN SMALL LETTER A (a, \u0061)、GREEK CAPITAL LETTER ALPHA (A, \u0391)、西里尔小写字母 A (a, \u0430) 和 MATHEMATICAL BOLD ITALIC SMALL A (a, \ud835\udc82) 都是不同的。

    ...

    Unicode 复合字符不同于分解的字符。例如,一个拉丁大写字母 A ACUTE (Á, \u00c1) 可以被认为与一个拉丁大写字母 A (A, \u0041) 相同,在排序时紧跟一个非间隔的 ACUTE (´, \u0301) ,但它们的标识符不同。

    这绝不是一个虚构的问题:α(U+03b1 GREEK SMALL LETTER ALPHA)和⍺(U+237a APL FUNCTIONAL SYMBOL ALPHA)是不同的字符!

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

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

于 2010-05-08T11:03:27.597 回答
9

看起来不错,因为它使用了正确的符号,但是您的团队中有多少人会知道这些符号的击键?

我会使用英文表示只是为了更容易输入。而其他人可能没有支持在他们的电脑上设置的那些符号的字符集。

于 2010-05-08T11:04:55.257 回答
7

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

double deltaTime = lastPollTime - pollTime;
double alpha = 1 - Math.exp(-delta....
于 2010-05-08T11:22:54.273 回答
4

如果它在您的工作组中是可以接受的,那是完全可以接受的。这里的许多答案都是基于每个人都用英语编程的傲慢假设。如今,非英语程序员绝非罕见,而且他们正以越来越快的速度变得越来越少。当他们拥有一门非常好的语言时,他们为什么要限制自己使用英文版本?

除了英语傲慢之外,使用非英语标识符还有其他正当理由。例如,如果您正在编写数学包,如果您的目标是数学家,那么使用希腊语就可以了。当每个人都可以理解“Δ”并可能更快地键入它时,为什么人们要在您的工作组中键入“delta”?几乎任何问题领域都有自己的行话,有时这些行话用拉丁字母以外的其他方式表达。你到底为什么要尝试将所有内容都塞进 ASCII 码中?

于 2010-05-08T11:30:09.217 回答
2

这是一个绝妙的主意。诚实的。这在当时并不容易实现。让我们保留对它的引用以备将来使用。我希望看到三角形、圆形、正方形等......作为程序代码的一部分。但是现在,请尝试按照 Crozin 建议的方式重写它。

于 2010-05-08T11:39:56.730 回答
1

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

不幸的是,当您移动到纯 7 位 ASCII 字符之外时会遇到字符编码(UTF-8 与 ISO-Latin-1 与 UTF-16 等不同),这意味着您最终会遇到问题。从 Windows 迁移到 Linux 时,我遇到过这种情况。我们的国家斯堪的纳维亚字符在此过程中中断,但幸运的是仅在字符串中。然后我们对所有这些都使用了 \u 编码。

如果你可以绝对确定你永远不会遇到这样的事情——例如,如果你的文件包含正确的 BOM——那么一定要这样做。它将使您的代码更具可读性。如果至少有最小的怀疑,那就不要。

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

于 2010-05-08T12:00:01.207 回答
1

为什么不?如果编写该代码的人可以轻松地键入这些代码,那是可以接受的。

但是上帝帮助那些无法显示 unicode 或无法键入它们的人。

于 2010-05-08T11:04:04.447 回答