Como nomear algo quando a opção lógica é uma palavra-chave reservada? [fechadas]

64

Ocasionalmente, o nome mais lógico para algo (por exemplo, uma variável) é uma palavra-chave reservada no idioma ou ambiente de sua escolha. Quando não há sinônimo igualmente apropriado, como alguém o denomina?

Imagino que haja heurísticas de práticas recomendadas para esse problema. Eles podem ser fornecidos pelos criadores ou governadores de linguagens e ambientes de programação. Por exemplo, se python.org (ou Guido van Rossum) disser como lidar com isso em Python, isso seria uma boa orientação no meu livro. Um link do MSDN sobre como lidar com isso em c # também seria bom.
Como alternativa, as diretrizes fornecidas pelos principais influenciadores da engenharia de software também devem ser valiosas. Talvez o Google / Alphabet tenha um bom guia de estilo que nos ensine como lidar com isso?

Aqui está apenas um exemplo: na linguagem C #, "padrão" é uma palavra-chave reservada. Quando eu uso uma enumeração, gostaria de nomear o valor padrão "default" (análogo às instruções "switch"), mas não posso.
(C # faz distinção entre maiúsculas e minúsculas e as constantes enum devem estar em maiúsculas, portanto "Padrão" é a escolha óbvia aqui, mas vamos assumir que nosso guia de estilo atual determina que todas as constantes enum devem estar em minúsculas.)
Poderíamos considerar a palavra "defaultus ", mas isso não segue o princípio da menor surpresa . Também devemos considerar "padrão" e "inicial", mas infelizmente "padrão" é a palavra que transmite exatamente seu propósito nessa situação.

Protetor um
fonte
15
Eu usaria algo como "default_value". O significado permanece o mesmo, mas você precisa digitar mais alguns caracteres.
Mael 02/01
26
@ Darkhogg, se eu encontrasse um desses no meu código, eu os mudaria imediatamente. Erros de ortografia ou violações de convenções de nomenclatura não são aceitáveis.
MetaFight 2/17
26
@MetaFight - exceto que em Java, chamar uma variável que contém uma classe clazzé praticamente um padrão de fato. É, essencialmente, é parte da convenção de nomenclatura plataforma. Fazer qualquer outra coisa seria uma violação das expectativas de que outros possam ter lido seu código, portanto, isso só deve ser feito se for absolutamente necessário.
Periata Breatta
6
padrão como valor enum parece contraproducente. Deve ser um nome específico do domínio que descreva o padrão. Porém, deve haver um método para retornar o padrão.
qwerty_so
18
@AndresF. Discordo. Costumo achar muito fácil argumentar contra os designers de Java. Eu não seguro contra eles, no entanto. Eles estavam trabalhando no oeste selvagem.
MetaFight

Respostas:

63

Para uma opção de enumeração, você deve usar maiúsculas e minúsculas Default. Como o C # diferencia maiúsculas de minúsculas, ele não colide com a palavra-chave reservada. Consulte Diretrizes de nomenclatura .net .

Como todos os membros públicos devem estar em maiúsculas em .net e todos os nomes reservados em minúsculas, você realmente não deve encontrar isso, exceto com variáveis ​​locais (incluindo parâmetros). E os locais normalmente têm nomes ou frases como nomes, portanto, é muito raro o nome mais natural colidir com uma palavra-chave. Por exemplo. defaultValuenormalmente seria um nome mais natural que default. Portanto, na prática, isso não é um grande problema.

Em C #, você pode usar o @prefixo " " para escapar das palavras-chave reservadas, para que possam ser usadas como identificadores (como @default). Mas isso só deve ser usado se você realmente não tiver outra opção, ou seja, se estiver fazendo interface com uma biblioteca de terceiros que usa palavras-chave reservadas como identificador.


É claro que outros idiomas têm sintaxe e palavras-chave diferentes e, portanto, soluções diferentes para esse problema.

SQL tem muitas palavras-chave, mas é muito comum simplesmente escapar de identificadores, como [Table]. Alguns até o fazem para todos os identificadores, independentemente de colidirem com uma palavra-chave ou não. (Afinal, uma palavra-chave conflitante pode ser introduzida no futuro!)

O Powershell (e várias outras linguagens de script) prefixa todas as variáveis ​​com um sigil como $, o que significa que elas nunca colidirão com palavras-chave.

O Lisp não possui palavras-chave, pelo menos não no sentido convencional.

O Python tem uma convenção oficialmente reconhecida no PEP-8 :

Sempre use cls para o primeiro argumento para classificar métodos.

Se o nome de um argumento de função colidir com uma palavra-chave reservada, geralmente é melhor acrescentar um único sublinhado à direita, em vez de usar uma abreviação ou corrupção ortográfica. Assim, class_ é melhor que clss. (Talvez o melhor seja evitar esses conflitos usando um sinônimo.)

Algumas línguas, como Brainfuck ou Whitespace, evitam definir palavras, evitando o problema de maneira elegante.

Em suma, não há resposta independente da linguagem para sua pergunta, pois ela depende muito da sintaxe e das convenções da linguagem específica.

JacquesB
fonte
2
Você não deve confiar apenas na distinção entre maiúsculas e minúsculas. Embora não seja provável que seja um problema na prática, nem todas as linguagens .NET diferenciam maiúsculas de minúsculas; portanto, você pode encontrar problemas inesperados em algum momento.
Vivelin
6
@Vivelin: Você não deve ter membros públicos ou nomes de tipos que diferem apenas no caso, pois isso pode levar a problemas em outro idioma. Mas isso não está relacionado ao que eu sugiro, pois as palavras-chave não são identificadores (e outros idiomas terão outras palavras-chave).
JacquesB
Mesmo se a sintaxe @ estiver disponível, é IMHO melhor reservado para cenários em que é necessário interagir com linguagens escritas de bibliotecas com palavras-chave diferentes. Mesmo lá, acho que seria melhor ter um recurso de linguagem semelhante #define, mas o operando do lado direito sempre seria interpretado como um identificador que diferencia maiúsculas de minúsculas. Isso permitiria resolver muitos tipos de conflitos de nomenclatura (incluindo, para idiomas que não diferenciam maiúsculas de minúsculas, a importação de símbolos idênticos, exceto para maiúsculas e minúsculas).
supercat
@Vivelin nem todas as linguagens .NET diferenciam maiúsculas de minúsculas - eu conheço o VB.NET e o Powershell; existem outros?
Zev Spitz
@ZevSpitz, o OP chamou especificamente C #, e é por isso que acho que Vivelin o usou como exemplo, no entanto, como você diz, o VB.NET não faz distinção entre maiúsculas e minúsculas; portanto, como de costume, eu pensaria que ele se reduziria a uma base por idioma . Nem todos os idiomas têm as mesmas palavras reservadas
Shaggy13spe
22

Eu acrescentaria um sublinhado (padrão_)

Prós:

  • simples
  • óbvio (por que mais você acrescentaria um sublinhado?)
  • consistente
  • fácil de usar
  • funciona em todas as línguas modernas que eu conheço
  • mais próximo da opção lógica

Por que não gosto de outras soluções:

Sinônimo:

  • difícil de encontrar
  • geralmente não é exatamente o mesmo significado (nuances)

Anexando / anexando uma palavra:

  • inconsistente (defaultValue, defaultItem)
  • maior verbosidade sem maior legibilidade

Mudança de letras (clazz em vez de classe):

  • inconsistente (clazz, klass, klazz)

Anexando um número (padrão1):

  • levanta a questão do default2

Anexando / anexando uma carta:

  • não óbvio (o programador deve adivinhar que foi usado para a coleta de nomes e não um atalho para outra coisa)

Escapando uma palavra-chave (@default (c #), `default` (scala))

  • só é possível em alguns idiomas
  • recurso raramente usado, principalmente para compatibilidade com outros idiomas
  • torna mais difícil o uso para os usuários da sua API (eles precisam saber como fazê-lo e se lembrar)

Quando eu não o usaria:

  • outra convenção existente e amplamente usada
  • Eu já conheço um sinônimo adequado
  • no seu caso enum específico, eu seguiria a resposta @ JacquesB
Siphor
fonte
7
Esta é uma solução frequentemente usada em Python. Não estou defendendo como o mais elegante, mas funciona.
fralau
11
@fralau Python ist especialmente ruim - Eu realmente odeio identificadores como "input"
Christian Sauer
Em muitos idiomas, vê klass-se uma variável em que classé uma palavra reservada. Eu nunca vi, defawltmas é a mesma ideia. Eu preferiria default_(e provavelmente, class_se não for atropelado, por qualquer convenção estabelecida).
precisa saber é o seguinte
Você não incluiu a opção de escapar da palavra-chave.
CodesInChaos
11
Você faz argumentos válidos e sensatos, embora não tenha certeza de que seja "óbvio o motivo pelo qual o sublinhado foi usado". Eu raramente trabalhei com pessoas que conhecem todas as palavras-chave dos idiomas em que estão trabalhando!
Protector one
18

"Padrão" provavelmente não é um valor de enumeração útil. Representa um comportamento que pode mudar dependendo do contexto em que é usado.

Dito isto, se o seu idioma diferencia maiúsculas de minúsculas, use um caso diferente para a palavra. (Padrão x padrão)

Ou, melhor ainda, faça um esforço extra para digitar mais algumas letras e chamá-lo DefaultValue.

Kent A.
fonte
3
Concordo. "Padrão" não oferece indicação de qual é o valor. Considere enum ErrorHandlingLevel { Default = 0, ... }vs enum ErrorHandlingLevel { None = 0, ... }. No segundo exemplo, o fato de Noneser o padrão pode ser conhecido ao definir o valor da enumeração como 0, usando xmldoc ou explicitamente no código. Você obtém o benefício adicional de saber o que significa quando um objeto está ErrorHandlingLeveldefinido None. Compare isso com a inspeção de um objeto com ErrorHandlingLeveldefinido como padrão.
Harrison Paine
9

Eu recomendo NÃO mudar a convenção de nomenclatura localmente (ou adicionar caracteres sem sentido) com o objetivo de desambiguar (como foi sugerido em outras postagens). Isso cria confusão se a intenção não é óbvia e pode levantar questões sobre por que foi nomeado dessa maneira. Pode ser resolvido sem ele.

Em todos os casos, deve ser possível usar uma palavra com significado sinônimo ou tornar o nome mais específico (ou até detalhado). Mesmo quando pode introduzir repetição de contexto, pode ser uma solução melhor.

Por exemplo, digamos que você tenha uma enumeração Modeque exponha um valor padrão, como no seu caso. Nomear default_modepode não parecer o melhor devido à repetição, mas evita ambiguidade ao transmitir o significado desejado.

Sopel
fonte
Você faz uma observação válida, mas ainda não tenho certeza do que cria mais confusão: ter um fragmento constantemente anexado ou usar palavras diferentes para cada situação. É claro que a hipótese anterior é que as situações em que seria usada em primeiro lugar são (espero) tão raras que a consistência não pode ser inferida a partir do código existente.
Protector one
3

Você precisará usar palavras diferentes ou modificadas, isso é claro.
Então isso geralmente significa

  • uma palavra completamente diferente
  • um prefixo
  • um sufixo

Outro fator a determinar é como unir as várias palavras e as opções geralmente são

  • allonewordnoseparators
  • words_with_underscores-or-tracejados ( caixa - cobra )
  • CapitalizationForClarityAndReadability ( CamelCase )

Minha sugestão é usar um prefixo ou sufixo e sublinhados / traços, por exemplo

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

local_defaulttem a vantagem de que todos os locais estão alinhados e, assim, se destacam rapidamente, mas a desvantagem de que você sempre deve ler a segunda parte para obter o nome exclusivo. default_localtem a vantagem inversa de que o nome exclusivo da variável é visto rapidamente, mas os locais nem sempre são tão facilmente agrupados visualmente.

Alguns exemplos para a abordagem específica de domínio que já vi são: em vehicle_modelvez de modeluma palavra reservada; room_tablepara uma tabela SQL, como tableé uma palavra reservada.

As outras duas opções que vi idiomas ou scripts são:

  • aspas ou backtips para envolver nomes de variáveis ​​e, assim, permitir o uso de palavras reservadas. Semelhante a isso, eu poderia imaginar que alguns idiomas possam permitir que um caractere especial, como um backspace, escape de um nome.
  • espaços nos nomes das variáveis.
Michael Durrant
fonte
Como uma nota secundária talvez interessante: já vi words_with_underscores-or-dashesdois nomes - snake_caseao usar o sublinhado e kebab-caseao usar o traço. Achei o último engraçado.
VLAZ 3/17/17
2

Obviamente, faça o que puder para evitar essa situação. Escrevo software desde o final da década de 1970 e as vezes em que realmente tive que falsificar uma palavra reservada têm menos de dez anos, provavelmente mais perto das cinco.

Você pode fazer muitas coisas, como dobrar a primeira ou a última letra ( reservedd) ou adicionar um sublinhado à esquerda ou à direita ( reserved_). O que é apropriado dependerá muito do idioma usado pelas convenções que você está escrevendo, especialmente no que diz respeito aos sublinhados iniciais ou finais. Além disso, tente não fazer coisas com casos que possam ser mal interpretados por humanos (por exemplo, usar Reservedquando for diferente reserved).

Depois de escolher algo, coloque-o em suas diretrizes de codificação, verifique se as pessoas o conhecem e se ele é usado de forma consistente. Chego até a acrescentar um comentário para que os leitores não pensem que é um erro de digitação e saibam que o verão novamente:

int ccase;  // Name dodges a reserved word
Blrfl
fonte
10
Não é o downvoter, mas a sugestão "dobrando a primeira ou a última letra" calafrios na espinha ....
Willem van Rumpt
@WillemvanRumpt Também não gosto de fazê-lo, mas de vez em quando se resume a uma escolha entre fazer ginástica para evitar uma palavra reservada que provoca muito coçar a cabeça ou um identificador de aparência estranha que solicita apenas um pouco .
Blrfl
6
Nenhum julgamento destinados, apenas .... arrepios .... frios ...;)
Willem van Rumpt
11
A adição posterior de um sublinhado é melhor do que uma última letra dobrada. (Você tem votos a favor classs?)
nigel222 3/17/17
11
Diretrizes de codificação! Seria bom ter isso! Bom ponto.
Protector one
2

Em C #, você pode acrescentar o nome de um identificador com @ . Isso diz ao compilador para tratar o nome como o nome de um identificador e não como uma possível palavra-chave.

enum @default {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; 
Robert Stiffler
fonte
3
saber quem iria votar esta "resposta" que apenas repete o ponto já fez (e muito melhor apresentado) em um top votado responder um dia antes
mosquito