Os identificadores curtos são ruins? [fechadas]

26

Os identificadores curtos são ruins? Como o comprimento do identificador se correlaciona com a compreensão do código? Que outros fatores (além da compreensão do código) podem ser considerados quando se trata de nomear identificadores?

Apenas para tentar manter a qualidade das respostas, por favor, note que há algumas pesquisas sobre o assunto já!

Editar

Curioso que nem todos pensam que o comprimento é relevante ou tendem a preferir identificadores maiores, quando os dois links que forneci indicam que identificadores grandes são prejudiciais!

Link quebrado

O link abaixo apontava para uma pesquisa sobre o assunto, mas agora está quebrado, parece que não tenho uma cópia do artigo comigo e não me lembro o que era. Vou deixar aqui para o caso de alguém descobrir.

Daniel C. Sobral
fonte
5
Ponto de dados. Meu identificador curto favorito é :, como em :(){ :;:& };:- eu diria que a maioria das pessoas pensa que é muito ruim. ;)
@ennec: Bombas de forquilha tendem a ser.
Josh K
Verifique esta questão do stackoverflow. Há um comentário sobre a Prática de programar um livro que todo programador deve ler.
Slu
1
Só porque nomes mais longos devem ser evitados não significa que você deve fazer um esforço extra para encurtá-los por uma questão de falta.
JeffO
1
@cessor Engraçado que algo que pretendia ser sobre pesquisa foi fechado como baseado em opinião. Infelizmente, concordo, dadas as respostas que recebeu.
Daniel C. Sobral

Respostas:

67

A melhor "regra" que ouvi é que o tamanho dos nomes deve ser proporcional ao tamanho do escopo da variável. Portanto, um índice ié bom se o corpo do loop tiver algumas linhas, mas eu gosto de usar algo um pouco mais descritivo, se for maior que 15 linhas.

Nota para pensar em um nome
fonte
6
Eu nunca ouvi falar disso, e não acho que esse princípio melhore a legibilidade do código.
NimChimpsky
8
@ Nim: eu concordo. Mesmo em um curto forciclo, eu nomearia o índice, customerCounterou algo assim. É preciso um esforço extra mínimo e torna seu código muito melhor. Usar variáveis ​​curtas para um escopo curto parece uma desculpa para ser preguiçoso.
6606 Ninguém
2
Hmm, não é uma regra ou uma diretriz para mim, mas uma maneira de fazer você pensar em duração e, nesse contexto, faz algum sentido. Certamente não acho que seja uma desculpa para a preguiça (embora eu concorde que alguns possam tomá-la como tal). Meus identificadores costumam ser mais longos do que não (sinais de serem ensinados a pascal desde o início), exceto agora quando chego a questões como consultas linq e expressões lambda em que identificadores de 1, 2 ou 3 caracteres (geralmente as iniciais do tipo) parecem fazer sentido para mim .
Murph
33
Honestamente, um nome "descritivo" é apenas ruído em uma linha de cinco para loop; Eu acho que a maioria das pessoas tem uma noção muito boa do que você está fazendo com o "i". Eu usei nomes descritivos em loops aninhados, mas esses têm um escopo mais longo.
Jeremy
18
+1 - Usando ie jsão nomes comuns que todos os desenvolvedores devem entender IMO.
TheCloudlessSky
48

Cada variável deve ter um significado e seu nome faz parte desse significado. E uma parte muito importante, pois ajuda o leitor a entender para que serve, sem se aprofundar no algoritmo. i, jsão óbvios para serem usados ​​como índices, são curtos, mas muito informativos. bnté feio closeou closeButtontem significado. Portanto, ser curto ou longo não é o critério mais importante para o nome da variável, mas deve ser significativo. A significância depende fortemente do contexto. Por exemplo, você pode dar um nome muito curto, como na variável de cadeia local, que é usada em um pequeno bloco do código, digamos 10 linhas e se refere ao nome de uma propriedade ( vpois valor é outro exemplo).

Portanto , os nomes de variáveis ​​devem ser informativos e não importa se são curtos ou longos .

