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

63

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

Eu imagino que existem heurísticas de melhores práticas para esse problema. Estes 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 diretriz em meu livro. Um link do MSDN sobre como lidar com isso em C # também seria bom.
Alternativamente, 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 a lidar com isso?

Aqui está apenas um exemplo: na linguagem C #, "default" é uma palavra reservada. Quando eu uso um enum, eu gostaria de nomear o valor padrão "default" (análogo às declarações "switch"), mas não consigo.
(C # é sensível a maiúsculas e minúsculas, e constantes de enum devem ser maiúsculas, portanto, "Padrão" é a escolha óbvia aqui, mas vamos supor que nosso guia de estilo atual determine que todas as constantes de enum sejam minúsculas).
Poderíamos considerar a palavra "defaultus", mas isso não adere ao Princípio de menor espanto . Devemos também considerar "padrão" e "inicial", mas infelizmente "padrão" é a palavra que exatamente transmite sua finalidade nessa situação.

    
por Protector one 02.01.2017 / 13:58
fonte

7 respostas

64

Para uma opção de enum você deve usar o título como Default . Como o C # faz distinção entre maiúsculas e minúsculas, ele não colidirá com a palavra-chave reservada. Consulte as Diretrizes de nomenclatura do .net .

Como todos os membros públicos devem ser maiúsculas e minúsculas em .net, e todos os nomes reservados são minúsculos, você não deve realmente encontrar isso, exceto com variáveis locais (incluindo parâmetros). E os locais normalmente teriam nomes ou frases como nomes, por isso é raro que o nome mais natural colida com uma palavra-chave. Por exemplo. defaultValue normalmente seria um nome mais natural que default . Então, na prática, isso não é um grande problema.

Em C # você pode usar o prefixo " @ " para escapar de palavras-chave reservadas para que elas 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 interagindo com uma biblioteca de terceiros que usa palavras-chave reservadas como um identificador.

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

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

Powershell (e um monte de outras linguagens de script) prefixam todas as variáveis com um sigilo como $, o que significa que elas nunca colidirão com palavras-chave.

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

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

Always use cls for the first argument to class methods.

If a function argument's name clashes with a reserved keyword, it is generally better to append a single trailing underscore rather than use an abbreviation or spelling corruption. Thus class_ is better than clss. (Perhaps better is to avoid such clashes by using a synonym.)

Algumas linguagens como Brainfuck ou Whitespace evitam definir palavras, elegantemente evitando o problema.

Em suma, não há resposta independente de idioma para sua pergunta, pois depende muito da sintaxe e das convenções do idioma específico.

    
por 02.01.2017 / 15:18
fonte
22

Eu adicionaria um sublinhado (padrão _)

Prós:

  • simples
  • óbvio (por que mais você acrescentaria um sublinhado?)
  • consistente
  • fácil de usar
  • funciona em todas as linguagens modernas que 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 / Preendendo uma palavra:

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

Alterando letras (clazz em vez de classe):

  • inconsistente (clazz, klass, klazz)

Anexando um número (padrão1):

  • levanta a questão para default2

Anexando / Preendendo uma letra:

  • não óbvio (o programador tem que adivinhar que ele foi usado para nomecolisão e não um atalho para outra coisa)

Escapando uma palavra-chave (@default (c #), 'padrão' (scala))

  • possível apenas em alguns idiomas
  • recurso raramente usado, principalmente para compatibilidade com outros idiomas
  • dificulta o uso dos usuários da sua API (eles precisam saber como fazer isso e lembrar como fazer isso)

Quando eu não usaria:

  • outras convenções amplamente usadas e existentes
  • eu já conheço um sinônimo de adaptação
  • em seu caso específico de enum, eu seguiria a resposta do @JacquesB
por 02.01.2017 / 19:35
fonte
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 faz distinção entre maiúsculas e minúsculas, use um caso diferente para a palavra. (Padrão vs padrão)

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

    
por 02.01.2017 / 15:21
fonte
9

Eu recomendo que eu NÃO mude a convenção de nomenclatura localmente (ou adicione caracteres sem sentido) para efeitos de desambiguação (como foi sugerido em outros posts). Isso cria confusão se a intenção não é óbvia e pode levantar questões sobre o motivo pelo qual ela foi nomeada dessa maneira. Pode ser resolvido sem isso.

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

Por exemplo, digamos que você tenha uma enum Mode que exponha um valor padrão, como no seu caso. Nomeando-o default_mode pode não parecer o melhor devido à repetição, mas evita ambigüidade enquanto transmite o significado desejado.

    
por 02.01.2017 / 17:12
fonte
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 ser determinado é como unir as várias palavras e as opções geralmente são

  • allonewordnoseparators
  • words_with_underscores-or -hes ( snake_case )
  • 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_default tem a vantagem de todos os locais estarem alinhados e, portanto, se destacarem rapidamente, mas a desvantagem de você sempre ter que ler na segunda parte para obter o nome exclusivo. default_local tem a vantagem inversa de que o nome da variável única é visto rapidamente, mas os locais nem sempre são tão facilmente agrupados visualmente.

Alguns exemplos para a abordagem específica do domínio que eu vi são: vehicle_model em vez de model , que era uma palavra reservada; room_table para uma tabela SQL como table é uma palavra reservada.

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

  • aspas ou backtips para envolver nomes de variáveis e, assim, permitir o uso de palavras reservadas. Similar a isso, eu poderia imaginar que algumas linguagens podem permitir que um caractere especial, como um backspace, escape de um nome.
  • espaços em nomes de variáveis.
por 02.01.2017 / 19:08
fonte
2

Obviamente, faça o que puder para evitar essa situação. Eu tenho escrito software desde o final dos anos 1970 e os tempos que eu realmente tive que falsificar uma palavra reservada são bem menores que dez, provavelmente mais perto de cinco.

Há muitas coisas que você pode fazer, como duplicar a primeira ou a última letra ( reservedd ) ou adicionar um sublinhado à esquerda ou à direita ( reserved_ ). O que é apropriado dependerá muito das convenções usadas na linguagem que você está escrevendo, especialmente no que diz respeito aos sublinhados iniciais ou finais. Tente também não fazer coisas com casos que possam ser mal interpretados por humanos (por exemplo, usando Reserved quando difere de reserved ).

Depois de escolher algo, coloque-o em suas diretrizes de codificação, certifique-se de que as pessoas saibam sobre ele e que ele seja usado de forma consistente. Eu até adiciono um lembrete para que os leitores não pensem que é um erro de digitação e saibam que estarão vendo isso novamente:

int ccase;  // Name dodges a reserved word
    
por 02.01.2017 / 16:34
fonte
1

Em C #, você pode preceder 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}; 
    
por 03.01.2017 / 08:50
fonte

Tags