Devo reutilizar variáveis?
Eu sei que muitas práticas recomendadas dizem que você não deve fazê-lo, no entanto, mais tarde, quando um desenvolvedor diferente estiver depurando o código e tiver três variáveis parecidas e a única diferença é que elas são criadas em locais diferentes no código. confuso. O teste de unidade é um ótimo exemplo disso.
No entanto, eu não sei que as melhores práticas são na maioria das vezes contra ele. Por exemplo, eles dizem para não "substituir" os parâmetros do método.
As práticas recomendadas são contra a anulação das variáveis anteriores (no Java, há o Sonar que emite um aviso ao atribuir null
à variável, que você não precisa fazer isso para chamar o coletor de lixo desde o Java 6. Você nem sempre pode controlar quais avisos estão desativados; na maioria das vezes o padrão está ativado.)
fonte
Respostas:
Seu problema aparece apenas quando seus métodos são longos e estão executando várias tarefas em uma sequência. Isso torna o código mais difícil de entender (e, portanto, manter) por si só. Reutilizar variáveis adiciona, além disso, um elemento extra de risco, tornando o código ainda mais difícil de seguir e mais propenso a erros.
A melhor prática da IMO é usar métodos curtos o suficiente que façam apenas uma coisa, eliminando todo o problema.
fonte
result1 = foo(); result2 = foo(); Assert.AreEqual(result1, result2);
eu não estou vendo muitos lugares em que você precisaria reutilizar uma variável nesse caso.A reutilização variável de um método é um forte sinal de que você deve refatorar / dividi-lo.
Portanto, minha resposta seria que você não deveria reutilizá-los, porque, se o fizer, seria muito mais difícil refatorá-lo mais tarde.
fonte
Depende.
Algumas variáveis podem ser criadas exatamente com a finalidade de manter um determinado tipo de dados, que pode mudar durante a execução de uma função. Os códigos de retorno vêm à mente aqui, por exemplo:
O nome da variável deixa muito claro o que essa variável pretende armazenar. Eu acho que outros casos de uso como esse são possíveis, onde uma variável é conceitualmente um contêiner que é logicamente usado por diferentes instâncias de coisas muito semelhantes durante o curso de uma função.
No entanto, em geral, isso deve ser feito apenas em circunstâncias em que seja absolutamente claro para possíveis leitores do código. Em nenhum caso, exceto talvez otimização extrema sem considerar a legibilidade do código, uma variável deve ser reutilizada apenas porque o tipo se encaixa.
Tudo isso resulta basicamente de boas práticas em nomeação de variáveis. Os nomes devem falar por si. Se for difícil definir o objetivo exato de todas as reutilizações em um nome abreviado, é melhor usar apenas variáveis distintas.
fonte
A maior razão pela qual não reutilizo variáveis (especialmente em testes de unidade) é porque ela introduz um caminho de código desnecessário, difícil de testar e depurar. Um bom teste de unidade deve ser independente de outros testes e, quando você reutilizar a variável de nível de classe (instância) em um equipamento de teste de unidade, você deve garantir a afirmação de seu estado antes de cada teste. Um bom teste de unidade também isola os defeitos; portanto, em teoria, cada caso de teste (método) deve apenas afirmar 1 comportamento para o sistema em teste. Se seus métodos de teste são escritos assim, raramente há uma necessidade ou benefício em reutilizar uma variável no nível do método. Por fim, em idiomas que oferecem suporte a fechamentos e processamento assíncrono, é realmente difícil argumentar sobre o que diabos está acontecendo se você estiver reutilizando variáveis em um método.
fonte
Você deve usar variáveis diferentes. Se você está preocupado que seu colega fique confuso, dê-lhes nomes que cubram claramente seus papéis.
A reutilização de variáveis é uma provável fonte de confusão no futuro; melhor esclarecer agora.
Em alguns casos, o mesmo nome de variável pode ser reutilizado; por exemplo,
i
em um loop de contagem simples. Nesses casos, é claro que você deve garantir que as variáveis estejam em seu próprio escopo.EDIT: reutilizar variáveis às vezes é um sinal de que o princípio de responsabilidade única é violado. Verifique se a variável reutilizada é usada na mesma função. Se for, pode não ser reutilizado (embora ainda seja preferível ter duas variáveis diferentes, para restringir o escopo dessas variáveis). Se for usado em diferentes funções, você terá uma violação do SRP em suas mãos.
fonte
Há uma situação em que você pode reutilizar uma variável, independentemente dos ótimos conselhos dados por outras respostas: quando o seu compilador precisa de ajuda.
Em alguns casos, seu compilador pode não ser inteligente o suficiente para perceber que uma determinada variável alocada no registro não está mais sendo usada pela próxima parte do código. Portanto, ele não reutilizará esse registro livre teoricamente para as próximas variáveis, e o código gerado poderá ficar abaixo do ideal.
Observe que eu não conheço nenhum compilador mainstream atual que não consiga capturar essa situação corretamente; portanto, nunca faça isso, a menos que você saiba que seu compilador está gerando um código abaixo do ideal. Se você estiver compilando para sistemas embarcados especiais com compiladores personalizados, ainda poderá enfrentar esse problema.
fonte
Eu diria NÃO.
Pense neste cenário: seu programa travou e você precisa descobrir o que aconteceu inspecionando um dump principal ... você pode ver a diferença? ;-)
fonte
Não, você não está melhorando o código que a máquina está executando (... o código de montagem). Deixe reutilizar qualquer memória que o compilador use para a variável no compilador. Muitas vezes, será um registro e a reutilização não lhe trouxe nada. Concentre-se em tornar o código mais fácil de ler.
fonte
Depende. Em uma linguagem dinâmica, em que o tipo reside em valores e não em variáveis, se eu tivesse um argumento bem nomeado para uma função que, por exemplo, fosse uma string. Uma mudança no algoritmo significava que ele sempre era usado após ser interpretado como um número inteiro; então, como um primeiro rascunho, eu poderia fazer o equivalente a
escreva = int (escreva)
Mas eu acabaria procurando alterar o tipo enviado para a função e observando a alteração no tipo de parâmetro.
fonte
Primeiro, observe o seu ambiente de desenvolvimento. Se você tiver problemas para depurar porque possui cinco variáveis em escopos diferentes com nomes idênticos e o depurador não mostra qual dessas variáveis é a que você precisa, não use cinco variáveis com o mesmo nome. Há duas maneiras de conseguir isso: Use uma variável ou cinco nomes diferentes.
Seu depurador também pode dificultar a depuração de uma função com muitas variáveis. Se uma função com 20 variáveis for mais difícil de depurar do que uma com 16 variáveis, considere substituir 5 variáveis por uma. ("Pode considerar" não é o mesmo que "deveria sempre").
Não há problema em usar uma variável em vários locais, desde que a variável sempre tenha o mesmo objetivo. Por exemplo, se dez chamadas de função retornarem um código de erro, que é tratado imediatamente para cada chamada, use uma variável e não 10. Mas não use a mesma variável para coisas completamente diferentes. Como usar "nome" para o nome de um cliente e 10 linhas depois usando a mesma variável para o nome de uma empresa, isso é ruim e causará problemas. Pior ainda, use "customerName" para um nome de cliente e 10 linhas depois usando a mesma variável "customerName" para um nome de empresa.
Importante, nada é uma regra de ferro. Tudo tem vantagens e desvantagens. Se as "melhores práticas" sugerirem uma coisa e você tiver motivos para dizer que é uma má ideia em sua situação específica, não faça isso.
fonte
Primeiro, observe o seu ambiente de desenvolvimento. Se você tiver problemas para depurar porque possui cinco variáveis em escopos diferentes com nomes idênticos e o depurador não mostra qual dessas variáveis é a que você precisa, não use cinco variáveis com o mesmo nome. Há duas maneiras de conseguir isso: Use uma variável ou cinco nomes diferentes.
Seu depurador também pode dificultar a depuração de uma função com muitas variáveis. Se uma função com 20 variáveis for mais difícil de depurar do que uma com 16 variáveis, considere substituir 5 variáveis por uma. ("Pode considerar" não é o mesmo que "deveria sempre").
Não há problema em usar uma variável em vários locais, desde que a variável sempre tenha o mesmo objetivo. Por exemplo, se dez chamadas de função retornarem um código de erro, que é tratado imediatamente para cada chamada, use uma variável e não 10. Há um problema com isso: Geralmente, o compilador informará quando você usa uma variável não inicializada. Mas aqui, se você ler o código de erro após a chamada 6, mas a variável não tiver sido realmente alterada após a chamada 5, você obterá dados inúteis sem que o compilador o avise. Porque a variável foi inicializada, com dados que agora são inúteis.
Importante, nada é uma regra de ferro. Tudo tem vantagens e desvantagens. Se as "melhores práticas" sugerirem uma coisa e você tiver motivos para dizer que é uma má ideia em sua situação específica, não faça isso.
fonte
Use variáveis globais quando precisar manter um estado ou armazenar constantes. Reutilizando variáveis, você está reutilizando apenas o nome que aponta para um local na memória. Os nomes descritivos nas inicializações podem obter clareza (assumindo Java e sem TOC primitivo).
A menos que você goste de ofuscar o código manualmente ou irritar outros desenvolvedores.
fonte