Boas práticas

Olá pessoal!

Tenho uma dúvida relacionada a bloco de comando.

No Delphi há necessidade de um bagin end somente se houver mais de uma ação. Ex.

If Condicao then 
Begin
Ação 1
Ação 2
end;

Caso seja somente uma ação ficaria somente assim:

If Condicao then 
Acao 1

Com java eu pecebi que é feito conforme a primeira opção mesmo quando há somente uma ação a ser executada:

If Condicao {
Acao 1
Acao 2
}
If Condicao {
Acao 1
}

É dessa forma mesmo, deve ser aberto um bloco ({) independente da quantidade de ações?

Obrigado.

até da p/ fazer sem abrir o bloco,

boolean abc = false; if (abc) System.out.println(abc);

EU não vejo isso como uma boa prática, então EU SEMPRE crio o “bloco” independente de quantas ações serão realizadas.

att,

Oi!

Isso é ponto de vista de cada um, uns dizem ser mais dificíl de entender o código as vezes quando não é usado o caracter “{” e “}” para delimitar um bloco.
Você pode ter vários if´s, for, while, tudo sem usar os delimitadores e obter o mesmo resultado e é ai que pode vir a confusão.

Talvez um simples if, como este:

if(condicao) System.out.println("Teste");

Ou um laço como este:

for(String value : lista) System.out.println(value");

Eu mesmo não coloco :slight_smile:
A regra é simples, o caracter “;” indica uma linha de comando, seja ela qual for, atribuição, invocação de método e etc.
Quando não é usado o caracter delimitador o compilador entende que será executado exclusivamente uma linha para a sua condição, sejam vários if´s, for, while e etc.

Atrapalhei ou ajudei? :slight_smile:
Abraços.

eu sou daqueles q se perde todo sem as chaves, e tb o eclipse já gera o “bloco” prontinho e acho q raras vezes tem apenas uma ação dentro do if ou do laço rsrs.

att,

É boa prática colocar as chaves sempre.

Se você optar por não colocar, vai ter que desabilitar essa verificação em quase todos programas que trabalham com “qualidade de código”.

Também prefiro colocar.

[quote=pedruhenrik]eu sou daqueles q se perde todo sem as chaves, e tb o eclipse já gera o “bloco” prontinho e acho q raras vezes tem apenas uma ação dentro do if ou do laço rsrs.

att,[/quote]

Entendo.
Um exemplo que pode confundir:

[code]public static void main(String[] args) throws ParseException {
List lista = new ArrayList();
lista.add(“valor1”);
lista.add(“valor2”);
lista.add(“valor3”);
lista.add(“valor4”);

	boolean teste = true;
	if(teste) 
		for(String value : lista)
			for(int i = 0; i < lista.size(); i++)
				if(!teste)
					System.out.println("Fim do laço!");
				else
					System.out.println(value);
	
	
}	[/code]

Isso é algo que eu também sou contra. Não é algo que "bate o olho" e já compreende.
Mas para apenas um if-else, laço, não vejo problemas.

Abraços!

[quote=charlesbraw]É boa prática colocar as chaves sempre.

Se você optar por não colocar, vai ter que desabilitar essa verificação em quase todos programas que trabalham com “qualidade de código”.

Também prefiro colocar.[/quote]

O Sonar é um deles :slight_smile:

segundo a convenção do Java pela Oracle, o correto seria isso, se não me engano:

[code]if (
1 > 0) {
acao();
}

for (
int i = 0;
i < 50;
i++) {
acao();
}[/code]

preguiça de procurar agora, mas provavelmente no site da Oracle você acha o artigo falando de todas as boas práticas “default” do Java

Com a experiência que tenho com Delphi meu parecer é o seguinte:

Só há necessidade de ser iniciar um bloco quando o mesmo for executar mais de uma ação:

Vejamos o exemplo do nel:

 boolean teste = true;  
        if(teste)   
            for(String value : lista)  
               for(int i = 0; i < lista.size(); i++)  
                if(!teste)  
                 System.out.println("Fim do laço!");  
                else  
             System.out.println(value);  

Nesse caso se não for aberto um bloco na primeira condição e if (teste) = false, o segundo é quem será executado e isso com certeza fica confuso de compreender o que está acontecendo.

Eu aconselho a usar as chaves. Como já disseram, é um boa prática.

só pra completar, seguem os links da convenção Java pela Oracle
Code Convention: http://www.oracle.com/technetwork/java/codeconvtoc-136057.html
Statements: http://www.oracle.com/technetwork/java/codeconventions-142311.html#449

sempre uso as chaves “{}” e sempre uso o ctrl+shift+F é bom pra acostumar…tem a Java code convention pra saber bem as boas praticas (:

Fiz um post sobre esse assunto. Onde me baseei no manual da Oracle de boas práticas.

http://www.flaviojmendes.com/blog/2012/02/09/boas-praticas-em-java-guia-definitivo/

[quote=rbcastro]Com a experiência que tenho com Delphi meu parecer é o seguinte:

Só há necessidade de ser iniciar um bloco quando o mesmo for executar mais de uma ação:

Vejamos o exemplo do nel:

 boolean teste = true;  
        if(teste)   
            for(String value : lista)  
               for(int i = 0; i < lista.size(); i++)  
                if(!teste)  
                 System.out.println("Fim do laço!");  
                else  
             System.out.println(value);  

Nesse caso se não for aberto um bloco na primeira condição e if (teste) = false, o segundo é quem será executado e isso com certeza fica confuso de compreender o que está acontecendo.[/quote]

Acontece que no Delphi a abertura de blocos é muito verbosa. Geralmente identa-se o begin-end e depois identa-se novamente o bloco de comandos. Isso de fato torna o código poluído. Mas no caso do Java e linguagens com sintaxe C-like, as chaves tornam o código mais leve, além de que pode-se abrir a chave na mesma linha do if ou for, sendo assim, não fica muito caro, em termos visuais, abrir um bloco de chaves mesmo para um comando só.

[quote=rbcastro]Com a experiência que tenho com Delphi meu parecer é o seguinte:

Só há necessidade de ser iniciar um bloco quando o mesmo for executar mais de uma ação:

Vejamos o exemplo do nel:

 boolean teste = true;  
        if(teste)   
            for(String value : lista)  
               for(int i = 0; i < lista.size(); i++)  
                if(!teste)  
                 System.out.println("Fim do laço!");  
                else  
             System.out.println(value);  

Nesse caso se não for aberto um bloco na primeira condição e if (teste) = false, o segundo é quem será executado e isso com certeza fica confuso de compreender o que está acontecendo.[/quote]

De acordo com as especificações da Sun/Oracle SEMPRE se deve abrir e fechar as chaves, independentemente de haver uma ou mais instruções dentro do bloco.