¿Qué haces cuando tu convención de nombres choca con tu idioma?

14

De acuerdo, esta es una de esas pequeñas cosas que siempre me molestaron. Por lo general, no abrevo los identificadores, y la única vez que uso un identificador corto (por ejemplo, i) es para un bucle cerrado. Por lo tanto, me irrita cuando estoy trabajando en C ++ y tengo una variable que necesita ser nombrada operatoro classy tengo que evitarla o usar una abreviatura, porque termina sobresaliendo. Advertencia: esto puede sucederme de manera desproporcionada a menudo porque trabajo mucho en el diseño de lenguaje de programación, donde los objetos de dominio pueden reflejar conceptos en el lenguaje anfitrión y causar inadvertidamente enfrentamientos.

¿Cómo lidiarías con esto? ¿Abreviar? ( op) ¿Error ortográfico? ( klass) ¿Algo más? ( operator_)

Jon Purdy
fuente
77
Además del espacio de nombres, ¿quizás deberíamos considerar cambiar nuestras convenciones de nombres? Perdón por lo obvio.
Chris
1
@ Chris: ¡Nunca puedes confiar en un programador para darse cuenta de lo obvio! (Aunque en este caso sí.)
Jon Purdy
77
Si hay alguna razón para que le guste la $varsintaxis de PHP , esta es.
Joey Adams
3
@Joey Adams: Sonreí brevemente cuando vi esta pregunta y recordé todas las preguntas sobre ataques PHP flotando alrededor de SE.
Chris
3
Obviamente, cambie el código fuente del idioma para permitir mis convenciones de nomenclatura. Esto también tiene el beneficio de "proteger" mi código ya que solo se ejecutará / compilará en mi intérprete / compilador.
dietbuddha

Respuestas:

21
  1. Acepte que es posible que deba realizar cambios menores en su convención de nomenclatura, como agregar mayúsculas. Es mejor aceptar esto lo antes posible para que todo el código posterior sea coherente.

  2. Considera ser más específico. Las palabras clave tienden a ser bastante amplias, por lo que limitarse classa demonstrationClassno solo solucionar los problemas, sino que también aumenta la legibilidad.

Maxpm
fuente
10

No es algo que haya encontrado, pero si me encuentro en tal situación, trataría de resolverlo con las siguientes opciones, en orden.

  1. Intenta encontrar un sinónimo.
  2. (especialmente para variables) intente encontrar un prefijo o postfix
  3. (especialmente para las clases) cambie la primera letra a mayúsculas y olvide la regla de codificación de que los nombres no deberían diferir solo en mayúsculas y minúsculas. Esta opción, probablemente solo la usaría si el conflicto es con una palabra clave.
  4. Usa una abreviatura.
Bart van Ingen Schenau
fuente
1
No veo qué hay de malo en que los nombres difieran solo en el caso, especialmente en las listas de argumentos donde el parámetro de tipo const Foo&no tiene ningún nombre completo razonable que no sea foo. De acuerdo, podría ser mejor darle Fooun nombre más descriptivo que foosi vive en un cuerpo funcional y tiene un propósito menos especializado.
Jon Purdy
@ Jon - Estoy de acuerdo, aunque personalmente tiendo a los prefijos "p_", "l_" y "m_" en lugar de variar los casos. Adopté esa convención debido a la cuestión de tener el mismo nombre obvio. La convención que use para lidiar con esto es irrelevante siempre que la use de manera consistente en un contexto particular, por supuesto: el enfoque que varía entre mayúsculas y minúsculas se usa lo suficientemente ampliamente como para que la mayoría de los desarrolladores lo reconozcan.
Steve314
@ Jon: ese comentario se lee como si aplicara selectivamente la convención solo cuando tengo el problema de los mismos nombres, que no es lo que quise decir. El problema de contexto se relaciona con el lenguaje, el proyecto, etc. Las convenciones están diseñadas para que el problema no sea un problema cada vez que ocurre (o más bien no ocurre), para que no se aplique selectivamente según sea necesario.
Steve314
@ Steve314: Obtuve tu significado desde el primer comentario. No sé, los afijos así siempre se sentían demasiado cerca de Systems Hungarian para mi comodidad.
Jon Purdy
@ Jon: No es una regla que aplique religiosamente, pero creo que es más fácil cometer errores si dos identificadores solo difieren en el caso. Algunos de esos errores serán detectados por el compilador, algunos son mucho más difíciles de encontrar (especialmente si los dos identificadores nombran el mismo tipo de cosas). Prefiero tener una regla general, con excepciones caso por caso, que un libro completo de reglas que cubra todos los casos posibles.
Bart van Ingen Schenau
6

El idioma gana; no puede ser más astuto que el compilador (ignorando las abominaciones como el PL / 1 IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF END, pero luego PL / 1 no le haría hacer la pregunta en primer lugar). Básicamente, debe seguir las reglas del idioma, y ​​debe encontrar una alternativa a las palabras clave del idioma para su propio uso, o encontrar un idioma alternativo.

