O que você faz quando sua convenção de nomenclatura entra em conflito com o seu idioma?

14

Ok, essa é uma daquelas pequenas coisas que sempre me incomodavam. Normalmente não abrevio identificadores, e a única vez em que uso um identificador curto (por exemplo i) é para um loop apertado. Então, isso me irrita quando estou trabalhando em C ++ e tenho uma variável que precisa ser nomeada operatorou classe eu tenho que contorná-la ou usar uma abreviação, porque ela se destaca. Advertência: isso pode acontecer desproporcionalmente com frequência porque trabalho muito no design de linguagens de programação, onde objetos de domínio podem espelhar conceitos na linguagem host e, sem querer, causar conflitos.

Como você lidaria com isso? Abreviar? ( op) Erro de ortografia? ( klass) Algo mais? ( operator_)

Jon Purdy
fonte
7
Além do espaçamento de nomes, talvez devêssemos considerar alterar nossas convenções de nomenclatura? Desculpe pelo óbvio.
Chris
1
@ Chris: Você nunca pode confiar em um programador para perceber o óbvio! (Embora neste caso eu tenha.)
Jon Purdy
7
Se houver algum motivo para gostar da $varsintaxe do PHP , é isso.
Joey Adams
3
@ Joey Adams: Sorri brevemente quando vi essa pergunta e lembrei-me de todas as perguntas básicas do PHP flutuando pelo SE.
Chris
3
Obviamente, mude o código fonte do idioma para permitir minhas convenções de nomenclatura. Isso também tem o benefício de "proteger" meu código, pois ele será executado / compilado apenas no meu interpretador / compilador.
dietbuddha

Respostas:

21
  1. Aceite que talvez você precise fazer pequenas alterações em sua convenção de nomenclatura, como adicionar maiúsculas. É melhor aceitar isso o mais rápido possível, para que todo o código subsequente seja consistente.

  2. Considere ser mais específico. Palavras-chave tendem a ser bastante amplo, de modo a diminuir classpara baixo para demonstrationClassnão só trabalha em torno das questões, mas também aumenta a legibilidade.

Maxpm
fonte
10

Não é algo que eu encontrei, mas se eu entrar em tal situação, tentaria resolvê-lo com as seguintes opções, em ordem.

  1. Tente encontrar um sinônimo.
  2. (especialmente para variáveis) tente encontrar um prefixo ou postfix
  3. (especialmente para classes) altere a primeira letra para maiúscula e esqueça a regra de codificação de que os nomes não devem diferir apenas no caso. Essa opção, eu provavelmente usaria apenas se o conflito estiver com uma palavra-chave.
  4. Use uma abreviação.
Bart van Ingen Schenau
fonte
1
Não vejo o que há de errado com nomes que diferem apenas no caso, especialmente nas listas de argumentos em que o parâmetro do tipo const Foo&não tem nenhum nome completo razoável além de foo. É melhor dar Fooum nome mais descritivo para você do que foose ele mora em um corpo funcional e serve a um propósito menos especializado.
Jon Purdy
@ Jon - Eu concordo, embora pessoalmente eu tenha a tendência de prefixos "p_", "l_" e "m_" em vez de variar de caso. Eu adotei essa convenção por causa do problema de todos ter o mesmo nome óbvio. Qual convenção você usa para lidar com isso é em grande parte irrelevante, desde que você a use consistentemente em qualquer contexto particular, é claro - a abordagem de variação de casos certamente é usada amplamente o suficiente para que a maioria dos desenvolvedores a reconheça.
precisa saber é o seguinte
@ Jon - esse comentário diz que eu aplicaria seletivamente a convenção apenas quando tiver o mesmo nome, o que não foi o que quis dizer. O problema de contexto refere-se ao idioma, projeto etc. As convenções são projetadas para que o problema não ocorra sempre que ocorre (ou melhor, não ocorre), para não ser aplicado seletivamente, conforme necessário.
Steve314
@ Steve314: Eu entendi o seu significado desde o primeiro comentário. Não sei, afixos como esse sempre pareciam um pouco próximos do Systems Hungarian para meu conforto.
precisa saber é o seguinte
@ Jon: Não é uma regra que aplique religiosamente, mas acho que é mais fácil cometer erros se dois identificadores diferirem apenas no caso. Alguns desses erros serão detectados pelo compilador, outros são muito mais difíceis de encontrar (especialmente se os dois identificadores nomearem o mesmo tipo de coisa). Prefiro ter uma regra geral, com exceções caso a caso, do que um livro completo com regras que abranjam todos os casos possíveis.
Bart van Ingen Schenau
6

A língua vence; você não pode ser mais esperto que o compilador (ignorando abominações como o PL / 1IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF END , mas o PL / 1 não faria com que você fizesse a pergunta em primeiro lugar). Basicamente, você deve seguir as regras do idioma e encontrar uma alternativa para as palavras-chave do idioma para seu próprio uso - ou encontrar um idioma alternativo.

