¿Cómo nombrar algo cuando la opción lógica es una palabra clave reservada? [cerrado]

64

Ocasionalmente, el nombre más lógico para algo (por ejemplo, una variable) es una palabra clave reservada en el idioma o entorno de elección. Cuando no hay un sinónimo igualmente apropiado, ¿cómo se nombra?

Me imagino que hay mejores prácticas heurísticas para este problema. Estos podrían ser proporcionados por los creadores o gobernadores de lenguajes y entornos de programación. Por ejemplo, si python.org (o Guido van Rossum) dice cómo tratarlo en Python, esa sería una buena guía en mi libro. También sería bueno un enlace de MSDN sobre cómo tratarlo en C #.
Alternativamente, las pautas proporcionadas por los principales influyentes en la ingeniería de software también deberían ser valiosas. ¿Quizás Google / Alphabet tiene una buena guía de estilo que nos enseña cómo lidiar con eso?

Este es solo un ejemplo: en el lenguaje C #, "predeterminado" es una palabra clave reservada. Cuando uso una enumeración, me gustaría nombrar el valor predeterminado "predeterminado" (análogo a las declaraciones "cambiar"), pero no puedo.
(C # distingue entre mayúsculas y minúsculas, y las constantes de enumeración deben escribirse en mayúscula, por lo que "Predeterminado" es la opción obvia aquí, pero supongamos que nuestra guía de estilo actual dicta que todas las constantes de enumeración deben estar en minúsculas).
Podríamos considerar la palabra "defaultus" ", pero esto no se adhiere al Principio de Menos Asombro . También deberíamos considerar "estándar" e "inicial", pero desafortunadamente "predeterminado" es la palabra que transmite exactamente su propósito en esta situación.

Protector uno
fuente
15
Usaría algo como "default_value". El significado sigue siendo el mismo, pero debe escribir algunos caracteres más.
Mael
26
@Darkhogg si encontrara alguno de esos en mi código, los cambiaría de inmediato. No se aceptan errores ortográficos o violaciones de las convenciones de nombres.
MetaFight el
26
@MetaFight - excepto que en Java, llamar a una variable que contiene una clase clazzes prácticamente un estándar de facto. Esencialmente es parte de la convención de nomenclatura de la plataforma. Hacer cualquier otra cosa sería una violación de las expectativas de que otros puedan haber leído su código, por lo que solo debe hacerse si es absolutamente necesario.
Periata Breatta
66
El valor predeterminado como enum parece contraproducente. Debe ser un nombre específico de dominio que describa el valor predeterminado. Sin embargo, debería haber un método para devolver el valor predeterminado.
qwerty_so
18
@AndresF. Estoy en desacuerdo. A menudo me resulta muy fácil argumentar en contra de los diseñadores de Java. Sin embargo, no lo sostengo contra ellos. Estaban trabajando en el salvaje oeste.
MetaFight el

Respuestas:

63

Para una opción de enumeración, debe usar mayúsculas y minúsculas como Default. Como C # distingue entre mayúsculas y minúsculas, no colisionará con la palabra clave reservada. Consulte las Pautas de nomenclatura de .net .

Dado que todos los miembros públicos deberían ser mayúsculas y minúsculas en .net, y todos los nombres reservados son minúsculas, realmente no debería encontrar esto, excepto con las variables locales (incluidos los parámetros). Y los locales suelen tener nombres o frases como nombres, por lo que es bastante raro que el nombre más natural colisionaría con una palabra clave. P.ej. defaultValuenormalmente sería un nombre más natural que default. Entonces, en la práctica, este no es un gran problema.

En C # puede usar el @prefijo " " para escapar de palabras clave reservadas para que puedan usarse como identificadores (como @default). Pero esto solo debe usarse si realmente no tiene otra opción, es decir, si está interactuando con una biblioteca de terceros que utiliza palabras clave reservadas como identificador.


Por supuesto, otros idiomas tienen diferentes sintaxis y palabras clave y, por lo tanto, diferentes soluciones a este problema.

SQL tiene muchas palabras clave, pero es muy común simplemente escapar de identificadores, como [Table]. Algunos incluso lo hacen para todos los identificadores, independientemente de si entran en conflicto con una palabra clave o no. (¡Después de todo, se podría introducir una palabra clave en conflicto en el futuro!)

Powershell (y muchos otros lenguajes de script) prefijan todas las variables con un sigilo como $, lo que significa que nunca colisionarán con palabras clave.

Lisp no tiene palabras clave en absoluto, al menos no en el sentido convencional.

Python tiene una convención oficialmente reconocida en PEP-8 :

Siempre use cls para el primer argumento de los métodos de clase.

Si el nombre de un argumento de función entra en conflicto con una palabra clave reservada, generalmente es mejor agregar un guión bajo final en lugar de usar una abreviatura o corrupción ortográfica. Por lo tanto, class_ es mejor que clss. (Quizás sea mejor evitar tales enfrentamientos usando un sinónimo).

Algunos lenguajes como Brainfuck o Whitespace evitan la definición de palabras, evitando el problema con elegancia.

En resumen, no hay una respuesta independiente del idioma a su pregunta, ya que depende en gran medida de la sintaxis y las convenciones del idioma específico.

JacquesB
fuente
2
Sin embargo, no debe confiar solo en la sensibilidad a mayúsculas y minúsculas. Si bien no es probable que sea un problema en la práctica, no todos los lenguajes .NET distinguen entre mayúsculas y minúsculas, por lo que puede encontrar problemas inesperados en algún momento.
Vivelin
66
@Vivelin: No debe tener miembros públicos o nombres de tipo que difieran solo en el caso, ya que esto podría generar problemas para otro idioma. Pero esto no está relacionado con lo que sugiero, ya que las palabras clave no son identificadores (y otros idiomas tendrán otras palabras clave).
JacquesB
Incluso si la sintaxis @ está disponible, en mi humilde opinión, está mejor reservada para escenarios en los que uno necesita interactuar con bibliotecas de idiomas escritos con diferentes palabras clave. Incluso allí, creo que podría haber sido mejor tener una característica de lenguaje similar #define, pero el operando de la mano derecha siempre se interpretaría como un identificador de mayúsculas y minúsculas. Eso permitiría resolver muchos tipos de conflictos de nomenclatura (incluida, para los idiomas que no distinguen entre mayúsculas y minúsculas, la importación de símbolos que son idénticos, excepto las mayúsculas y minúsculas).
supercat
@Vivelin no todos los lenguajes .NET distinguen entre mayúsculas y minúsculas : conozco VB.NET y Powershell; ¿hay otros?
Zev Spitz
@ZevSpitz, el OP llamó específicamente a C #, por lo que creo que Vivelin lo usó como su ejemplo, sin embargo, como usted dice que VB.NET no distingue entre mayúsculas y minúsculas, por lo que, como de costumbre, creo que se reduciría a cada idioma. . No todos los idiomas tienen las mismas palabras reservadas
Shaggy13spe
22

Añadiría un guión bajo (predeterminado_)

Pros:

  • sencillo
  • obvio (¿por qué más agregarías un guión bajo?)
  • consistente
  • fácil de usar
  • funciona en todos los idiomas modernos que conozco
  • más cercano a la opción lógica

Por qué no me gustan otras soluciones:

Sinónimo:

  • difícil de encontrar
  • a menudo no es exactamente el mismo significado (matices)

Anexar / anteponer una palabra:

  • inconsistente (defaultValue, defaultItem)
  • mayor verbosidad sin mayor legibilidad

Cambio de letras (clazz en lugar de clase):

  • inconsistente (clazz, klass, klazz)

Agregar un número (predeterminado1):

  • plantea la pregunta por defecto2

Anexar / anteponer una carta:

  • no obvio (el programador tiene que adivinar que se usó para la colisión de nombres y no un atajo para otra cosa)

Escapar de una palabra clave (@default (c #), `default` (scala))

  • solo posible en algunos idiomas
  • característica raramente utilizada, principalmente por compatibilidad con otros idiomas
  • hace que sea más difícil de usar para los usuarios de su API (tienen que saber cómo hacerlo y recordar cómo hacerlo)

¿Cuándo no lo usaría?

  • otra convención existente, ampliamente utilizada
  • Ya conozco un sinónimo apropiado
  • en su caso de enumeración específico, seguiría la respuesta de @JacquesB
Siphor
fuente
77
Esta es una solución de uso frecuente en Python. No lo defiendo como el más elegante, pero funciona.
fralau
1
@fralau Python es especialmente malo - Realmente odio los identificadores como "input"
Christian Sauer
En muchos idiomas se ve klassuna variable donde classes una palabra reservada. Nunca he visto defawltpero es la misma idea. Preferiría default_(y probablemente class_si no pisotear cualquier convención establecida al hacerlo).
nigel222
No incluiste la opción de escapar de la palabra clave.
CodesInChaos
1
Usted hace argumentos válidos y sensatos, aunque no estoy seguro de que sea "obvio por qué se utilizó el guión bajo". ¡Raramente he trabajado con alimentos que conocen todas las palabras clave de los idiomas en los que trabajan!
Protector uno
18

"Predeterminado" probablemente no sea un valor de enumeración útil. Representa un comportamiento que puede cambiar según el contexto donde se usa.

Dicho esto, si su idioma distingue entre mayúsculas y minúsculas, utilice un caso diferente para la palabra. (Predeterminado vs predeterminado)

O mejor aún, haga un esfuerzo adicional para escribir algunas letras más y llamarlo DefaultValue.

Kent A.
fuente
3
Estoy de acuerdo. "Predeterminado" no ofrece ninguna indicación de cuál es el valor. Considere enum ErrorHandlingLevel { Default = 0, ... }vs enum ErrorHandlingLevel { None = 0, ... }. En el segundo ejemplo, el hecho de que Nonees el valor predeterminado puede darse a conocer estableciendo el valor de enumeración en 0, utilizando xmldoc o explícitamente en el código. Obtiene el beneficio adicional de saber lo que significa cuando un objeto está ErrorHandlingLevelconfigurado None. Compare eso con la inspección de un objeto con el ErrorHandlingLevelvalor predeterminado.
Harrison Paine
9

Recomiendo encarecidamente NO cambiar la convención de nomenclatura localmente (o agregar caracteres sin sentido) con el propósito de desambiguación (como se ha sugerido en otras publicaciones). Crea confusión si la intención no es obvia y puede plantear preguntas sobre por qué se llamó así. Se puede resolver sin ella.

En todos los casos, debería ser posible usar una palabra con significado sinónimo o hacer que el nombre sea más específico (o incluso detallado). Incluso cuando puede introducir la repetición de contexto, puede ser una mejor solución.

Por ejemplo, supongamos que tiene una enumeración Modeque debería exponer un valor predeterminado como en su caso. Nombrarlo default_modepuede no parecer el mejor debido a la repetición, pero evita la ambigüedad al transmitir el significado deseado.

Sopel
fuente
Usted hace un punto válido, pero todavía no estoy seguro de qué crea más confusión: tener un fragmento constantemente agregado o usar palabras diferentes para cada situación. El caso en contra de la primera opción es, por supuesto, que las situaciones en las que se usaría en primer lugar son (con suerte) tan raras que no se puede inferir consistencia del código existente.
Protector uno
3

Tendrá que usar palabras diferentes o modificadas, eso está claro.
Entonces esto generalmente significa

  • una palabra completamente diferente
  • un prefijo
  • un sufijo

Otro factor para determinar es cómo unir las múltiples palabras y las opciones suelen ser

  • allonewordnoseparators
  • words_with_underscores-or-guiones ( snake_case )
  • CapitalizationForClarityAndReadability ( CamelCase )

Mi sugerencia es usar un prefijo o sufijo y guiones bajos / guiones, por ejemplo

local_default, my_default, a_default, domain_specific_default
default_local, default_me, default_a, default_domain_specific

local_defaulttiene la ventaja de que todos los locales están alineados y, por lo tanto, se destacan rápidamente, pero la desventaja de que siempre debe leer la segunda parte para obtener el nombre único. default_localtiene la ventaja inversa de que el nombre único de la variable se ve rápidamente, pero los locales no siempre se agrupan visualmente tan fácilmente.

Un par de ejemplos para el enfoque de dominio_específico que he visto son: en vehicle_modellugar de modelcuál era una palabra reservada; room_tablepara una tabla SQL como tablees una palabra reservada.

Las otras dos opciones que he visto usar en idiomas o scripts son:

  • comillas o sugerencias para rodear nombres de variables y así permitir el uso de palabras reservadas. Similar a esto, me imagino que algunos idiomas pueden permitir que un carácter especial, como un retroceso, escape de un nombre.
  • espacios en nombres de variables.
Michael Durrant
fuente
Como una pequeña nota lateral quizás interesante: he visto words_with_underscores-or-dashesreferido con dos nombres: snake_casecuando se usa el guión bajo y kebab-casecuando se usa el guión. Encontré este último divertido.
VLAZ
2

Obviamente, haga lo que pueda para evitar esa situación. He estado escribiendo software desde fines de la década de 1970 y las veces que realmente tuve que esquivar una palabra reservada son menos de diez, probablemente más cerca de cinco.

Hay muchas cosas que puede hacer, como duplicar la primera o la última letra ( reservedd) o agregar un guión bajo o al final ( reserved_). Lo apropiado dependerá en gran medida de las convenciones que utilice el lenguaje que está escribiendo, especialmente con respecto a los guiones bajos iniciales o finales. También trate de no hacer cosas con un caso que los humanos puedan leer mal (por ejemplo, usar Reservedcuando difiere de reserved).

Una vez que haya elegido algo, póngalo en sus pautas de codificación, asegúrese de que las personas lo sepan y de que se use de manera consistente. Incluso voy tan lejos como para agregar un comentario recordatorio para que los lectores no piensen que es un error tipográfico y saben que lo volverán a ver:

int ccase;  // Name dodges a reserved word
Blrfl
fuente
10
No el votante negativo, pero la sugerencia de "duplicar la primera o la última carta" me
congeló la
@WillemvanRumpt Tampoco me gusta hacerlo, pero de vez en cuando se trata de elegir entre hacer gimnasia para evitar una palabra reservada que provoque muchos rasguños en la cabeza o un identificador de aspecto extraño que provoque solo un poco .
Blrfl
66
Sin juicio, solo ... escalofríos ... fríos ...;)
Willem van Rumpt
1
Posponer un guión bajo es mejor que duplicar la última letra. (¿Algún voto para classs?)
nigel222
1
Pautas de codificación! Eso sería bueno tener! Buen punto.
Protector uno
2

En C #, puede anteponer el nombre de un identificador con @ . Esto le dice al compilador que trate el nombre como el nombre de un identificador y no como una posible palabra clave.

enum @default {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; 
Robert Stiffler
fuente
3
pregunto quién votaría esta "respuesta" que se limita a repetir el punto ya hecho (y mucho mejor presentado) en una parte superior votó responder un día antes
mosquito