簡體   English   中英

將unicode符號用作Java標識符是一個好主意嗎?

[英]Is it a good idea to use unicode symbols as Java identifiers?

我有一段代碼如下:

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 APL功能符號ALPHA)是不同的字符!

  • 無法確定哪些字符有效。 代碼中的字符可以正常工作,但是當我使用FUNCTIONAL SYMBOL ALPHA時,我的Java編譯器會抱怨“非法字符:\\ 9082”。 即使功能符號在此代碼中更合適。 除了詢問 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 - 那么無論如何都要這樣做。 它將使您的代碼更具可讀性。 如果至少有最小的疑問,那就不要了。

(請注意,“使用非英語語言”是另一回事。我只是想用符號代替字母)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM