¿Es malo usar caracteres Unicode en nombres de variables? [cerrado]

80

Recientemente intenté implementar un algoritmo de clasificación, AllegSkill, a Python 3.

Así es como se ve la matemática:

  

    

No, en serio.

Esto es entonces lo que escribí:

t = (µw-µl)/c  # those are used in
e = ε/c        # multiple places.
σw_new = (σw**2 * (1 - (σw**2)/(c**2)*Wwin(t, e)) + γ**2)**.5

En realidad pensé que es desafortunado de Python 3 no aceptar o ² como nombres de variables.

>>> √ = lambda x: x**.5
  File "<stdin>", line 1
    √ = lambda x: x**.5
      ^
SyntaxError: invalid character in identifier

¿Estoy fuera de mi mente? ¿Debería haber recurrido a una versión solo ASCII? ¿Por qué? ¿No sería más difícil validar una equivalencia con las fórmulas en una versión ASCII de lo anterior?

Fíjate, entiendo que algunos glifos de Unicode se parecen mucho entre sí y otros como (o es que ▗▖) o ╦ simplemente no pueden tener ningún sentido en el código escrito. Sin embargo, este no es el caso de las matemáticas o los glifos de flecha.

Por solicitud, la única versión ASCII sería algo así como:

winner_sigma_new = ( winner_sigma ** 2 *
                    ( 1 -
                     ( winner_sigma ** 2 -
                       general_uncertainty ** 2
                     ) * Wwin(t,e)
                    ) + dynamics ** 2
                   )**.5

... para cada paso del algoritmo.

    
pregunta badp 01.11.2010 - 11:51

15 respuestas

52

Creo firmemente que el simple hecho de reemplazar σ con s o sigma sería estúpido, rozando la muerte cerebral.

¿Cuál es la ganancia potencial? Bueno, veamos ...

  • ¿Mejora la legibilidad? No, no en lo más mínimo. Si así fuera, la fórmula original indudablemente también habría usado letras latinas.

  • ¿Mejora la capacidad de escritura? A primera vista, sí. Pero en el segundo, no. Debido a que esta fórmula nunca va a cambiar (bueno, "nunca"). Normalmente no habrá necesidad de cambiar el código, ni de extenderlo usando estas variables. Por lo tanto, la capacidad de escritura es, solo esta vez, no es un problema.

Personalmente, creo que los lenguajes de programación tienen una ventaja sobre las fórmulas matemáticas: puedes usar identificadores significativos y expresivos. En matemáticas, este no suele ser el caso, por lo que recurrimos a variables de una letra, que en ocasiones las hacen griegas.

Pero el griego no es el problema. Los identificadores no descriptivos de una letra son.

Así que, o bien, conserva la notación original ... después de todo, si el lenguaje de programación es compatible con Unicode en los identificadores, no hay ninguna barrera técnica. O utilice identificadores significativos. No solo reemplace los glifos griegos con glifos latinos. O los árabes, o los hindi.

    
respondido por el Konrad Rudolph 01.11.2010 - 17:53
34

Personalmente, odiaría ver el código donde debo mostrar el mapa de caracteres para escribirlo de nuevo. A pesar de que el código Unicode coincide estrechamente con el algoritmo, realmente perjudica la capacidad de lectura y la capacidad de edición. Es posible que algunos editores ni siquiera tengan una fuente que admita ese carácter.

¿Qué pasa con una alternativa y solo tienes arriba //µ = u y escribe todo en ascii?

    
respondido por el TheLQ 01.11.2010 - 12:21
31

Este argumento asume que no tienes problemas con escribir unicodes ni leer letras griegas

Aquí está el argumento: ¿te gustaría pi o circular_ratio?

En este caso, preferiría pi a circular_ratio porque he aprendido sobre pi desde que estaba en la escuela primaria y puedo esperar que la definición de pi esté bien arraigada para todos los programadores que valgan la pena. Por lo tanto, no me importaría escribir π para referirse a circular_ratio.

Sin embargo, ¿qué pasa con

winner_sigma_new = ( winner_sigma ** 2 *
                    ( 1 -
                     ( winner_sigma ** 2 -
                       general_uncertainty ** 2
                     ) * Wwin(t,e)
                    ) + dynamics ** 2
                   )**.5

o

σw_new = (σw**2 * (1 - (σw**2)/(c**2)*Wwin(t, e)) + γ**2)**.5

Para mí, ambas versiones son igualmente opacas, al igual que pi o π es, excepto que no aprendí esta fórmula en la escuela primaria. winner_sigma y Wwin no significan nada para mí, ni para nadie más que lea el código, y usar ninguno de los dos σw lo mejora.

Por lo tanto, usando nombres descriptivos, por ejemplo, total_score , winning_ratio , etc. aumentaría la legibilidad mucho mejor que usar nombres ascii que simplemente pronuncian letras griegas . El problema no es que no pueda leer letras griegas, pero no puedo asociar los caracteres (griegos o no) con un "significado" de la variable.

