Errores ortográficos intencionales para evitar palabras reservadas

45

A menudo veo códigos que incluyen errores ortográficos intencionales de palabras comunes que, para bien o para mal, se han convertido en palabras reservadas:

  • klasso clazzpara la clase :Class clazz = ThisClass.class
  • kountpara contar en SQL:count(*) AS kount

Personalmente, encuentro que esto disminuye la legibilidad. En mi propia práctica, no he encontrado demasiados casos en los que no se podría haber usado un nombre mejor, itemClasso recordTotal.

Un ejemplo de JavaDocs para Class muestra esto en los parámetros:

 public <U> Class<? extends U> asSubclass(Class<U> clazz)

¿Muestra esto un caso de uso razonable?

Nicole
fuente
99
Para el registro: en Python, clses un nombre común (de hecho, el único idiomático) para variables / argumentos que continúan las clases reales (las que declara con la classpalabra clave y de las cuales todo es una instancia).
14
¿No te gusta typedef char ínt?
Jeff
14
@muntoo Tienes razón. También recibo errores de compilación para iñt. Ahí va mi plan para la dominación mundial.
Jeff
1
He roto esta regla ... y ahora siento vergüenza.
jmq
3
No lo hagas Puedo decir honestamente que nunca había visto esto antes, y si lo hiciera, inmediatamente le cambiaría el nombre. Solo abrevie si tiene que usar un nombre de variable no descriptivo ( Class c).
Cody Gray

Respuestas:

63

En mi humilde opinión, esta es una muy mala idea. Las palabras reservadas están reservadas por una razón, y hacer esto disminuye la legibilidad.

También estoy totalmente de acuerdo con tu segundo punto. Nombrar una variable class, incluso si pudieras hacerlo, sería tan malo como nombrarla tmpo a. Que clase de clase ¿Una clase de qué? Los nombres deben ser descriptivos.

Dima
fuente
15
"Las palabras reservadas están reservadas por una razón" <- Esto. (Lo cual, irónicamente, está reservado.)
trycatch
16
+1 porque tienes razón. Pero si estuviera escribiendo un software de programación de clase, o algo así, la clase podría ser una variable legítima o un nombre de clase ...
CaffGeek
8
Meh "Las palabras reservadas están reservadas por una razón ", que es que los diseñadores de idiomas son flojos. Hay bastantes idiomas sofisticados donde las palabras solo se reservan en los lugares específicos donde se usan. Pero Ritchie comenzó esta tendencia cuando necesitaba un compilador ligero para C, y la mayoría de los diseñadores de idiomas lo aprendieron a partir de ahí.
Ross Patterson el
14
no Ross, es porque los programadores (y los lectores en general) tienen la expectativa de que las cosas tengan un significado razonablemente inequívoco (es por eso que aprender idiomas extranjeros es a menudo tan difícil, todas las cosas con un doble significado o un significado diferente del idioma que se crió) desde la infancia donde nunca notas esas ambigüedades porque son parte de tu patrimonio cultural).
Jwenting
3
@AlexanderMorou Nope, y tampoco tienen la mayoría de los diseñadores de idiomas, simplemente comienzan con el diseño de otra persona. Pero observe Algol, Fortran, PL / I, Rexx y otros lenguajes no basados ​​en C, y verá que las gramáticas sin palabras reservadas son ciertamente posibles, solo que más difíciles. Ritchie tenía una buena razón: la gente de Unix sentía que cada pulsación de tecla importaba, y en un PDP-11, cada ciclo de CPU importaba. ¿Hoy? No tanto.
Ross Patterson
21

La Guía de estilo de Python menciona este problema específicamente y sugiere:

Si el nombre de su atributo público choca con una palabra clave reservada, agregue un guión bajo al nombre de su atributo. Esto es preferible a una abreviatura o una ortografía corrupta.

Esto parece una regla general bastante buena, suponiendo que no entre en conflicto con la semántica de un idioma en particular.

