2010-05-08 23 views
24

que tienen un fragmento de código que se parece a esto:¿Es una buena idea usar símbolos Unicode como identificadores de Java?

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

¿Qué tan mala es una idea que utilice caracteres Unicode en los identificadores de Java? ¿O es esto perfectamente aceptable?

+42

¿¿¿ʎʎɐɐʞɯɯɯ 'pɐq sı ǝpoɔ uı ǝpoɔıun – polygenelubricants

+25

No estoy seguro de si acabo de votar hacia arriba, o lo rechacé ... – Thomas

+0

En una nota lateral, puede que esté interesado en consultar el lenguaje Fortress, desarrollado en Sol por (entre otros) Guy L Steele. Es compatible con una amplia gama de operadores Unicode e incluso los ASCII se pueden 'imprimir bonitos' en Unicode - ver http://projectfortress.sun.com/Projects/Community/wiki/MathSyntaxInFortress – Cowan

Respuesta

32

Es una mala idea, por varias razones. teclados

  • Muchas de las personas no son compatibles con estos personajes. Si tuviera que mantener ese código en un teclado QWERTY (o cualquier otro sin letras griegas), tendría que copiar y pegar esos caracteres todo el tiempo.

  • editores o terminales de algunas personas podrían no mostrar estos caracteres correctamente. Por ejemplo, algunos editores (desafortunadamente) todavía tienen una variante ISO-8859 (latina) predeterminada. La razón principal por la cual ASCII todavía es tan frecuente es que casi siempre funciona.

  • Incluso si los caracteres se pueden representar adecuadamente, pueden causar confusión. Straight from Sun (énfasis mío):

    identificadores que tienen el mismo aspecto externo aún puede ser diferente. Por ejemplo, los identificadores que consta de las letras individuales AMÉRICA CAPITAL letra A (A, \ u0041), LETRA AMÉRICA A (a, \ u0061), griega alfa CAPITAL letra (A, \ u0391), cirílico pequeña letra A (una , \ u0430) y BALL MATHEMATIC BOLD ITALIC A (a, \ ud835 \ udc82) son todos diferentes.

    ...

    caracteres Unicode compuestos son diferentes de los personajes descompuestos. Por ejemplo, una Letra latina mayúscula A aguda (A, \ u00c1) podrían ser considerados para ser la misma que una Letra latina mayúscula A (A, \ u0041) seguido inmediatamente por un no espaciado agudo (', \ u0301) cuando clasificación, pero estos son diferentes en identificadores.

    Esto es de ninguna manera un problema imaginario: α (T + 03b1 GRIEGO pequeña letra alfa) y ⍺ (U + 237A APL FUNCIONAL SÍMBOLO ALPHA) son diferentes personajes!

  • No hay manera de saber qué caracteres son válidos. Los caracteres de tu código funcionan, pero cuando uso el FUNCTIONAL SYMBOL ALPHA mi compilador de Java se queja de "carácter ilegal: \ 9082". Aunque el símbolo funcional sería más apropiado en este código. No parece haber una regla sólida sobre qué caracteres son aceptables, excepto askingCharacter.isJavaIdentifierPart().

  • Aunque puede que lo compile, parece dudoso que todas las implementaciones de la máquina virtual Java se hayan probado rigurosamente con los identificadores Unicode. Si estos caracteres solo se usan para variables en el alcance del método, deberían compilarse, pero si son miembros de la clase, también terminarán en el archivo .class, posiblemente rompiendo su programa en implementaciones de JVM defectuosas.

+0

Para ampliar el último punto: depende de la codificación de archivo predeterminada de la plataforma subyacente. Aunque esto es controlable usando '-Dfile.encoding' en Sun JVM (sí, la implementación de JVM depende ...), * realmente * no desea depender de eso. Esa es la gran sensación impo.Gran respuesta por cierto, +1. – BalusC

+4

@BalusC: Gracias, pero creo que has entendido mal. En el interior de los archivos '.class', solo se utiliza una codificación, y es algo similar a UTF-8. http://en.wikipedia.org/wiki/Class_%28file_format%29 Por lo que pude determinar, 'file.encoding' solo se usa para especificar la codificación predeterminada para clases como' InputStreamReader'. – Thomas

1

¿Por qué no? Si las personas que trabajan en ese código pueden escribir fácilmente, es aceptable.

pero Dios ayuda a los que no puede mostrar Unicode, o que no pueden escribirlas.

+2

Cualquiera que no pueda mostrar Unicode en este punto necesita salir de los 80 y en el siglo XXI. ¡Quiero decir que voltear RSTS/E tenía los inicios de i18n en su lugar! –

+1

@ttmrichter: Tendría razón si no hubiera una gran cantidad de máquinas mal configuradas y software desactualizado en ... – Thomas

+0

También en el mundo de Unix y Linux hay muchas personas que usan vim o emacs dentro de la consola para hacer sus cosas , y no hay garantía de que puedan ver o escribir caracteres Unicode. – LukeN

6

se ve bien, ya que utiliza los símbolos correctos, pero ¿cuántos de su equipo conocerán las teclas para esos símbolos?

Me gustaría utilizar una representación en inglés solo para que sea más fácil de escribir. Y otros pueden no tener un conjunto de caracteres que admita esos símbolos configurados en su pc.

4

Ese código está bien leer, pero horrible para mantener - Sugiero utilizar identificadores llanura Inglés, así:

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

es perfectamente aceptable si es aceptable en su grupo de trabajo. Muchas de las respuestas aquí operan bajo la arrogante suposición de que todos programan en inglés. Los programadores no ingleses no son en absoluto raros en estos días y cada vez son menos raros a un ritmo acelerado. ¿Por qué deberían limitarse a las versiones en inglés cuando tienen un lenguaje perfectamente bueno a su disposición?

La arrogancia anglófona a un lado, hay otras razones legítimas para usar identificadores que no estén en inglés. Si está escribiendo paquetes de matemáticas, por ejemplo, usar griego está bien si su objetivo son compañeros matemáticos. ¿Por qué la gente debe escribir "delta" en su grupo de trabajo cuando todos puedan entender "Δ" y probablemente lo escriban más rápido? Casi cualquier dominio de problema tendrá su propia jerga y, a veces esa jerga se expresa en algo que no sea el alfabeto latino. ¿Por qué demonios querrías probar y poner todo en ASCII?

+0

Absolutamente de acuerdo; Creo que si el grupo de trabajo lo considera aceptable, fácil de escribir y más claro, adelante. Lo único raro de hacer esto es que, en cierto modo, es un "golpe de suerte" que un personaje como Δ sea un inicio de identificador de Java válido, porque es una "letra". Otros caracteres con usos similares no son 'letras', y por lo tanto no son válidos. – Cowan

+0

-1 para "apestas porque solo sabes inglés". Hasta que alguien invente un lenguaje hablado como Python, no tendré ningún motivo para aprenderlo. Aunque todos en el mundo solo deberían hablar un idioma. El lenguaje es una necesidad básica, no un juego, como la programación. Está bien usar símbolos algebraicos aunque _cuando estás en un dominio específico_. –

+4

@Longpoke: Por favor, apunte a donde dije "apestas porque solo sabes inglés". (Sugerencia: Esto no es posible.) Infierno, apunte a donde incluso * inferí * esto. (Pista: Esto, también, no es posible.) Lo que estoy señalando, sin embargo, es que la gente que dice "no uses Unicode en identificadores porque hace las cosas difíciles de leer" están tomando el ** muy ** arrogante actitud que solo cuentan los programadores de habla inglesa. De ahí la "arrogancia anglófona". –

2

Es una excelente idea. Honesto. Simplemente no es fácil de usar en el momento. Mantengamos una referencia para el futuro. Me gustaría amor para ver triángulos, círculos, cuadrados, etc. ... como parte del código del programa. Pero por ahora, intenten volver a escribirlo, como sugiere Crozin.

1

En un mundo perfecto, esta sería la manera recomendada.

Desafortunadamente se encuentra con codificaciones de caracteres cuando se mueve fuera de los caracteres simples ASCII de 7 bits (UTF-8 es diferente de ISO-Latin-1 es diferente de UTF-16, etc.), lo que significa que eventualmente tendrá problemas. Esto me ha pasado al pasar de Windows a Linux. Nuestros personajes escandinavos nacionales se rompieron en el proceso, pero afortunadamente solo lo hicieron. Luego usamos la codificación \ u para todos esos.

Si puede estar absolutamente seguro de que nunca, nunca se encontrará con algo así - por ejemplo, si sus archivos contienen una lista de materiales adecuada - entonces, por supuesto, haga esto. Hará que tu código sea más legible. Si al menos la menor cantidad de dudas, entonces no.

(Tenga en cuenta que el "uso de idiomas distintos del inglés" es una cuestión diferente. Solo estoy pensando en usar símbolos en lugar de letras).

+0

Esos símbolos * son * idiomas no ingleses. Delta y alpha son griegos. Ese es un lenguaje Eso no es inglés –

+1

@ttmricher, me refería al uso de identificadores en su idioma nativo en lugar de utilizar los términos en inglés. (Como Cheval en lugar de Horse si es francés). Esto es diferente de usar "Δ" en el sentido matemático tal como se le preguntó. –

Cuestiones relacionadas