macario1983:
Bom dia
Estou aqui fazendo um exercício de um agenda, na verdade refazendo…
E ai veio uma duvida pois dei uma olhada sobre como melhorar a legibilidade do codigo e ter desempenho
E ai queria uma ideia de vocês…
Tenho esse codigo
public void mostrar() {
StringBuilder lista = new StringBuilder();
int contador = 1;
//int tam_Max = lista_Telefone.size();
for (String telefone : lista_Telefone) {
lista.append(contador + "=" + telefone).append(
(contador < lista_Telefone.size()) ? " --- " : " ");
contador++;
}
System.out.println(lista);
}
Em geral o uso de variáveis locais, como já foi dito, é irrelevante para a performance porque o compilador vai acabar removendo todas elas(fazendo inline).
Contudo ha exceções a esta regra e vc caiu nela. Não é correto utilizar variáveis para substituir campos de objetos. Isso significa deixar OOP e ir para programação procedural.
Mas já que o seu problema é legibilidade e performance existem outras coisas com que se preocupar no seu código.
esta linha
lista.append(contador + "=" + telefone)
Deveria ser :
lista.append(contador).append("=").append(telefone)
Deixa mais claro o que vc está fazendo e usa um builder só. Ah! sim, use StringBuilder e não StringBuffer.
Um StringBuilder/Buffer não é uma lista. Use um nome mais adequado.
Outro ponto é o uso de um contador com for extendido. Isto é sintoma de que não deveria estar usando o for extendido.
Este outro código faz o mesmo, com menos variáveis, e como não usa o operador ternário é simples de ler
public void mostrar() {
StringBuilder texto= new StringBuilder();
for (int contador = 1, Iterator<String> it = telefones.iterator() ; it.hasNext(); contador++) {
final String telefone = it.next();
texto.append(contador)
.append("=")
.append(it.next());
if (it.hasNext()){
texto.append(" --- ");
}
}
System.out.println(texto);
}
Agora é claro que vc quer colocar um separador entre os itens e é claro que vc está criando um texto. O contador está onde deveria, dentro do for e será descartado no final, assim com o iterator. É claro que poderíamos escrever direto para o out em vez do stringbuilder, mas não esse o ponto aqui.
Mais direto ao ponto, usamos uma variável para explicitar o que é it.next. É um telefone. Isso é boa prática. Veja que porque está definida dentro do for esta variável será descartada no final do for, então ela não pesa. E como é final o compilador fará o inline. É preciso lembrar aqui que cada vez que vc usa {} você está definindo um escopo. Variáveis criadas dentro do escopo são eliminadas no final.
Colocar o final ali ou não, não é uma questão de gosto, colocar o final indica que vc está preocupado com a semantica e não apenas com a lógica.É como se o final significasse “estou definindo um nome para isto, mas não muda a logica”. Muita gente acha que o final só serve para declarar constantes, mas constantes são sempre estáticas (final static é uma constante, final sozinho não). O final serve para declarar que o valor não será alterado, sim, mas também serve para declarar variáveis que só existem para dar nome às coisas. E os nomes são o que torna o código legível.
Moral da história:
- Use variáveis semanticas
- Use-as no escopo certo
- Atributos já são variáveis semânticas ( não precisa de usar outra variável semântica)
Só um adendo ao 3)
Imagine que tem o codigo
ItemPedido item = ...
final String nomeCliente = item.getPedido().getCliente().getNome();
É errado usar “nomeCliente” aqui ? Pela regra 3), a principio sim. Contudo aqui vc estaria cometendo um erro pior se não usasse.
É que a chamada encadeada (chamada telescópica é o nome técnico) é um erro de design. Então o programador é forçado a usar isso porque o designer não pensou direito nas coisas. Aí o programador usar um variável semântica para simplificar o código. Isto é um uso licito de variável semântica e a exceção à regra 3.