duros
fonte
2
+1, e apenas para observar, close e closeButton também não são sinônimos. Close é um verbo e, portanto, deve ser o nome de uma função ou método. Enquanto closeButton é um substantivo, e deve, obviamente, ser o nome do botão que aciona a função close.
CaffGeek
close é um adjetivo, por exemplo close = true;)
Armand
13

Vou usar um identificador que descreva a variável, independentemente do comprimento.

Os casos de i, j e k são, por si só, tão onipresentes que são auto-descritivos, você automaticamente sabe que são índices de loop. Você também pode dizer o mesmo para:

foreach loop (Strings s : myString)

No entanto, os IDE agora fornecem ferramentas de preenchimento de código, portanto, o único efeito colateral negativo de identificadores muito longos e descritivos foi removido.

Felizmente, adicionarei uma palavra extra a um identificador, se necessário, para explicar o objetivo da variável.

NimChimpsky
fonte
3
BTW, o uso de i, j e k para indicações de loop remonta mais de 50 anos ao FORTRAN. As variáveis ​​que começam com as letras I e N são por padrão do tipo INTEGER. As variáveis ​​que começam com qualquer outra letra são, por padrão, REALs. Isso naturalmente levou ao uso de I, J e K para índices de loop for. (A convenção FORTRAN provavelmente surgiu do uso dessas variáveis ​​usadas nas equações matemáticas antes disso.)
tcrosley
2
O segundo artigo que vinculei mostrou que identificadores descritivos muito longos diminuem a capacidade de entender o código, contradizendo a observação do "único efeito colateral negativo".
Daniel C. Sobral
3
O verdadeiro efeito colateral negativo de identificadores muito longos está na legibilidade. É difícil dizer rapidamente se dois identificadores muito longos são iguais ou diferentes, e pode ser difícil selecionar todos os elementos de uma expressão com identificadores muito longos.
David Thornley
tcrosley - eu acrescentaria que só porque é proveniente de Fortran, não há razão para continuar essa prática. Eu desencorajo fortemente o uso de contadores de iterador / loop chamados "i", "j", "k" etc. É uma simples preguiça intelectual. Onipresente <> bom.
quickly_now
9

Eles não são tão ruins quanto os identificadores enganosos. Não me importo com o código de depuração no qual os identificadores são apenas uma letra, mas no momento em que diferentes convenções de nomenclatura entram em cena, isso se torna irritante. Por exemplo, se em algum lugar você vê strPersonIDe depois em algum outro lugar s_EmployeeID, é confuso dizer se são essas duas strings e se há alguma diferença. Além disso, se as variáveis ​​forem copiadas e coladas ( pmapIntString = new std::map<int,int>) e estiverem totalmente erradas, vou me preocupar.

Quando se trata de mim, adiciono comentários no código para as variáveis ​​importantes usadas e tento manter o padrão fornecido nas diretrizes de desenvolvimento. Se não houver um padrão, tento manter a mesma convenção de nomenclatura em todo o código.

Manoj R
fonte
5

Eu luto...

Costumo usar sempre nomes descritivos como identificadores, mas ultimamente tenho usado identificadores muito curtos.

Eu acho que depende do contexto do código:

  • Se você escrever funções complexas (algoritmos), SEMPRE use identificadores curtos (caracteres únicos são os melhores)
  • Ao escrever valores de parâmetros para funções, use nomes descritivos.

Eu acho que depende também da densidade do código. Às vezes, ter nomes torna mais difícil a leitura.

Às vezes, sem nomes, é totalmente enigmático!

Darknight
fonte
1
Se você estiver escrevendo algoritmos complexos, não gostaria que os identificadores fossem mais descritivos para as pessoas que olham seu código pela primeira vez?
Maxpm
Quando um identificador de caractere único é apropriado?
Amir Afghani
1
Eu também acho isso, mas na verdade achei que não é esse o caso, tente você mesmo. Pegue um algoritmo complexo e tente com nomes descritivos versus variáveis ​​de letra única.
Darknight
1
Eu concordo, mas apenas para fórmulas complexas mais longas, porque elas tendem a ficar muito longas, e mesmo assim você pode usar funções (nomes de funções) para descrever quais são as partes dessa fórmula.
Emile Vrijdags
1
Se é assim tão complexo, e tem padrões, esses padrões devem ser quebradas em funções
CaffGeek
3

