Erros ortográficos intencionais para evitar palavras reservadas


45

Frequentemente, vejo códigos que incluem erros ortográficos intencionais de palavras comuns que, para o bem ou para o mal, se tornaram palavras reservadas:

  • klassou clazzpara aula :Class clazz = ThisClass.class
  • kountpara contagem no SQL:count(*) AS kount

Pessoalmente, acho que isso diminui a legibilidade. Na minha própria prática, não encontrei muitos casos em que um nome melhor não pudesse ser usado - itemClassou recordTotal.

Um exemplo do JavaDocs for Class mostra isso nos parâmetros:

 public <U> Class<? extends U> asSubclass(Class<U> clazz)

Isso mostra um caso de uso razoável?


9
Para registro: No Python, clsé um nome comum (de fato, o único idiomático) para variáveis ​​/ argumentos que continuam com classes reais (aquelas que você declara com a classpalavra - chave e da qual tudo é uma instância).

14
Você não gosta typedef char ínt?
Jeff

14
@muntoo Você está certo. Eu também recebo erros de compilador para iñt. Lá se vai meu plano de dominação do mundo.
Jeff

1
Eu quebrei essa regra ... e agora sinto vergonha.
JMQ

3
Não faça isso. Posso dizer honestamente que nunca vi isso antes e, se o fizesse, eu o renomearia imediatamente. Apenas abrevie se você precisar usar um nome de variável não descritivo ( Class c).
Cody Grey

Respostas:


63

IMHO, essa é uma péssima idéia. Palavras reservadas são reservadas por um motivo, e isso diminui a legibilidade.

Também concordo inteiramente com o seu segundo ponto. Nomear uma variável class, mesmo que você possa fazê-lo, seria tão ruim quanto nomear tmpou a. Que tipo de aula? Uma classe de quê? Os nomes devem ser descritivos.


15
"Palavras reservadas são reservadas por uma razão" <- Isto. (Que, ironicamente, é reservado.)
trycatch 25/03

16
+1 porque você está certo. Mas se você estivesse escrevendo software de agendamento de sala de aula, ou algo assim, a classe pode ser uma variável ou classe nome legítima ...
CaffGeek

8
Meh. " Palavras reservadas são reservadas por uma razão ", que é que os designers de linguagem são preguiçosos. Existem alguns idiomas sofisticados em que as palavras são reservadas apenas nos locais específicos em que são usadas. Mas Ritchie iniciou essa tendência quando ele precisava de um compilador leve para C, e a maioria dos designers de idiomas aprendeu a partir daí.
Ross Patterson

14
Não, Ross, é porque os programadores (e os leitores em geral) têm uma expectativa de que as coisas tenham um significado razoavelmente inequívoco (é por isso que aprender línguas estrangeiras geralmente é tão difícil, todas as coisas com duplo significado ou diferentes do idioma que você criou desde a infância, onde você nunca percebe essas ambiguidades porque elas fazem parte de sua herança cultural).
Jwenting

3
@AlexanderMorou Não, e nem a maioria dos designers de idiomas, eles apenas começam com o design de outra pessoa. Mas observe Algol, Fortran, PL / I, Rexx e outros idiomas não baseados em C, e você verá que gramáticas sem palavras reservadas são certamente possíveis, apenas mais difíceis. Ritchie tinha um bom motivo - o pessoal do Unix achava que todo pressionamento de tecla importava e, no PDP-11, todo ciclo de CPU importava. Hoje? Não muito.
Ross Patterson

21

O Guia de Estilo do Python chama esse problema especificamente e sugere:

Se o nome do seu atributo público colidir com uma palavra-chave reservada, anexe um único sublinhado à direita no nome do seu atributo. É preferível a uma abreviação ou ortografia corrompida.

Parece uma regra geral muito boa, supondo que não entre em conflito com a semântica de um idioma específico.


7
Sinto que este é um péssimo conselho de um guia de estilo. Se o nome do seu atributo estiver tão próximo de uma palavra-chave, você deverá encontrar um nome melhor. Simplesmente colocar um sublinhado no final não adiciona nenhum significado e torna provável que confunda o próximo cara que lê o código.
Wayne Johnston

18
@ Wayne: Como você vai nomear a operação de união em uma estrutura de união de união quando unioné uma palavra-chave (como em C)? Você vai chamá-lo fooapenas porque não deve parecer union?
Fred Foo