Ciertamente entendiste el problema cuando comentaste: You should have seen the paper. It's just eight pages... . El problema es que si basa su nombre de variable en un papel, que elige nombres de una sola letra por concisión en lugar de legibilidad (independientemente de que sean griegos), entonces la gente tendría que leer el documento para poder asociar las letras con un "sentido"; esto significa que está colocando una barrera artificial para que las personas puedan entender su código, y eso siempre es algo malo.

Incluso cuando vives en un mundo solo ASCII, tanto a * b / 2 como alpha * beta / 2 son una representación igualmente opaca de height * base / 2 , la fórmula del área del triángulo. La imposibilidad de leer el uso de variables de una sola letra crece exponencialmente a medida que la fórmula crece en complejidad, y la fórmula AllegSkill ciertamente no es una fórmula trivial.

La variable de una sola letra solo es aceptable como un contador de bucle simple, ya sea una sola letra griega o una sola letra ascii, no me importa; Ninguna otra variable debe consistir únicamente en una sola letra. No me importa si usa letras griegas para sus nombres, pero cuando las use, asegúrese de poder asociar esos nombres con un "significado" sin necesidad de leer un documento arbitrario en otra parte.

Cuando estoy en la escuela primaria, definitivamente no me importaría ver expresiones matemáticas usando símbolos como: +, -, ×, ÷, para aritmética básica y √ () sería una función de raíz cuadrada. Después de graduarme de la escuela primaria, no me importaría agregar nuevos y brillantes símbolos: ∫ para la integración. Tenga en cuenta la tendencia, estos son todos los operadores. Los operadores son mucho más utilizados que los nombres de variables, pero se reutilizan con menos frecuencia para un significado completamente diferente (en el caso de que los matemáticos reutilicen a los operadores, el nuevo significado a menudo todavía tiene algunas propiedades básicas del significado antiguo; este no es el caso para al reutilizar nombres de variables).

En conclusión, no, no es malo usar caracteres Unicode para nombres de variables; sin embargo, siempre es malo usar nombres de una sola letra para los nombres de variables, y tener permiso para usar nombres de Unicode no es una licencia para usar nombres de variables de una sola letra.

    
respondido por el Lie Ryan 01.11.2010 - 15:50
14

¿Entiendes el código? ¿Todos los demás que necesitan leerlo? Si es así, no hay problema.

Personalmente, me complacería ver la parte posterior del código fuente solo para ASCII.

    
respondido por el user4051 01.11.2010 - 12:19
9

Sí, estás fuera de tu mente. Me referiría personalmente al documento y al número de la fórmula en un comentario, y escribiría todo en ASCII directo. Entonces, cualquier persona interesada podría correlacionar el código y la fórmula.

    
respondido por el zvrba 01.11.2010 - 13:16
5

Yo diría que usar nombres de variables Unicode es una mala idea por dos razones:

  1. Son un PITA para escribir.

  2. A menudo se ven casi igual que las letras en inglés. Esta es la misma razón por la que odio ver las letras griegas en notación matemática. Intenta diferenciar a rho de la p. No es fácil.

respondido por el dsimcha 01.11.2010 - 14:55
4

En este caso, una fórmula matemática compleja, diría que vaya por ella.

Puedo decir que en 20 años nunca tuve que codificar algo tan complejo y las letras griegas lo mantienen cerca de las matemáticas originales. Si no puedes entenderlo, no deberías mantenerlo.

Dicho esto, si alguna vez tengo que mantener µ y σ en el código estándar de bog que me legaste, descubriré dónde vives ...

    
respondido por el gbn 01.11.2010 - 18:58
3
  • Pro: se ve bien
  • Con: los caracteres Unicode y, por lo tanto, todo el significado podría perderse en la cadena de herramientas (editor, formateador de código, control de versiones, compilador anterior)

¿Qué tan grande es el riesgo para ti? ¿La ganancia supera el riesgo?

    
respondido por el LennyProgrammers 01.11.2010 - 12:34
2

En un futuro no muy lejano, todos usaremos editores de texto / IDE / navegadores web que facilitan la escritura del texto de edición, incluidos los caracteres griegos clásicos, etc. (O quizás todos hemos aprendido a usar esta funcionalidad "oculta" en las herramientas que utilizamos actualmente ...)

Pero hasta que eso suceda, la tarea de muchos programadores sería difícil de manejar con los caracteres no ASCII en el código fuente del programa y, por lo tanto, es una mala idea si está escribiendo aplicaciones que es posible que otra persona deba mantener.

(Por cierto, la razón por la que puede tener caracteres griegos pero no signos de raíz cuadrada en los identificadores de Python es simple. Los caracteres griegos se clasifican como letras Unicode, pero el signo de raíz cuadrada no es una letra; consulte enlace )

    
respondido por el Stephen C 01.11.2010 - 13:02
2

