O uso de variáveis ​​de uma letra é incentivado? [fechadas]

13

O uso de variáveis ​​de uma letra é incentivado em Java? Nos trechos de código ou nos tutoriais, você costuma vê-los. Não consigo imaginar usá-los, porque isso torna o código relativamente mais difícil de ler e nunca os vejo sendo usados ​​em outras linguagens de programação!

William Edwards
fonte
3
Sim e não. Depende completamente da situação.
Zavior 29/05
1
Nem sempre torna o código mais difícil de ler. Por exemplo, quando você está implementando código com base em equações matemáticas, geralmente faz sentido usar os mesmos nomes de variáveis ​​usados ​​nas equações. (Comentários ponto de volta ao papel / texto onde as equações originais são para ser encontrado, ou se você é como eu, às vezes você incluir o código LaTeX para eles.)
jamesqf

Respostas:

32

Nomear corretamente as coisas é difícil. Muito difícil. Se você olhar para o outro lado, você também pode entender que as coisas nomeadas corretamente são importantes. (Caso contrário, por que você gastaria o esforço para nomeá-lo?)

Mas, às vezes, os nomes das coisas simplesmente não são importantes. É por isso que temos coisas como funções anônimas ("lambdas"), por exemplo: porque às vezes simplesmente não vale a pena nomear coisas.

Existem muitos exemplos em que nomes de variáveis ​​com uma única letra (ou muito curtos) são apropriados:

  • i, j, k, lPara os índices de ansa
  • ke vpara a chave e o valor em um mapa
  • npara um número (por exemplo, em Math.abs(n))
  • a, b, cPara objectos arbitrários (por exemplo, em max(a, b))
  • epara o elemento em um for eachloop genérico
  • f para a função em uma função de ordem superior
  • p para a função de predicado em um filtro
  • T, T1, T2, ... para variáveis do tipo
  • E para variáveis ​​de tipo que representam o tipo de elemento de uma coleção
  • R para uma variável de tipo que representa o tipo de resultado de uma função
  • expara a exceção em uma catchcláusula
  • op para a operação em um mapa ou dobra
  • anexando a letra spara indicar o plural, ou seja, uma coleção (por exemplo, nspara uma coleção de números xse yspara duas coleções arbitrárias de objetos genéricos)

Eu nunca os vejo sendo usados ​​em outras linguagens de programação!

Eles são muito comuns em praticamente todas as linguagens que conheço (e provavelmente também nas que não conheço.) Haskell, F #, ML, Ruby, Python, Perl, PHP, C #, Java, Scala, Groovy, Boo, Nemerle, D, Go, C ++, C, o nome dele.

Jörg W Mittag
fonte
5
-1 O uso de nomes de variáveis ​​com 1 letra é uma programação lenta. Às vezes é bom ser preguiçoso, mas se você está recebendo até ke lnos índices de loop, que é muito longe (você não deve ter que muitos loops aninhados para começar; extraí-los para funções) . Pessoalmente, eu nunca usar mais de uma variável de 1-letra por função, mas eu atirar para 0.
BlueRaja - Danny Pflughoeft
Além disso, lou lené usado para um comprimento e arrpara uma matriz (por exemplo for(var i=0; l=arr.length; i<l; i++):). Além disso, fnpode ser usado em vez de fquando você se refere a uma função.
Ismael Miguel
4
@ BlueRaja-DannyPflughoeft Eu prefiro pensar nisso como uma programação eficiente. Jorg provavelmente poderia expandir quando letras únicas são apropriadas, não apenas onde, mas para ser sincero, imagino que a maioria dos programadores desenha a linha de maneira diferente. Quanto aos índices de loop, eu poderia argumentar que qualquer código em que os índices não precisem de nomes com valor semântico é simples o suficiente para justificar o aninhamento em vários níveis sobre extrações desnecessárias. Eles também podem ser usados ​​em loops separados para evitar possíveis problemas de escopo apresentados por Nelson .
Lilienthal
2
@ Lilienthal: O código deve ser eficiente para ler, não eficiente para escrever. Geralmente eles são a mesma coisa, mas nem sempre, como neste caso.
BlueRaja - Danny Pflughoeft
@ BlueRaja-DannyPflughoeft Não em todos os programas, não, mas não vejo nada de errado com as sugestões de Jorg. Como Killian colocou: "Qualquer coisa a mais não pode tornar a semântica mais óbvia, mas leva muito mais tempo para ler". Mas isso é provavelmente uma questão de preferência e estilo pessoais.
Lilienthal 31/05
20

Se o seu loop não fizer nada além de usar uma variável para contar

  for(int i = 0; i < 10; i++) {
     System.out.println("Stop it! I really mean it!!");
  }

então sim, esse é o melhor nome que você poderia usar. Qualquer coisa a mais não pode tornar a semântica mais óbvia, mas leva muito mais tempo para ler.

Se a variável for usada dentro do loop, um nome significativo poderá ser útil.

for(int door = 0; door < 3; door++) {
  int reward = gauge(door);
  if(reward > max) {
    max = reward;
    best = door;
  }
}