Ryan
fuente
77
Siento que este es un consejo realmente pobre de una guía de estilo. Si el nombre de su atributo está tan cerca de una palabra clave, debería encontrar un nombre mejor. Simplemente pegar un guión bajo al final no agrega ningún significado y es probable que confunda al siguiente tipo que lee el código.
Wayne Johnston
18
@Wayne: ¿Cómo va a nombrar la operación de unión en una estructura de búsqueda de unión cuando uniones una palabra clave (como en C)? ¿Vas a llamarlo foosolo porque no debería verse así union?
Fred Foo
OTOH, clses el nombre de argumento estándar para el método de clase. También, por ejemplo, en Django los objetos tienen un .idatributo, que por supuesto entra en conflicto con la idfunción incorporada.
vartec
1
@GoloRoden Nunca escuché a nadie decir que estaban "uniendo" dos conjuntos al calcular la unión. Simplemente no es parte de la jerga. "Combinar" sería mejor, pero un mergemétodo aún necesitaría documentación que establezca explícitamente que implementa union y fue renombrado por razones puramente técnicas.
Fred Foo
2
@GoloRoden Según Merriam-Webster, no es un verbo, pero mira esta respuesta .
maaartinus
18

Código de olor.

string stringVariable = "";

El código anterior no me dice nada sobre el uso previsto de las variables.

class Klass

El mismo problema

string UserNameString = "bmackey"

El código anterior no debe requerir una cadena de palabras clave agregada al nombre de la variable. Si necesita identificar tipos por nombre de variable, su código es demasiado largo. Condensador-refactor.

P.Brian.Mackey
fuente
No le dice nada porque no es "código", es una declaración de variable aislada. Una "clase" o "klass" puede decirle todo lo que necesita saber. Por ejemplo, un método genérico puede recibir un Class<T>parámetro, y esto puede tener sentido. Así que no estoy de acuerdo con que sea un olor a código.
Andres F.
5

Personalmente, creo que es una opción perfectamente válida para su estilo de código.

Son palabras reservadas para que el compilador no tenga que decidir si se refería a la mecánica del lenguaje o su variable. Con eso en mente, implica que esperan que las personas necesiten una variable como una palabra reservada.

Al revisar la fuente incluida con JDK 1.6 R21, encuentro 917 ocurrencias de "clazz". Aparentemente, pensaron que era un estilo aceptable.

¿Cómo se siente tu equipo al respecto? Si crees que es malo, pero los otros 9 muchachos de tu equipo piensan que es bueno, entonces tienes que morder la bala y aceptarlo. Siempre y cuando haya comunicación sobre lo que está bien y lo que no, y está planteando problemas que ve como los ve, debería estar bien.

Lo que siente su equipo sobre el estilo de código es más importante que mi opinión, o la de cualquier otra persona en esta publicación . Eso vale para esta y cualquier otra decisión de estilo de código que pueda tener.

corsiKa
fuente
1
Correcto, pero eventualmente su equipo cambiará. Muchos años más adelante habrá un pobre tipo que mirará su código lleno de lentes y zumbidos y dirá "¡WTF!".
MrFox
44
Si está utilizando ambos klassy clazzeso es algo malo. Debes ser coherente para que solo tengan que aprenderlo una vez. E idealmente, esto también se explica en las pautas de estilo de los equipos, por lo que no es una gran sorpresa.
corsiKa
El código está escrito no solo para las personas de su equipo, sino para que lo lea el resto del mundo. Cuando todo su equipo está en un autobús que pasa por un precipicio, alguien más comienza a leer el código. Utilice nombres que describan de manera completa y concisa cuál es la variable, no cómo se representa.
Rob K
1
No, simplemente no. Su equipo tiene muchas más probabilidades de rotar a los miembros lentamente con el tiempo. Puede planificar que una persona sea atropellada por un autobús, pero no puede planificar que todo su equipo sea atropellado por un autobús. La mayoría del código está escrito para una docena de personas que necesitan leerlo, la mitad durante la revisión del código.
corsiKa
4

Los errores ortográficos intencionales para evitar palabras reservadas son una mala idea.

  • Los errores ortográficos son difíciles de distinguir de la ortografía correcta, por lo tanto, hacen que el código sea más difícil de leer.

  • Los errores ortográficos son difíciles de recordar, por lo que es probable que varios errores ortográficos inconsistentes compitan dentro del código, lo que hace que el código sea más difícil de escribir y de leer.

  • Las palabras reservadas se refieren al lenguaje utilizado para resolver el problema, no al problema en sí. Un nombre de variable debe apuntar a un concepto relacionado con el problema.

Por lo tanto, es mejor elegir un nombre descriptivo alternativo o, si no existe una alternativa satisfactoria, calificar la palabra reservada como en:

public static Method findBenchmarkMethod(BenchmarkRecord benchmark) {
    Class<?> benchmarkedClass = ClassUtils.loadClass(benchmark.generatedClass());
    return findBenchmarkMethod(benchmarkedClass, benchmark.generatedMethod());
}
usuario40989
fuente
3

Class clazzhuele a "No me molesté en tratar de encontrar un buen nombre". Una variable siempre representa algo, y un buen nombre lo describe. Me niego a imaginar que, clazzpor ejemplo, bajo ninguna circunstancia sea el mejor nombre posible. ¿Es una referencia a una clase?> Class_reference; es una copia de un objeto de clase?

java.lang.SecurityManager.checkMemberAccess(Class<?> clazz, int which)
Parameters
    clazz -- the class that reflection is to be performed on.

Aquí clazz es la clase de destino en la que se realizará la verificación, por lo que

checkMemberAccess(Class<?> target, int which)

describiría mucho mejor para qué se usa el parámetro de lo que nunca lo hará clazz.

hlovdal
fuente
En mi humilde opinión, no es mejor, podría llamarlo 'classToBeAccessed` o lo que sea, pero cualquier nombre más descriptivo solo muestra lo obvio. Me gustan los nombres largos solo si proporcionan información útil.
maaartinus
1
classToBeAccessedes un buen nombre de hecho ( classToBeCheckedquizás sería aún mejor).
hlovdal
1

Si usan un nombre reservado para una variable, es una variable mal nombrada. Incluso si es un nombre legítimo, como Clase para software de aula.

Las variables mal nombradas son un signo de código mal pensado o casual; tenga cuidado con otras trampas en el Software que está manteniendo.

jueves
fuente
0

Creo que los errores ortográficos o abreviaturas intencionales son una buena idea si se usan con cuidado y de manera consistente .

Considere en Java:

class X { public X() { } }
X x = new X();
x.getClass;  // Wha?  How does "get" help anything?
x.class;     // Best, but requires more lexer/parser work
x.klass;     // At least as good as getClass
x.clazz;     // Same

El lugar para usar errores ortográficos es donde la palabra reservada es claramente la mejor palabra para el trabajo. Hay dos lugares para no usar errores ortográficos en los que podría sentirse tentado.

  1. No tienes ganas de pensar en un buen nombre
  2. Solo desea una variable ficticia y no necesita un nombre descriptivo

En el primer caso, es bastante obvio que la pereza rara vez es una buena política para crear código de calidad. En el segundo caso, elija una variable realmente corta. Eso es lo que los matemáticos hacen todo el tiempo, y los programadores hacen para los índices. No hay razón para limitarse a hacer esto para los índices si realmente es solo una variable ficticia:

boolean isMyName(String testName) { return myName.equals(testName); }
boolean isMyName(String s) { return myName.equals(s); }

Date nextMeeting(Klass klass) { return /* something */ }
Date nextMeeting(Klass k) { return /* something */ }

No pierde nada con nombres cortos de variables cuando el método o la estructura del código le dice qué debe estar allí.

Rex Kerr
fuente
2
Lo siento, no puedo estar de acuerdo. ¿Cómo funciona nextMeeting exactamente? La lógica es oscura. Me estás obligando a buscar la definición de Klass cada vez que leo tu código porque el nombre no tiene sentido. Si, en cambio, tuviera nextMeeting (MeetingRoom meetingRoom), tendría una definición de clase menos (klass? Clazz?) Para leer y, por lo tanto, sería más productiva. El código se lee mucho más que se escribe.
MrFox
@suslik: nextMeeting(MeetingRoom r)es suficiente. ¿Qué te está meetingRoomllevando allí? Si lo fuera nextMeeting(int meetingRoom), lo entendería, pero mi punto es usar nombres de variables cortos cuando la información ya está disponible en otras fuentes .
Rex Kerr
Mi publicación fue más sobre la existencia de Klass en la base de código. A veces estoy de acuerdo con nombres cortos de variables, pero si sus métodos se alargan y usted tiene que seguir aumentando para asegurarme de que "r" es un MeetingRoom, entonces eso tampoco es genial. Sin embargo, tengo curiosidad por saber cuál es la desventaja de meetingRoom. Espacio horizontal? ¿Demasiado tiempo para escribir?
MrFox
@suslik: sí, pierde el contexto horizontal con nombres largos de variables. Pierdes el contexto vertical con métodos largos, por lo que es mejor tratar de evitarlos (pero estoy de acuerdo que si lo haces de todos modos, probablemente quieras que tus nombres de variables sean mejores recordatorios). Klassera una alternativa cuando había una palabra reservada . ¡No recomiendo usar un error ortográfico cuando la ortografía original esté disponible!
Rex Kerr
0