No dijo qué idioma / compilador está utilizando, pero generalmente la regla para los nombres de variables es que deben comenzar con un carácter alfabético o un guión bajo, y que solo contienen caracteres alfanuméricos y guiones bajos. Un Unicode √ no se consideraría alfanumérico, ya que es un símbolo matemático en lugar de una letra. Sin embargo, σ podría ser (ya que está en el alfabeto griego) y á probablemente se consideraría alfanumérico.

    
respondido por el tcrosley 01.11.2010 - 15:32
1

Publiqué el mismo tipo de pregunta en StackOverflow

Definitivamente creo que vale la pena usar Unicode en problemas pesados relacionados con las matemáticas, porque hace posible leer la fórmula directamente, lo cual es imposible con ASCII simple.

Imagine una sesión de depuración: por supuesto, siempre puede escribir a mano la fórmula que el código debe calcular para ver si es correcta. Pero el noventa por ciento de las veces, no te molestarás y el error puede permanecer oculto durante mucho tiempo. Y nadie está dispuesto a ver esta fórmula ASCII simple, de 7 líneas, abstracta. Por supuesto, usar Unicode no es tan bueno como una fórmula de tex, pero es mucho mejor.

La alternativa de usar nombres descriptivos largos no es viable porque en matemáticas, si el identificador no es corto, la fórmula parecerá aún más complicada (¿por qué cree que las personas, alrededor del siglo XVIII, comenzaron a reemplazar "más" por "+" y "menos" por "-"?).

Personalmente, también usaría algunos subíndices y superíndices (simplemente los copio y pego desde esta página ). Por ejemplo: (tenía python permitido √ como identificador)

√ = math.sqrt #function alias
c² = c**2
σʷ² = σʷ**2
γ² = γ**2
σ′ʷ = √(σʷ² * (1 - (σʷ²/c²)*Wʷⁱⁿ(t, e)) + γ²)

Donde utilicé superíndices porque no hay subíndice equivalente en Unicode. (Desafortunadamente, el conjunto de caracteres de subíndices de Unicode es muy limitado. Espero que algún día, las suscripciones en Unicode se consideren como signos diacríticos, es decir, una combinación de un carácter para el subíndice y otro carácter para la letra con el subíndice).

Una última cosa, creo que esta conversación sobre el uso de caracteres no ASCII está principalmente sesgada, porque muchos programadores nunca tratan con "fórmulas matemáticas intensivas en fórmulas". Entonces piensan que esta pregunta no es tan importante, porque nunca experimentaron una parte significativa del código que requeriría el uso de identificadores que no sean ASCII. Si usted es uno de ellos (y lo fui hasta hace poco), considere esto: suponga que la letra "a" no es parte de ASCII. Entonces, tendrá una idea bastante clara del problema de no tener letras griegas, subíndices o superíndices al calcular fórmulas matemáticas no triviales.

    
respondido por el Bérenger 14.09.2014 - 06:16
0

¿Este código es solo para tu proyecto personal? Si es así, enloquece, usa lo que quieras.

¿Este código está destinado para que otros lo utilicen? es decir, y una aplicación de código abierto de algún tipo? Si es así, es probable que solo estés pidiendo problemas porque diferentes programadores usan editores diferentes, y no puedes estar seguro de que todos los editores admitirán Unicode correctamente. Además, no todos los shells de comando lo mostrarán correctamente cuando el archivo de código fuente esté escrito / cat'd, y puede tener problemas si necesita mostrarlo dentro de html.

    
respondido por el GrandmasterB 01.11.2010 - 19:05
0

personalmente, estoy motivado a considerar los lenguajes de programación como una herramienta para los matemáticos en este contexto, ya que en realidad no uso las matemáticas que se parecen en nada a mi vida. : D Y claro, ¿por qué no usar ɛ o σ o lo que sea? En ese contexto, en realidad es más legible.

(Aunque, debo decir, mi preferencia sería admitir números en superíndice como llamadas de método directo, no nombres de variables. por ejemplo, 2² = 2 ** 2 = 4, etc.)

    
respondido por el roberto 01.05.2011 - 13:59
-2

¿Qué diablos es σ , qué es W , qué es ε , c y qué es γ ?
Debe nombrar sus variables de una manera que explique cuál es su propósito.
Personalmente le pegué a cualquiera que dejara el Unicode o la versión ASCII para que yo lo mantenga, aunque la versión ASCII es mejor.

Lo que es malo es llamar a las variables σ o s o sigma o value o var1 , porque esto no transmite ninguna información.

Suponiendo que escriba su código en inglés (como creo que debería hacerlo de donde sea que esté), ASCII debería ser suficiente para dar nombres significativos a sus variables, por lo que no hay una necesidad real de Unicode.

    
respondido por el back2dos 01.11.2010 - 14:18
-2

Para nombres de variables con orígenes matemáticos conocidos, esto es absolutamente aceptable, incluso preferido. Pero si alguna vez espera distribuir el código, debe colocar estos valores en un módulo, clase, etc., de modo que el IDE pueda completar "escribiendo" los caracteres extraños.

Usar √ o ² en un identificador, no tanto.

    
respondido por el rich remer 15.06.2014 - 05:35

Lea otras preguntas en las etiquetas