Portanto, exceto em circunstâncias muito incomuns, você se adapta ao idioma, e não vice-versa.

Jonathan Leffler
fonte
5

Em vez de abreviar, que tal alongar? Se você está implementando uma construção de classe em uma linguagem Foo, que tal usar FooClass e foo_class? (Módulo quaisquer que sejam suas preferências de embalagem).

Winston Ewert
fonte
Você prefixaria "java" em todos os identificadores usados ​​no código Java? E não vamos nem mencionar os problemas com prefixo "C ++" em cada identificador ...
Steve314
@ Steve314, você não usaria o prefixo java no código java, usaria o prefixo java no código c ++ que implementa um compilador java. Além disso, você o usaria apenas se o resto do identificador fosse uma palavra-chave.
Winston Ewert
OK - você quer dizer alongar em termos gerais, como sendo mais específico ao que o identificador também se refere. Para aplicativos diferentes, "class" pode ser renomeado para "class_taught" ou "class_of_animal" ou "classiness_value" ou qualquer outra coisa. Eu concordo - eu apenas achei o exemplo orientado aos compiladores confuso.
Steve314
5

Algumas das abreviações para as quais usei class, em ordem de frequência:

  • cls
  • clss
  • clazz
  • theClass
  • aClass

Se eu souber qual classe a Classinstância representa, posso incluí-la no nome da variável:

  • stringClass = Class.forName("java.lang.String");
Mike Clark
fonte
Nunca vi 'cls' para isso antes. Eu uso principalmente aClass.
Konstantin Petrukhnov
4

Em C e C ++, as palavras-chave são todas minúsculas e o idioma diferencia maiúsculas de minúsculas; portanto, pressione a tecla Shift de vez em quando e muitos problemas desaparecem.

Em Modula 2, palavras-chave são todas as letras maiúsculas - mas enquanto seus identificadores têm algumas letras minúsculas a diferença é óbvia e se choca impossível.

Além disso, as convenções de nomenclatura absoluta, até certo ponto, precisam refletir as convenções normais da linguagem que você está usando, então eu certamente escreveria "myClass" em Java, onde provavelmente escreveria "My_Class" em C ++.

Basicamente, você não está apenas escrevendo para o compilador, mas o que as pessoas acham legível depende, em certa medida, do contexto e das expectativas relacionadas.

Steve314
fonte
3
Mesmo para linguagens que diferenciam maiúsculas de minúsculas, acho que ter misturado classe Classprejudicaria a legibilidade do código.
Karmastan 03/03
@Karmastan - talvez isso dependa de quanto tempo você passou trabalhando com linguagens e convenções que diferenciam maiúsculas de minúsculas. Pessoalmente, o "C" maiúsculo x minúsculo é visualmente muito óbvio - vejo os padrões de uso de maiúsculas e minúsculas para identificadores longos mais rapidamente do que consigo lê-los.
Steve314
3

Não costumo me deparar com isso, mas quando faço isso tende a não ser um problema, porque eu uso o Delphi e permite que você resolva esse problema acrescentando um & ao identificador. Portanto, "classe" não é um identificador válido, mas "& class" é.

Mason Wheeler
fonte
Interessante. Eu tenho um utilitário de geração de código que permite literais de seqüência de caracteres em qualquer lugar que um identificador possa ser usado. Originalmente, a maioria dos identificadores de código gerado era escrita como literal de cadeia de caracteres para evitar o risco de conflitos de palavras-chave com um DSL crescente (e rico em palavras-chave). Agora, os identificadores são usados ​​para a maioria dos nomes (é surpreendente o quanto mais legível é a fonte), mas os literais de strings estão sempre disponíveis como fallback. Eu pensei que era bom para a geração de código, mas as soluções alternativas para conflitos de palavras-chave seriam uma má idéia em uma linguagem de uso geral - mas talvez eu esteja errado.
Steve314
2

Eu adicionaria algum tipo de espaço para nome ao nome da variável. Por exemplo, suponha que você tenha o módulo nomeado usuário, eu modificaria o operador do nome da variável para algo como user_operator ou userOperator.

Pemdas
fonte
2
apenas não use "smooth", "no" ou "my" como prefixo
Steven A. Lowe
2
Absolutamente. Eu voto "Jon_Purdys_Careful_Chosen_Identifier_Prefix_".
precisa saber é o seguinte
1
@ Steven: Pior ainda, eu vejo a, ane theusado com frequência perturbadora por estudantes iniciantes em CS.
Jon Purdy
1
@ Jon Purdy, não é nossa culpa! Culpe o professor que decidiu nomear sua instância da classe People () aPerson.
Ben L
@ Jon: A convenção de nomenclatura onde eu trabalho na especifica que as variáveis locais devem começar aalém de variáveis de laço apertado: /
Matthieu M.
2

alterar ou ajustar minha convenção de nomenclatura

Muad'Dib
fonte