OTOH, clsé o nome padrão do argumento para o método de classe. Também, por exemplo, no Django, os objetos têm .idatributo, o que obviamente entra em conflito com ida função interna.
vartec

1
@GoloRoden Eu nunca ouvi alguém dizer que estava "unindo" dois conjuntos ao calcular o sindicato. Simplesmente não faz parte do jargão. "Mesclar" seria melhor, mas um mergemétodo ainda precisaria de documentação declarando explicitamente que implementa a união e foi renomeado por razões puramente técnicas.
Fred Foo

2
@GoloRoden De acordo com a Merriam-Webster, não é um verbo, mas veja esta resposta .
Maaartinus

18

Cheiro de código.

string stringVariable = "";

O código acima não me diz nada sobre o uso pretendido das variáveis.

class Klass

Mesmo problema

string UserNameString = "bmackey"

O código acima não deve exigir a sequência de palavras-chave anexada ao nome da variável. Se você precisar identificar tipos pelo nome da variável, seu código será muito longo. Refatorar de condensação.


Ele não diz nada porque não é "código", é uma declaração de variável isolada. Uma "classe" ou "classe" pode muito bem dizer tudo o que você precisa saber. Por exemplo, um método genérico pode receber um Class<T>parâmetro, e isso pode fazer sentido. Então, eu discordo que é um cheiro de código.
Andres F.

5

Pessoalmente, acho que é uma opção perfeitamente válida para o seu estilo de código.

São palavras reservadas para que o compilador não precise decidir se você quis dizer o mecânico da linguagem ou sua variável. Com isso em mente, isso implica que eles esperam que as pessoas precisem de uma variável como uma palavra reservada.

Percorrendo a fonte que acompanha o JDK 1.6 R21, encontro 917 ocorrências de "clazz". Aparentemente, eles pensaram que era um estilo aceitável.

Como sua equipe se sente sobre isso? Se você acha que é ruim, mas os outros nove caras da sua equipe acham que é bom, então você precisa morder a bala e aceitá-la. Contanto que haja comunicação sobre o que está bem e o que não está, e você está levantando problemas que vê como os vê, tudo ficará bem.

Como sua equipe se sente sobre o estilo do código é mais importante do que minha opinião, ou de qualquer outra pessoa neste post . Isso vale para essa e quaisquer outras decisões de estilo de código que você possa ter.


1
Certo, mas eventualmente sua equipe mudará. Muitos anos depois, haverá um pobre rapaz olhando seu código cheio de klasses e clazzes e dizendo "WTF!".
MrFox

4
Se você estiver usando os dois klasse clazzisso é uma coisa ruim. Você precisa ser consistente para que eles só precisem aprender uma vez. E, idealmente, isso também está explicitado nas diretrizes de estilo das equipes, por isso não é uma surpresa.
precisa saber é o seguinte

O código é escrito não apenas para as pessoas da sua equipe, mas para o resto do mundo ler. Quando sua equipe está num ônibus que passa por um penhasco, alguém começa a ler o código. Use nomes que descrevam de forma completa e concisa qual é a variável, não como ela é representada.
Rob K

1
Não, simplesmente não. Sua equipe tem muito mais chances de alternar membros lentamente ao longo do tempo. Você pode planejar que uma pessoa seja atropelada por um ônibus, mas não pode planejar que toda a sua equipe seja atropelada por um ônibus. A maioria dos códigos é escrita para talvez uma dúzia de pessoas que precisem ler, metade delas durante a revisão do código.
corsiKa

4

Erros ortográficos intencionais para evitar palavras reservadas são uma má idéia.

  • Os erros de ortografia são difíceis de distinguir da ortografia correta, portanto, dificultam a leitura do código.

  • Os erros de ortografia são difíceis de lembrar, de modo que vários erros de ortografia inconsistentes provavelmente competem no código, o que torna o código mais difícil de escrever e mais difícil de ler.

  • Palavras reservadas referem-se ao idioma que está sendo usado para resolver o problema, não ao problema em si. Um nome de variável deve apontar para um conceito relacionado ao problema.

Portanto, é melhor escolher um nome descritivo alternativo ou, se não houver uma alternativa satisfatória, qualificar a palavra reservada como em:

public static Method findBenchmarkMethod(BenchmarkRecord benchmark) {
    Class<?> benchmarkedClass = ClassUtils.loadClass(benchmark.generatedClass());
    return findBenchmarkMethod(benchmarkedClass, benchmark.generatedMethod());
}

3

Class clazzcheira como "eu não me incomodei em tentar criar um bom nome". Uma variável está sempre representando algo, e um bom nome descreve isso. Recuso-me a imaginar que, clazzpor exemplo, sob qualquer circunstância seja o melhor nome possível. É uma referência a uma classe -> class_reference, é uma cópia de um objeto de classe -> class_copy, etc. Também é possível soltar "class" e usar apenas a palavra descritiva, por exemplo

java.lang.SecurityManager.checkMemberAccess(Class<?> clazz, int which)
Parameters
    clazz -- the class that reflection is to be performed on.

Aqui clazz é a classe de destino na qual a verificação deve ser realizada, portanto

checkMemberAccess(Class<?> target, int which)

descreveria muito melhor para que o parâmetro é usado do que o clazz jamais fará.


IMHO não é melhor, você poderia chamá-lo de 'classToBeAccessed` ou qualquer outra coisa, mas qualquer nome mais descritivo mostra o óbvio. Só gosto de nomes longos se eles fornecerem informações úteis.
Maaartinus

1
classToBeAccessedé realmente um bom nome ( classToBeCheckedtalvez fosse ainda melhor).
precisa saber é

1

Se eles usam um nome reservado para uma variável, é uma variável com nome inadequado. Mesmo que seja um nome legítimo, como Class para software de sala de aula.

Variáveis ​​mal nomeadas são um sinal de código mal pensado ou casual - cuidado com outras dicas do software que você está mantendo.


0

Acho que erros ortográficos ou abreviaturas intencionais são uma boa ideia se usados ​​com cuidado e consistência .

Considere em Java:

class X { public X() { } }
X x = new X();
x.getClass;  // Wha?  How does "get" help anything?
x.class;     // Best, but requires more lexer/parser work
x.klass;     // At least as good as getClass
x.clazz;     // Same

O lugar para usar erros ortográficos é onde a palavra reservada é claramente a melhor para o trabalho. Existem dois lugares para não usar erros de ortografia nos quais você pode ser tentado.

  1. Você não sente vontade de pensar em um bom nome
  2. Você só quer uma variável dummy e ela não precisa de um nome descritivo

No primeiro caso, é bastante óbvio que a preguiça raramente é uma boa política para criar código de qualidade. No segundo caso, escolha uma variável muito curta. É isso que os matemáticos fazem o tempo todo e os programadores fazem pelos índices. Não há razão para limitar-se a fazer isso por índices se realmente for apenas uma variável fictícia:

boolean isMyName(String testName) { return myName.equals(testName); }
boolean isMyName(String s) { return myName.equals(s); }

Date nextMeeting(Klass klass) { return /* something */ }
Date nextMeeting(Klass k) { return /* something */ }

Você não perde nada com nomes curtos de variáveis ​​quando o método ou a estrutura do código informa o que deve estar lá.


2
Me desculpe, eu não posso concordar. Como o nextMeeting funciona exatamente? A lógica é obscura. Você está me forçando a procurar a definição de Klass toda vez que leio seu código, porque o nome não faz sentido. Se você tivesse nextMeeting (MeetingRoom meetingRoom), eu teria uma definição a menos de classe (klass? Clazz?) Para ler e, assim, ser mais produtivo. O código é lido muito mais do que escrito.
MrFox

@suslik - nextMeeting(MeetingRoom r)é suficiente. O que você está meetingRoomfazendo aí? Se fosse assim, nextMeeting(int meetingRoom)eu entenderia, mas meu argumento é usar nomes curtos de variáveis ​​quando as informações já estiverem disponíveis em outras fontes .
Rex Kerr #

Meu post foi mais sobre a existência de Klass na base de código. Às vezes, concordo com nomes curtos de variáveis, mas se seus métodos forem longos e você tiver que continuar se registrando para garantir que "r" seja um MeetingRoom, isso também não será ótimo. Estou curioso para saber qual é a desvantagem do meetingRoom? Espaço horizontal? Muito tempo para digitar?
MrFox