Se sua variável for usada em todo o método, seu nome deverá ser maior; se for usado em toda a classe, é melhor que seu nome seja totalmente auto-explicativo; caso contrário, certamente diminuirá a clareza do seu código.

Em resumo, quanto maior o escopo da variável, maior o seu nome.

Kilian Foth
fonte
Honestamente, cheguei ao ponto em que não usarei nomes de variáveis ​​de um caractere, ponto final. Eu tento usar nomes que explicitam o uso, mesmo para contadores. Normalmente, eu usaria uma variável chamada indexao iterar sobre uma matriz, por exemplo.
Michael
13
@ Michael: Na minha opinião, o Programming Jargon é seu próprio idioma, não é o inglês adequado. E nessa linguagem, ié uma palavra apropriada com um significado definido com precisão, a saber "índice com o qual você não precisa se preocupar muito". Mas acho que é uma questão de familiaridade. Se você ler um monte de Haskell, você vai se acostumar a ler mcomo mônada , fcomo functor , xcomo algum objeto , xscomo uma lista de xs e assim por diante.
Jörg W Mittag
2
Apenas uma ressalva realmente grande. Os nomes de variáveis ​​de letra única estão OK apenas se o idioma tiver um escopo de variável adequado. Você obviamente perguntará 'Qual idioma não possui escopo adequado?'. Bem, levei três horas para aprender que o JavaScript não define as variáveis ​​em um loop FOR. Experimente com um loop for dentro de um loop for usando o mesmo nome de variável. Isso vai explodir sua mente.
2929 Nelson
@ Nelson: Esta pergunta e esta resposta são sobre Java. Obviamente, idiomas diferentes podem ter considerações um pouco diferentes. (JavaScript não é a mesma linguagem como Java.)
ruach
Sou a favor de nomes de variáveis ​​de letra única sempre que fizerem mais sentido, mas não concordo que iseja "o melhor nome que você poderia usar" para um loop que usa uma variável apenas para contagem. Nesse caso, prefiro ver countusado como o nome da variável: instantaneamente compreensível. for (int count = 0; count < 10; count++)ou while (count--).
Todd Lehman
4

Lendo o código na resposta de Kilian, acho que "não há um loop e existe uma variável, e ele tem o tipo int, e tem um nome, e o nome é i, e é inicializado como 0,. .. " Eu apenas penso em "loop ...", onde os três pontos representam detalhes sem importância nos quais eu nem penso. Na minha mente de programador, essa variável realmente não existe, é apenas um artefato que eu tenho que digitar, como o for (;;) {} que a transforma em um loop.

Como essa variável nem sequer existe em minha mente, por que eu daria um nome além do que é absolutamente necessário?

gnasher729
fonte
Devo acrescentar que, nesse tipo de construção, muitas vezes sou tentado a usar nem mesmo i, mas _a variável obviamente sem sentido. Mas nem todo mundo está familiarizado com o Prolog, e provavelmente criaria mais atenção do que remove.
Kilian Foth
Você também precisa considerar como a variável é usada dentro do loop, não apenas no for (...)cabeçalho.
@KilianFoth: também é usado dessa maneira em Haskell, ML, F # e Scala, acredito. E no Ruby, mesmo sendo _um identificador legal como qualquer outro, houve uma mudança recente de que variáveis ​​locais não utilizadas nomeadas _(ou iniciadas com _) não geram um aviso de "variável local não utilizada", mesmo que Ruby normalmente as avise.
Jörg W Mittag
-1

Se você estiver se referindo às letras i, j, k como índices em um loop, essa é uma prática comum em Java e outras linguagens de programação. Embora provavelmente seja melhor usar um loop para cada estilo, como

for(User user: users) {
  doSomethingWithTheUser(user);
}

ao invés de

for(int i=0; i<users.size(); i++) {
  doSomethingWithTheUser(users.get(i));
}

Em Java, esse estilo de loop foi introduzido apenas recentemente. Pode ser por isso que você está percebendo mais isso em Java, pois o loop sobre os índices costumava ser a maneira mais comum de loop sobre um array ou lista.

Existem alguns outros casos em que letras simples podem ser apropriadas, como na implementação de uma função matemática, em que letras simples como n, x ou y já podem ser comuns. Mas, em geral, não, dê um nome significativo às suas variáveis.

usuario
fonte
5
"Em Java, esse estilo de loop foi introduzido apenas recentemente" ... como em, uma década atrás? ( Java 5 foi lançado em 2004 )
meriton 29/05
1
Sim, isso é bastante recente. Não, eu não sou velho. Cale-se. Crianças malditas saem do meu gramado. Ainda existem muitos aplicativos Java herdados do pré-Java 5. E ainda mais programadores de Java que aprenderam a linguagem no Java 1.4 e se recusam a atualizar como fazem as coisas. E ainda mais amostras de código on-line datam do início dos anos 2000 (sim, tínhamos a Internet naquela época; acabamos de chamá-la de Web 2.0).
Nick