Entonces, excepto en circunstancias muy inusuales, te adaptas al idioma, no al revés.

Jonathan Leffler
fuente
5

En lugar de abreviar, ¿qué tal el alargamiento? Si está implementando una construcción de clase en un lenguaje Foo, ¿qué tal si usa FooClass y foo_class? (Módulo cualesquiera que sean sus preferencias de carcasa).

Winston Ewert
fuente
¿Prefiere "java" en cada identificador que usa en el código Java? Y ni siquiera mencionemos los problemas con el prefijo "C ++" en cada identificador ...
Steve314
@ Steve314, no usaría el prefijo java en el código java, usaría el prefijo java en el código c ++ que implementa un compilador java. Además, solo lo usaría si el resto del identificador fuera una palabra clave.
Winston Ewert
OK, te refieres a alargamiento en términos generales, como ser más específico a lo que se refiere el identificador también. Para diferentes aplicaciones, "clase" se puede renombrar a "clase_aprendizaje" o "clase_de_animal" o "valor de clase" o lo que sea. Estoy de acuerdo: acabo de encontrar el compilador orientado ejemplo confuso.
Steve314
5

Algunas de las abreviaturas que he usado class, en orden de frecuencia:

  • cls
  • clss
  • clazz
  • theClass
  • aClass

Si sé qué clase Classrepresenta la instancia, podría incluirla en el nombre de la variable:

  • stringClass = Class.forName("java.lang.String");
Mike Clark
fuente
Nunca he visto 'cls' para eso antes. Principalmente uso aClass.
Konstantin Petrukhnov
4

En C y C ++, las palabras clave son todas minúsculas y el lenguaje distingue entre mayúsculas y minúsculas, así que presione la tecla Mayús de vez en cuando y desaparecerán muchos problemas.

En el Módulo 2, las palabras clave son todas mayúsculas, pero siempre que sus identificadores tengan algunas letras minúsculas, la diferencia es obvia y los enfrentamientos imposibles.

Además, las convenciones de nomenclatura absoluta en cierta medida deben reflejar las convenciones normales del lenguaje que está utilizando, por lo que ciertamente escribiría "myClass" en Java, donde es más probable que escriba "My_Class" en C ++.

Básicamente, no solo estás escribiendo para el compilador, sino que lo que la gente encuentra legible depende en cierta medida del contexto y las expectativas relacionadas.

Steve314
fuente
3
Incluso para los idiomas que distinguen entre mayúsculas y minúsculas, siento que haberse entremezclado classy Classdañaría la legibilidad del código.
Karmastan
@Karmastan: tal vez eso dependa de cuánto tiempo haya pasado trabajando con lenguajes y convenciones sensibles a mayúsculas y minúsculas. Personalmente, la "C" mayúscula frente a minúscula es visualmente muy obvia: veo los patrones de uso de mayúsculas y minúsculas para identificadores largos más rápido de lo que puedo leerlos.
Steve314
3

A menudo no me encuentro con esto, pero cuando lo hago, tiende a no ser un problema porque uso Delphi y te permite solucionar este problema anteponiendo un & al identificador. Entonces "clase" no es un identificador válido, pero "& class" sí lo es.

Mason Wheeler
fuente
Interesante. Tengo una utilidad de generación de código que permite literales de cadena en cualquier lugar donde se pueda usar un identificador. Originalmente, la mayoría de los identificadores para el código generado se escribieron como literales de cadena para evitar el riesgo de conflictos de palabras clave con un DSL creciente (y rico en palabras clave). Ahora, los identificadores se usan para la mayoría de los nombres (es sorprendente lo mucho más legible que es la fuente de esa manera), pero los literales de cadena siempre están disponibles como alternativa. Pensé que era bueno para la generación de código, pero las soluciones alternativas de choque de palabras clave serían una mala idea en un lenguaje de propósito general, pero tal vez me equivoque.
Steve314
2

Agregaría algún tipo de espacio de nombres al nombre de la variable. Por ejemplo, suponga que tiene un módulo llamado usuario y luego modificaría el operador de nombre de variable para que sea algo así como user_operator o userOperator.

Pemdas
fuente
2
simplemente no use "suave", "no" o "mi" como prefijo
Steven A. Lowe
2
Absolutamente. Voto "Jon_Purdys_Carefully_Chosen_Identifier_Prefix_".
Steve314
1
@ Steven: Aún peor, ya veo a, any thelos estudiantes principiantes de CS lo usan con frecuencia inquietante.
Jon Purdy
1
@ Jon Purdy, ¡no es nuestra culpa! Culpe al profesor que decidió nombrar su instancia de clase People () aPerson.
Ben L
@ Jon: La convención de nomenclatura en la que trabajo especifica que las variables locales deben comenzar aaparte de las variables de ciclo cerrado: /
Matthieu M.
2

cambiar o ajustar mi convención de nomenclatura

Muad'Dib
fuente