Meu pensamento é que eles não são ruins em si mesmos, mas são pouco informativos, a menos que sejam muito comuns.

Portanto, variáveis ​​de loop sendo i, j e k são tão padrão que não há razão para não usá-las se você estiver criando um loop indexado.

O outro lugar em que usarei um identificador muito curto é quando declaro uma variável temporária que ficará fora do escopo em poucas linhas - a variável temporária de um loop foreach, por exemplo. Se não for consultado em nenhum outro lugar, é fácil para quem lê o código ver a declaração e seguir para que está sendo usado. Porém, se for usado por mais de cinco ou seis linhas, procurarei dar um nome mais claro.

Além disso, tento usar identificadores informativos de comprimento - particularmente em nível de classe, quero um identificador que você possa ler e ter uma ideia do que é a variável. Se eles estão ficando muito longos (e às vezes vejo código com quatro ou cinco palavras juntas para um identificador), costumo considerar isso como um cheiro de código - se eu precisar de muito texto para distinguir minhas variáveis, na verdade eles são um grupo que poderia ser melhor armazenado em um hashmap ou lista? Eu poderia estar criando algum tipo de objeto para modelar esses dados com mais precisão? Às vezes, você não pode deixar de identificar um identificador muito longo, indicando que há algo que vale a pena examinar aqui.

glenatron
fonte
3

Eu concordo muito com as outras respostas aqui, mas gostaria de apontar outro fator que acho que muitas vezes é esquecido. Um bom nome geralmente é idiomático para o código. Isso pode estar no nível da linguagem, no nível do algoritmo ou em alguns idiomas internos da base de código em questão. O ponto é que, embora o nome possa não significar nada para alguém que não conhece o domínio do código, ele ainda pode ser o melhor nome no contexto especificado.

harald
fonte
3

Nomear uma variável é sempre um exercício para equilibrar exclusividade e compreensibilidade. O comprimento do nome está relacionado a ambos, de maneiras diferentes. Nomes mais longos são mais fáceis de tornar únicos; nomes de tamanho médio tendem a ser mais compreensíveis que nomes curtos ou longos demais.

Um nome de variável muito curto só é útil se ele tem uma história que o torna compreensível (por exemplo, i, j, e kpara os índices, dxpara uma distância ao longo de um eixo) ou um escopo que é pequeno o suficiente para todas as referências a ser visíveis ao mesmo tempo (por exemplo, , temp). Os piores nomes de variáveis ​​do mundo são coisas assim t47. ("O que isso significa e por que é diferente t46?") Graças a Deus esse estilo de nomeação foi predominante no FORTRAN, mas é aqui que o desejo de nomes de variáveis ​​mais longos está enraizado.

Como o documento original mostrou, nomes muito longos também são difíceis de ler, pois diferenças sutis internas podem ser perdidas ao se olhar para o código. (A diferença entre DistanceBetweenXAxisAbscissae& DistanceBetweenYAxisAbscissaeé realmente difícil de entender rapidamente.)

Como o NoteToSelf apontou anteriormente, os requisitos para exclusividade de um nome dependem principalmente do escopo em que o nome deve ser exclusivo. O índice de um loop de 5 linhas pode ser i; é melhor que um índice de um registro ativo que seja passado de função para função tenha um nome muito mais descritivo.

Uma variável local para uma função pode ter um pequeno nome descritivo como deltaXsem problemas. Uma variável estática delta X em um módulo deve ter um nome que distinga esse deltaX de outros deltaX no mesmo módulo, tornando-o mais longo. E uma variável delta X global deve ser tornada exclusiva em todos os módulos e em todos os outros módulos possíveis que possam ser criados, provavelmente concatenando o nome do módulo com o outro nome descritivo. Este é um dos muitos problemas com os globais; para serem úteis, os nomes devem ser longos o suficiente para dificultar a leitura.

