Подтвердить что ты не робот

Является ли хорошей идеей использовать символы юникода в качестве идентификаторов Java?

У меня есть фрагмент кода, который выглядит так:

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

Насколько плоха идея использовать символы Unicode в Java-идентификаторах? Или это вполне приемлемо?

4b9b3361

Ответ 1

Это плохая идея, по разным причинам.

  • Многие персональные клавиатуры не поддерживают эти символы. Если бы я должен был поддерживать этот код на qwerty-клавиатуре (или любой другой без греческих букв), мне пришлось бы копировать и вставлять эти символы все время.

  • Некоторые редакторы или терминалы могут не отображать эти символы должным образом. Например, некоторые редакторы (к сожалению) по-прежнему по умолчанию используют некоторый вариант ISO-8859 (латинский). Основная причина, по которой ASCII все еще так распространена, заключается в том, что она почти всегда работает.

  • Даже если символы могут отображаться правильно, они могут вызвать путаницу. Прямо от Солнца (внимание мое):

    Идентификаторы, которые имеют один и тот же внешний вид, могут быть разными. Например, идентификаторы, состоящие из одиночных букв ЛАТИНСКАЯ КАПИТАЛА ПИСЬМА A (A,\u0041), ЛАТИНСКОЕ МАЛОЕ ПИСЬМО 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 AUTT (Á,\u00c1) можно считать таким же, как LATIN CAPITAL LETTER A (A,\u0041), после чего после сортировки сразу же следует НЕРАЗРЕШЕНИЕ ОСТРАЯ (',\u0301), но они различаются в идентификаторах.

    Это никоим образом не является мнимой проблемой: α (U + 03b1 GREEK SMALL LETTER ALPHA) и ⍺ (U + 237a APL FUNCTIONAL SYMBOL ALPHA) - разные символы!

  • Невозможно определить, какие символы действительны. Персонажи вашего кода работают, но когда я использую FUNCTIONAL SYMBOL ALPHA, мой компилятор Java жалуется на "незаконный символ:\9082". Хотя функциональный символ будет более уместным в этом коде. Кажется, что нет правильного правила о том, какие символы приемлемы, кроме с запросом Character.isJavaIdentifierPart().

  • Несмотря на то, что вы можете его компилировать, представляется сомнительным, что все реализации виртуальной машины Java были тщательно протестированы с помощью идентификаторов Unicode. Если эти символы используются только для переменных в области методов, их следует скомпилировать, но если они являются членами класса, они также попадут в файл .class, возможно, нарушив вашу программу при ошибках реализации JVM.

Ответ 2

выглядит хорошо, так как он использует правильные символы, но сколько из вашей команды узнают нажатия клавиш для этих символов?

Я бы использовал английское представление, чтобы упростить его ввод. И другие могут не иметь набора символов, который поддерживает эти символы, установленные на их ПК.

Ответ 3

Это вполне приемлемо, если оно приемлемо в вашей рабочей группе. Многие ответы здесь основаны на высокомерном предположении, что все программы на английском языке. В наши дни неанглийские программисты отнюдь не редки, и они становятся менее редкими темпами. Почему они должны ограничивать себя английскими версиями, когда у них есть отличный язык?

Англоязычное высокомерие в стороне, есть и другие законные причины использования неанглийских идентификаторов. Если вы пишете пакеты математики, например, использование греческого языка прекрасно, если ваша цель - математики-математики. Почему люди должны набирать "дельту" в вашей рабочей группе, когда каждый может понять "Δ" и, скорее всего, напечатать ее быстрее? Почти любая проблемная область будет иметь свой собственный жаргон, и иногда этот жаргон выражается в чем-то, кроме латинского алфавита. Почему на Земле вы хотели бы попробовать все заткнуть в ASCII?

Ответ 4

Этот код хорош для чтения, но ужасно для поддержки - я предлагаю использовать простые английские идентификаторы, например:

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

Ответ 5

Это отличная идея. Честный. В то время это было просто невозможно. Дайте ссылку на нее на будущее. Я хотел бы видеть треугольники, круги, квадраты и т.д. Как часть программного кода. Но пока, пожалуйста, попробуйте переписать его, как предлагает Крозин.

Ответ 6

Почему бы и нет? Если люди, работающие над этим кодом, могут легко их набирать, это приемлемо.

Но бог поможет тем, кто не может отображать юникод, или кто не может их набирать.

Ответ 7

В идеальном мире это было бы рекомендуемым способом.

К сожалению, вы попадаете в кодировки символов при перемещении за пределы обычных 7-битных символов ASCII (UTF-8 отличается от ISO-Latin-1 отличается от UTF-16 и т.д.), что означает, что в конечном итоге вы столкнетесь с проблемами. Это произошло со мной при переходе с Windows на Linux. Наши национальные скандинавские персонажи ворвались в этот процесс, но, к счастью, были только в строках. Затем мы использовали кодировку \u для всех этих.

Если вы можете быть абсолютно уверены, что никогда не столкнетесь с такой ситуацией - например, если ваши файлы содержат надлежащую спецификацию, то непременно сделайте это. Это сделает ваш код более читаемым. Если, по крайней мере, минимальное количество сомнений, тогда не делайте этого.

(Обратите внимание, что "использование неанглийских языков" - это другое дело. Я просто думаю об использовании символов вместо букв).