He visto usos legítimos de Class klasscuando hago reflexiones donde realmente trabajas con una instancia de la Classclase.

Mateo
fuente
2
La pregunta no es si hay algún caso en el que tenga una instancia, sino si debe usar esa ortografía o un nombre más descriptivo como userClassu otra opción.
Nicole
2
En tal caso, preferiría classInstancemás klass.
Konrad Morawski
2
@ KonradMorawski: Pero todos los objetos con los que trabaja son instancias, por lo que classInstancees bastante redundante. Además, me podría imaginar algo así class klass; Object classInstance = klass.newInstance;.
maaartinus
0

A menudo veo códigos que incluyen errores ortográficos intencionales de palabras comunes que, para bien o para mal, se han convertido en palabras reservadas:

klass o clazz para clase: Class clazz = ThisClass.class

kount for count en SQL: count (*) AS kount

Personalmente, encuentro que esto disminuye la legibilidad. En mi propia práctica, no he encontrado muchos casos en los que no se podría haber usado un nombre mejor: itemClass o recordTotal.

Sin embargo, es tan común que no puedo evitar preguntarme si soy el único. ¿Alguien tiene algún consejo o incluso mejor, recomendaciones citadas de programadores respetados sobre esta práctica?

Para variables locales y argumentos formales, simplemente no importa.

Cualquier nombre está bien siempre que no sea intencionalmente engañoso o molesto. En tu ejemplo:

public static Method findBenchmarkMethod(BenchmarkRecord benchmark) {
    Class<?> clazz = ClassUtils.loadClass(benchmark.generatedClass());
    return findBenchmarkMethod(clazz, benchmark.generatedMethod());
}

no importa si la variable local única es "clazz" o "klass" o "cls" o simplemente "c". Probablemente solo en línea la expresión:

return findBenchmarkMethod(ClassUtils.loadClass(benchmark.generatedClass()),
                           benchmark.generatedMethod());

La longitud del nombre de una variable debe estar relacionada con el alcance de la variable. Para las variables locales en métodos cortos (y todos deberían ser cortos), los nombres muy cortos están bien.

Kevin Cline
fuente
su línea parece incorrecta ClassUtils.loadClass(benchmark.generatedClass())=> benchmark.generatedClass()- perdida ClassUtils.loadClassen el camino
mosquito
0

Creo que los errores ortográficos son siempre una mala idea. Simplemente no es agradable para tus lectores. Yo, por mi parte, me preguntaría si me perdí algo cuando veo la palabra klass. (¿Significaron classo significaron el pirata?) Al menos para mí, todos los errores ortográficos que reconozco son irritantes.

Para los muy pocos casos, donde la palabra reservada es realmente la única cosa significativa que se conoce sobre la variable, usaría las siguientes alternativas:

  • Si es un argumento de función, use en aClasslugar de class.

  • Si es una variable local o miembro, use en myClasslugar de class.

  • Si es un descriptor de acceso, use en getClass()lugar de class().

Por supuesto, el prefijo agregado es bastante inútil y, en consecuencia, solo debe usarse como último recurso. Pero al menos no interfiere con el analizador mental de su lector, y es una forma segura de evitar palabras reservadas.

cmaster
fuente
0

Un beneficio para la ortografía creativa es una mejor capacidad de búsqueda. Creo que es mucho más fácil hacer una búsqueda de código completo para cosas únicas, que para palabras comunes, donde con demasiada frecuencia encontrarás todas las cosas incorrectas, y 1000 de ellas. Como ejemplo, solía tener kzpg.com. Google eso ahora y verás solo unos pocos éxitos. Es único y, por lo tanto, muy fácil de encontrar.

Pero, en cierta medida, creo que esta pregunta es de opinión más que de sustancia. Personalmente, crecí en Forth, donde se trataba de palabras, y muchas de ellas. Uno aprendió a ser muy creativo para salvar los dedos. Al final tenía unos 640,000 caracteres, más o menos en mi base de origen. Por lo tanto, mantener las palabras cortas fue importante para hacer el trabajo.

Vista elíptica
fuente
Ese enlace está roto ahora.
Peter Mortensen