Erik Johnson
fonte
2

Pelo contrário, acho que identificadores longos são piores que identificadores curtos (a menos que você esteja lidando com constantes). Usar TheVariableThatHoldsTheCapacityOfMyContainerClasstorna seu código muito mais propenso a erros do que usar Capacity.

Maxpm
fonte
1
Você ficaria feliz em saber que uma das pesquisas que eu vinculei apóia seu raciocínio, se não pelos mesmos motivos, então. ;-)
Daniel C. Sobral
1
Também é muito fácil interpretar mal identificadores muito longos, possivelmente confundindo-os ou não percebendo que dois deles são iguais.
David Thornley
2
TheVariableThatHoldsTheCapacityOfMyContainerClass é maior do que eu consideraria "longo" - dez palavras são longas demais para o CamelCase ajudar; você precisa de espaços para tornar isso legível.
Richard Gadsden
1
Claro, mas este é um homem de palha. Seu exemplo de nome longo adiciona verborragia, mas nenhuma informação. Considere o caso em que você possui várias variáveis ​​relacionadas a várias formas de capacidade. Então você pode realmente querer nomes que distinguam os propósitos, como initalCapacity ou finalCapacity.
Charles E. Grant
2
@ Maxpm, var total = Capacity + Capacity2; O que Capacitycontém e o que Capacity2contém? Para que eles serão usados? Ter que procurar pistas de contexto desperdiça tempo. Considerando que se está escrito como var totalStorageCapacity = truckCapacity + trailerCapacity;eu sei do que estamos falando.
CaffGeek
2

Em si mesmos, identificadores curtos não são ruins. O objetivo de escolher bons nomes (curtos ou longos) está em serviço para esclarecer o código. A escolha de identificadores no serviço de clareza de código é mais importante do que atender a algum requisito de tamanho mínimo. Em geral, o que isso significa é escrever nomes significativos um pouco mais.

dietbuddha
fonte
+1 você disse isso muito bem, eu não consegui encontrar minhas palavras quando escrevi a resposta :-)
ComputerSaysNo
1

Uma observação que tive ao longo dos anos e é menos hoje do que há 10 ou 15 anos atrás. Os programadores que não podem digitar são os que lutam com unhas e dentes por nomes variáveis. Eles são os únicos com todos os nomes de variáveis ​​de 1 a 3 letras.

Portanto, meu conselho é usar um nome significativo, como muitos comentaristas disseram, e aprender a digitar. Eu tenho pensado em adicionar um teste de digitação às entrevistas, apenas para ver onde as pessoas estão, mas estou começando a ver muito menos pessoas que não escrevem à medida que os computadores se tornam uma parte maior da sociedade.

Bill Leeper
fonte
2
Na verdade, não vi essa correlação. Se alguma coisa parece que as pessoas das línguas OO buscam identificadores longos, e as pessoas da linguagem funcional buscam identidades curtas. Coloca em questão a alegação de que o OO ajuda na modelagem. :-)
Daniel C. Sobral
Não esqueça que os nomes não precisam apenas ser digitados, mas também lidos. Usar identificadores muito longos pode realmente diminuir bastante a legibilidade. O uso de qualquer coisa, exceto iem loop, for (int i=0; i<dst.size(); ++i) dst[i] += src[i]deve ser proibido por lei.
Maaartinus
1

O primeiro artigo que você vincula parece interessante, mas sua conclusão é que eles não encontraram evidências significativas a favor ou contra a hipótese de que "dicas de aterramento", incluindo nomes significativos de variáveis, ajudam na compreensão do código. O olhar usado permanece o tempo como um proxy para a compreensão do código, o que é interessante, mas não um slam dunk.

Receio ter achado o segundo artigo simplesmente bobo. O primeiro problema é que os exemplos de nomes longos que eles fornecem são gratuitos, sem fornecer informações extras. Acho que todos podemos concordar que tornar um nome de variável mais longo apenas para torná-lo mais longo é estúpido. O exemplo deles de nomear uma variável distance_between_abscissae em vez de dx é um homem de palha.