@suslik - Sim, você perde o contexto horizontal com nomes de variáveis ​​longos. Como você perde o contexto vertical com métodos longos, é melhor tentar evitá-los (mas eu concordo que, se você fizer isso de qualquer maneira, provavelmente desejará que seus nomes de variáveis ​​sejam melhores lembretes). Klassera uma alternativa quando havia uma palavra reservada . Não recomendo usar um erro de ortografia quando a ortografia original estiver disponível!
Rex Kerr #

0

Eu já vi usos legítimos Class klassao refletir quando você realmente trabalha com uma instância da Classclasse.


2
A questão não é se existe algum caso em que você tem uma instância, mas se deve usar essa ortografia ou um nome mais descritivo, como userClassalguma outra opção.
30611 Nicole

2
Nesse caso, eu prefiro classInstancemais klass.
Konrad Morawski

2
@KonradMorawski: Mas todos os objetos com os quais você trabalha são instâncias, por isso classInstancesão bastante redundantes. Além disso, eu poderia imaginar algo parecido class klass; Object classInstance = klass.newInstance;.
Maaartinus

0

Frequentemente, vejo códigos que incluem erros ortográficos intencionais de palavras comuns que, para o bem ou para o mal, se tornaram palavras reservadas:

klass ou clazz para a classe: Class clazz = ThisClass.class

kount para count no SQL: count (*) AS kount

Pessoalmente, acho que isso diminui a legibilidade. Na minha prática, não encontrei muitos casos em que um nome melhor não pudesse ser usado - itemClass ou recordTotal.

No entanto, é tão comum que não posso deixar de me perguntar se sou o único? Alguém tem algum conselho ou, melhor ainda, recomendações citadas por programadores respeitados sobre essa prática?

Para variáveis ​​locais e argumentos formais, isso simplesmente não importa.

Qualquer nome é bom, desde que não seja intencionalmente enganoso ou perturbador. No seu exemplo:

public static Method findBenchmarkMethod(BenchmarkRecord benchmark) {
    Class<?> clazz = ClassUtils.loadClass(benchmark.generatedClass());
    return findBenchmarkMethod(clazz, benchmark.generatedMethod());
}

não importa se a única variável local é "clazz" ou "klass" ou "cls" ou simplesmente "c". Eu provavelmente apenas incorporaria a expressão:

return findBenchmarkMethod(ClassUtils.loadClass(benchmark.generatedClass()),
                           benchmark.generatedMethod());

O comprimento do nome de uma variável deve estar relacionado ao escopo da variável. Para variáveis ​​locais em métodos curtos (e todas devem ser curtas), nomes muito curtos são adequados.


sua linha parece incorreta ClassUtils.loadClass(benchmark.generatedClass())=> benchmark.generatedClass()- perdeu ClassUtils.loadClassao longo do caminho
mosquito

0

Eu acho que erros de ortografia são sempre uma má idéia. Não é legal para seus leitores. Eu, por exemplo, estaria me perguntando se perdi alguma coisa quando vejo a palavra klass. (Eles queriam dizer classou o pirata?) Pelo menos para mim, todos os erros de ortografia que reconheço são irritantes.

Nos poucos casos em que a palavra reservada é realmente a única coisa significativa conhecida sobre a variável, eu usaria as seguintes alternativas:

  • Se for um argumento de função, use em aClassvez de class.

  • Se for uma variável local ou membro, use em myClassvez de class.

  • Se for um acessador, use em getClass()vez de class().

Obviamente, o prefixo adicionado é inútil e, portanto, só deve ser usado como último recurso. Mas pelo menos isso não interfere no analisador mental do seu leitor e é uma maneira segura de evitar palavras reservadas.


0

Um benefício para a ortografia criativa é a melhor capacidade de pesquisa. Eu acho que é muito mais fácil fazer uma pesquisa completa de código por coisas únicas, do que por palavras comuns, onde muitas vezes você encontrará todas as coisas erradas, e 1000 delas. Como exemplo, eu costumava possuir o kzpg.com. Google que agora e você verá apenas alguns hits. É único e, portanto, muito localizável.

Mas, até certo ponto, acho que essa pergunta é mais uma opinião do que substância. Pessoalmente, eu cresci na Forth, onde se tratava de palavras e muitas delas. Aprendemos a ser muito criativos para economizar os dedos. No final, eu tinha cerca de 640.000 caracteres, mais ou menos na minha base de origem. Portanto, manter as palavras curtas era importante para realizar o trabalho.


Esse link está quebrado agora.
22416 Peter Mortensen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.