Isso se tornou uma grande frustração com a base de código em que estou trabalhando; muitos de nossos nomes de variáveis são curtos e não descritivos. Sou o único desenvolvedor que resta no projeto e não há documentação sobre o que a maioria deles faz; portanto, preciso dedicar mais tempo a rastrear o que eles representam.
Por exemplo, eu estava lendo algum código que atualiza a definição de uma superfície óptica. As variáveis definidas no início foram as seguintes:
double dR, dCV, dK, dDin, dDout, dRin, dRout
dR = Convert.ToDouble(_tblAsphere.Rows[0].ItemArray.GetValue(1));
dCV = convert.ToDouble(_tblAsphere.Rows[1].ItemArray.GetValue(1));
... and so on
Talvez seja só eu, mas não me disse essencialmente nada sobre o que eles representavam, o que dificultou a compreensão do código. Tudo que eu sabia era que era uma variável analisada em uma linha específica de uma tabela específica, em algum lugar. Após algumas pesquisas, descobri o que elas significavam:
dR = radius
dCV = curvature
dK = conic constant
dDin = inner aperture
dDout = outer aperture
dRin = inner radius
dRout = outer radius
Renomeei-os para essencialmente o que tenho lá em cima. Isso alonga algumas linhas, mas eu sinto que isso é uma troca justa. Esse tipo de esquema de nomenclatura é usado em grande parte do código. Não tenho certeza se é um artefato dos desenvolvedores que aprenderam trabalhando com sistemas mais antigos ou se há uma razão mais profunda por trás disso. Existe uma boa razão para nomear variáveis dessa maneira, ou estou justificado em atualizá-las para nomes mais descritivos à medida que os encontro?
fonte
dK = conic constant
.Respostas:
Parece que esses nomes de variáveis são baseados nas abreviações que você esperaria encontrar em um livro de física que trabalha com vários problemas de óptica. Essa é uma das situações em que nomes curtos de variáveis geralmente são preferíveis a nomes mais longos. Se você tem físicos (ou pessoas que estão acostumadas a trabalhar as equações manualmente) que estão acostumadas a usar abreviações comuns como Rin, Rout, etc., o código será muito mais claro com essas abreviações do que com nomes de variáveis mais longos. Também facilita a comparação de fórmulas de papéis e livros didáticos com o código, para garantir que o código esteja realmente fazendo os cálculos corretamente.
Qualquer pessoa familiarizada com a óptica reconhecerá imediatamente algo como Rin como o raio interno (em um artigo de física,
in
isso seria renderizado como um índice), Rout como o raio externo, etc. Embora eles quase certamente possam traduzir algo mentalmente comoinnerRadius
na nomenclatura mais familiar, isso tornaria o código menos claro para essa pessoa. Tornaria mais difícil identificar casos em que uma fórmula familiar tivesse sido codificada incorretamente e tornaria mais difícil a tradução de equações no código de e para as equações que eles encontrariam em um artigo ou livro.Se você é a única pessoa que analisa esse código, nunca precisa traduzir entre o código e uma equação óptica padrão, e é improvável que um físico precise analisar o código no futuro, talvez isso aconteça. faz sentido refatorar porque o benefício das abreviações não supera mais o custo. Se esse fosse um novo desenvolvimento, no entanto, quase certamente faria sentido usar as mesmas abreviações no código que você encontraria na literatura.
fonte
column
em um jogo de estratégia militar provavelmente significa algo diferente do que significaria nos gráficos de software.Variáveis com vida útil curta devem ser nomeadas em breve. Como exemplo, você não escreve
for(int arrayCounter = 0; arrayCounter < 10; arrayCounter++) { ...
. Em vez disso, você usafor(int i ...
.Em regra geral, pode-se dizer que quanto menor o escopo da variável, menor o nome. Os contadores de loop geralmente são apenas letras únicas, digamos
i
,j
ek
. Variáveis locais são algo comobase
oufrom
eto
. Variáveis globais são então um pouco mais elaboradas, por exemploEntityTablePointer
.Talvez uma regra como essa não esteja sendo seguida com a base de código com a qual você trabalha. É uma boa razão para refatorar!
fonte
i
,j
,k
, eu escrevo algo comopersonPos
porque então eu não vou esquecer o que estou a iteração de eo que o índice representa.arrayCounter
. Facilita a leitura do código e, pelo menos, evita que você pisoteie todo o contador externo ao copiar / colar outro loop dentro deste.arrayCounter
, usariapersonIndex
ourow
descrevia o que estou vendo.i
. Mas assim que faço a transição para um loop aninhado, largo ai
nomenclatura. A razão para isso é porque eu realmente quero acompanhar com qual variável de loop está sendo trabalhada, ei
vsj
pode enganar bastante o código denso. Tornar mais legível e adicionar mais espaço em branco é inerentemente necessário para mim.O problema com o código não são os nomes abreviados, mas a falta de um comentário que explique as abreviações ou aponte para alguns materiais úteis sobre as fórmulas das quais as variáveis são derivadas.
O código simplesmente assume a familiaridade do domínio do problema.
Tudo bem, uma vez que provavelmente é necessário familiarizar o domínio do problema para entender e manter o código, especialmente no papel de alguém que o "possui", de modo que é necessário adquirir a familiaridade em vez de procurar nomes mais longos.
Mas seria bom se o código fornecesse algumas dicas para servir como trampolins. Mesmo um especialista em domínio pode esquecer que
dK
é uma constante cônica. Adicionar um pequeno "truque" em um bloco de comentários não faria mal.fonte
Para determinadas variáveis que são bem conhecidas no domínio do problema - como o caso que você tem aqui - nomes de variáveis concisos são razoáveis. Se estou trabalhando em um jogo, quero que minhas entidades de jogo tenham variáveis de posição
x
ey
, nãohorizontalPosition
everticalPosition
. Da mesma forma contadores de loop que não têm qualquer semântica para além de indexação, espero veri
,j
,k
.fonte
x
ey
, embora comuns, não carregam aspectos implícitos importantes, como onde a origem.for (x,y) in list_of_coordinates: print x,y
: A origem não importa particularmente ao tentar entender o código.De acordo com o "Código Limpo":
Os nomes das variáveis devem:
Exceções são as proverbiais
i,j,k,m,n
usadas para loops.Os nomes das variáveis das quais você, por direito, reclama, não fazem nada do exposto acima. Esses nomes são nomes ruins.
Além disso, como todo método deve ser curto , o uso de prefixos para indicar escopo ou tipo não está mais em uso.
Estes nomes são melhores:
Um comentarista diz que isso seria muito complexo com nomes de variáveis longos:
Nomes curtos de variáveis também não simplificam:
A resposta são nomes longos e resultados intermediários até você obter isso no final:
fonte
fnZR = (r^2/fnR(1+Math.sqrt((1+k)) * (r^2/R^2))) + a[1]*r^2 + a[1]*r^4 + a[1]*r^6 ...;
long_name
oR
no livro se refere. Use resultados intermediários, mas mantenha sua matemática complexa o mais próxima possível do domínio do problema, para que você possa realmente mantê-la se precisar adicionar um recurso.Há duas boas razões para não renomear variáveis no código herdado.
(1) a menos que você esteja usando uma ferramenta de refatoração automatizada, a possibilidade de introduzir bugs é alta. Portanto, "se não estiver quebrado, não conserte"
(2) você fará comparando versões atuais com versões anteriores, para ver o que mudou, impossível. Isso tornará a manutenção futura do código mais difícil.
fonte
O motivo para usar nomes menores é se o programador original acha mais fácil trabalhar com eles. Presumivelmente, eles têm o direito de descobrir que esse é o caso e o direito de não ter as mesmas preferências pessoais que você possui. Pessoalmente, eu encontraria ...
... se eu os estivesse usando em cálculos longos e complexos. Quanto menor a expressão matemática, geralmente é mais fácil ver a coisa toda de uma só vez. Embora esse fosse o caso, eles poderiam ser melhores como dIn e dOut, portanto não havia um D repetitivo que pudesse levar a um erro de digitação fácil.
Por outro lado, se você achar que é mais difícil trabalhar com isso, se nocauteie e renomeie para a forma mais longa. Especialmente se você for responsável por esse código.
fonte
d
é húngaro? Eu pensei que era cálculo como emdx^2/dx = 2x
.dDinnerAperture
por si só, eu o leria como "Dinner Aperture" e me perguntaria se é apenas uma maneira engraçada de dizer "sua boca". Nunca fui fã do estilo "letra maiúscula seguida de letra minúscula). Às vezes, muito confuso."Geralmente, acredito que a regra para isso deve ser o uso de nomes de variáveis extremamente curtos, onde você sabe que as pessoas "especializadas na arte" do seu código específico entenderão imediatamente a referência desse nome de variável. (Você sempre tem comentários para a exceção deste caso) e que o uso localizado das variáveis pode ser facilmente discernido com base no contexto de como elas são usadas.
Para expandir isso, significa que você não deve se esforçar para ofuscar seus nomes de variáveis, mas pode usar abreviações para seus nomes de variáveis, onde sabe que apenas as pessoas que entendem o conceito subjacente do seu código provavelmente para ler de qualquer maneira.
Para usar um exemplo do mundo real, recentemente, eu estava criando uma classe Javascript com latitude e informando a quantidade de luz solar que você esperaria em uma determinada data.
Para criar esta classe Sundial , me referi talvez meia dúzia de recursos, a Astronomia Almanac, e trechos de outras línguas, (PHP, Java, C etc).
Em quase todas elas, usavam abreviações idênticas semelhantes, que, à primeira vista, não significam nada absoluto.
K
,T
,EPS
,deltaPsi
,eot
,LM
,RA
No entanto, se você tem conhecimento de física, pode entender o que eram. Eu não esperaria que mais alguém tomasse esse código. Por que usar nomes de variáveis detalhados?
julianTime
,nutationOfEclipticalLongitudeExpressedInDegrees
,equationOfTime
,longitudeMean
,rightAscension
.Além disso, na maioria das vezes, quando os nomes de variáveis são transitórios, ou seja, eles são usados apenas para alocar temporariamente algum valor, frequentemente não faz sentido usar uma versão detalhada, especialmente quando o contexto da variável explica seu objetivo.
fonte
Absolutamente existe; Muitas vezes, basta um nome curto de variável.
No meu caso, estou navegando no waypoint na minha turma de robótica sênior e programamos nossos robôs no KISS-C. Precisamos de variáveis para coordenadas de corrente e destino (x, y), distâncias (x, y), títulos de corrente e destino, bem como ângulos de viragem.
Especialmente no caso das coordenadas xey, um nome de variável longo é completamente desnecessário, e nomes como xC (x atual), yD (destino y) e pD (destino phi) são suficientes e são os mais fáceis de entender nesse caso.
Você pode argumentar que esses não são 'nomes de variáveis descritivos' como o protocolo do programador ditaria, mas como os nomes são baseados em um código simples (d = destino, c = atual), um comentário muito simples no início é toda a descrição eles exigem.
fonte
Geralmente, algoritmos complexos são implementados no matlab (ou linguagem similar). O que eu vi são pessoas apenas assumindo o nome das variáveis. Dessa forma, é simples comparar implementações.
Todas as outras respostas estão quase corretas. Essas abreviações podem ser encontradas em matemática e física, exceto que elas não começam
d
(como no seu exemplo). As variáveis que começam com d geralmente são nomeadas para representar diferenciação .Todos os guias de codificação normais estão dizendo para não nomear variáveis com a primeira letra representando o tipo (como no seu caso), porque é muito fácil procurar o código em todos os IDEs modernos.
fonte
Eu posso pensar em uma razão para nomes de variáveis serem razoavelmente curtos.
Os nomes abreviados são fáceis de ler usando um período de visão mais curto, daí um período curto de atenção.
Por exemplo, quando me acostumo ao fato de que svdb significa "salvar no banco de dados", a taxa de varredura do código-fonte aumenta, pois só preciso varrer rapidamente 4 caracteres em vez de ler SaveToDatabase (14 caracteres, as coisas pioram) para nomes de operações mais complexos). Eu digo "varredura" e não "leitura", porque isso leva uma grande parte da análise do código fonte.
Ao digitalizar uma grande quantidade de código-fonte, isso pode proporcionar bons ganhos de desempenho.
Além disso, apenas ajuda o programador preguiçoso a digitar esses nomes abreviados ao escrever código.
Obviamente, espera-se que todos esses "atalhos" sejam listados em algum local padrão no código-fonte.
fonte
Para enquadrar o que o @zxcdw disse de uma maneira um pouco diferente e elaborar em termos de abordagem:
As funções devem ser puras , breves e um encapsulamento perfeito de algumas funcionalidades: lógica da caixa preta , independentemente de permanecer intocada por 40 anos, continuará a fazer o trabalho para o qual foi projetada, devido à sua interface (entrada e saída) é bom, mesmo que você não saiba nada sobre o seu interior.
Este é o tipo de código que você deseja escrever: este é o código que dura e é simples de portar.
Onde necessário, componha funções a partir de outras chamadas de função (em linha) , para manter o código refinado.
Agora, com um nome de função adequadamente descritivo (detalhado, se necessário!), Minimizamos qualquer chance de interpretação incorreta desses nomes de variáveis abreviados, pois o escopo é muito pequeno.
fonte
Os nomes de variáveis devem ser o mais descritivos possível para ajudar a legibilidade do programa. Você mesmo experimentou: teve muitos problemas para identificar o que o programa fez devido à má nomeação.
Não há uma boa razão para não usar o nome descritivo. Isso ajudará você e todos os outros que trabalham / irão trabalhar no projeto. Bem, na verdade, existe um único uso válido para nomes abreviados: contadores de loop.
fonte
int dummy_variable_for_for_loops;
é o mais descritivo possível.Certamente é para isso que servem os comentários?
Se as atribuições tiverem comentários descritivos, você obtém o melhor dos dois mundos: uma descrição da variável e de quaisquer equações são facilmente comparáveis às de seus colegas de livros didáticos.
fonte
Para interfaces (por exemplo, assinaturas de método, assinaturas de função), costumo resolver isso anotando as declarações de parâmetro. Para C / C ++, isso decora o arquivo .h, bem como o código da implementação.
Eu faço o mesmo para declarações de variáveis em que o conhecimento do uso da variável não é óbvio no contexto e na nomeação. (Isso se aplica a idiomas que não possuem digitação forte também.)
Há muitas coisas que não queremos entupir o nome da variável. É o ângulo em radianos ou graus, existe alguma tolerância na precisão ou alcance, etc. As informações podem fornecer afirmações valiosas sobre características que devem ser tratadas corretamente.
Eu não sou religioso sobre isso. Estou simplesmente interessado na clareza e em garantir que agora seja o que é da próxima vez que o eu esquecido visitar o código. E quem olha por cima do meu ombro tem o que precisa saber para ver onde algo está errado, o que é essencial (o último crítico para a manutenção adequada).
fonte
Primeiro: Nomear uma variável para energia e ao calcular fórmulas como E = MC2 NÃO é nomeação excessivamente curta. Usar símbolos como argumento para nomes abreviados não é válido
Esta pergunta foi bastante interessante para mim, e só consigo pensar em uma desculpa e isso é dinheiro.
Digamos, por exemplo, que você esteja conectando o javascript para um cliente que sabe que o arquivo deve ser baixado muitos vezes por segundo. Seria mais barato e melhoraria a experiência dos usuários se o arquivo (em número de bytes) fosse o menor possível.
(Apenas para manter o exemplo "realista", você não tinha permissão para usar uma ferramenta minificadora, por quê? Problemas de segurança, nenhuma ferramenta externa pode tocar na base de código.)
fonte
Percebo que as outras respostas não mencionam o uso da notação húngara. Isso é ortogonal ao longo debate, mas relevante para os esquemas de nomeação em geral.
O "d" no início de todas essas variáveis deve indicar que elas são duplas; mas o idioma está aplicando isso de qualquer maneira. Apesar da discrepância desses nomes, eles são até 50% redundantes !
Se vamos usar uma convenção de nomenclatura para reduzir erros, é muito melhor codificar informações que não estão sendo verificadas pelo idioma. Por exemplo, nenhum idioma reclamará
dK + dR
no código acima, mesmo que não faça sentido adicionar um número sem dimensão a um comprimento.Uma boa maneira de evitar esses erros é usar tipos mais fortes; no entanto, se vamos usar duplos, um esquema de nomeação mais apropriado pode ser:
O idioma ainda nos permitirá escrever
K + lR
, mas agora os nomes nos dão uma dica de que isso pode estar incorreto.Essa é a diferença entre sistemas húngaro (geralmente ruim) e aplicativos húngaro (possivelmente bom)
http://en.wikipedia.org/wiki/Hungarian_notation
fonte
K + lR
se você declarar corretamente suas unidades. Com unidades SI, ele pode fazer verificações de dimensionalidade e conversão de unidades. A adição não3_feet + 2_meter
deve ser problema, enquanto2_meter+1_second
deve ser um erro em tempo de compilação.O único caso em que nomes de variáveis ilegivelmente curtos são aceitáveis na engenharia de software moderna é quando eles existem em um script e a taxa de transferência desse script (geralmente em uma rede) é importante. Mesmo assim, mantenha o script com nomes longos no controle de origem e reduza o script em produção.
fonte
radius
quando armazena o raio interno sem entender que é muito mais ambíguo do queRin
). E então o desenvolvedor não especialista precisa traduzir entre sua nomenclatura única e a nomenclatura que a empresa entende toda vez que há uma discussão envolvendo equações.