Mais importante, o experimento deles é um teste de memorização simples, e não de compreensão. Ele testa a capacidade dos sujeitos de preencher partes ausentes de um nome de variável quando apresentadas em uma lista sem contexto. Sim, nomes mais longos são mais difíceis de memorizar, mas quando estou codificando não memorizo ​​nomes de variáveis, os uso para fornecer contexto. Suponho que você possa argumentar que a dificuldade de lembrar a variável longa dificulta a escrita do código, mas o código é lido com muito mais frequência do que o escrito, portanto, qual atividade deve ser otimizada?

Charles E. Grant
fonte
Observe que o segundo artigo afirma claramente que "os oito nomes usados ​​nas oito perguntas foram extraídos do código de produção". Além disso, eles não testam apenas a memorização, mas também a correção.
Daniel C. Sobral
1

Uma das minhas principais métricas para determinar se uma linha de código é legível ou não é quanto outro contexto de outras linhas deve ser lido para ter certeza de que você entende o que a linha está fazendo.

É fácil dizer que "qualquer pessoa deve entender que i, j e k são variáveis ​​de loop". E na maioria das vezes é realmente óbvio. Mas ainda tento ser humilde e profissional sobre isso e presumo que é fácil cometer erros ao programar. Portanto, se eu estiver fazendo um loop através de uma matriz de Grobbles, nomeará a variável de loop grobbleIndex. Eu também poderia aceitar i como uma abreviação de index. Quando você está usando ij ek, é mais difícil detectar erros, como usar o índice errado com a matriz errada e assim por diante. E fica ainda pior quando você tem um loop interno.

PS. Na época em que escrevi essa resposta, eu estava codificando algum javascript em um mini laptop de 10 "com uma tela dividida verticalmente no vim e ainda assim dediquei um tempo para nomear minhas variáveis ​​de loop rowIndex e columnIndex.

Sam
fonte
0

Em algumas aplicações, uma variável curta simplesmente não pode explicar os dados na variável. Curto ou longo é irrelevante. Usar uma variável mais longa não torna seu código mais lento. Certamente, é mais difícil digitar um nome de variável longo, mas pelo menos a pessoa que lê o código 6 meses depois (que pode ser você) será capaz de entender o que está acontecendo sem precisar colocar rastros, supondo que isso seja possível.

rsman
fonte
0

Eu acho que o ideal é que os nomes sejam descritivos, a menos que ...

A idéia de que os nomes podem (talvez deva) ser mais curtos - e, portanto, por implicação, menos descritivos - se tiverem escopo limitado é apenas uma razão para se desviar do ideal.

Pessoalmente, freqüentemente uso nomes abreviados para um pequeno número de entidades com referências repetidas. Sub-rotinas específicas do aplicativo, chamadas com frequência, por exemplo.

FumbleFingers
fonte
-2

Eu nunca usaria nomes de identificador com menos de 4-5 caracteres, por exemplo, uma variável de loop pode ser Index ou jIndex ou kIndex, dependendo de quantos loops internos eu preciso para realizar alguma coisa, mas, para outros nomes, digamos uma "chave" que eu usaria "String LKey" ou "int LKey", "L" para local se for uma variável de método ou "F" para variável de classe privada, todos os outros identificadores como outros mencionados antes de mim devem explicar o motivo de sua existência em seu nome, caso contrário, o O escopo "identificador" é inútil, não é ?!

ComputerSaysNo
fonte
5
Quais informações adicionais o "índice" transmite que o "i" não fornece? Nomes longos de variáveis ​​que não dizem nada são piores que nomes de caracteres únicos.
Anon.
2
Tendo escrito recentemente algumas coisas que funcionavam em uma grade 3d, eu tinha muitas variáveis ​​nomeadas x, ye z. Dado o contexto, eles eram perfeitamente descritivos.
Loren Pechtel 6/01/11