EVGD: Códigos Toscos

Mais um EVGD (Então Você Gostaria De…), porém este trata de registrar as pérolas da tosquice da programação Java.

Compartilhem suas experiências conosco e vamos dar boas risadas e ver como não se programa.

Na verdade, o foco deste tópico é vermos algumas práticas não recomendadas, a fim de vermos como evitar erros comuns na programação.

while( true ) { publicacaoPorPeriodo = cursor.next(); if( publicacaoPorPeriodo == null ) { // é fim do cursor? break; } list.addPublicacao(publicacaoPorPeriodo); }

O que será que um cara pensa fazendo um código como o de cima?

Era bem melhor fazer:

while( (publicacaoPorPeriodo = cursor.next()) != null ) { list.addPublicacao(publicacaoPorPeriodo); }

Não é?

Olhem para este if()… hahaahahaahaha…

bean = new PublicacoesBean(); bean.setPublicacoes( list ); if( bean != null ) { //... }

Porque diabos colocar um return deste de um finally?

public int nomeDoMetodo() { try { // ... } catc( Exception e ) { //... trata } finally { filePost.releaseConnection(); return (status == HttpStatus.SC_OK); } }

Pérola nível 5: O cara simplesmente cria um novo array a cada iteração do ResultSet e copia a array antiga para a nova. Matem-no, por favor.

[code]// total de linhas retornadas
int totalLinhas = 0;

// leia as informações de cada distribuidor
while (rs.next()) {
// incremente o total de linhas
totalLinhas++;
// crie uma nova lista com novo tamanho
PublicacaoBean[] listaTemp = new PublicacaoBean[totalLinhas];
// copie os dados já armazenados para nova lista
if(totalLinhas > 1) {
System.arraycopy(listaPublicacoes,0,listaTemp,0,totalLinhas-1);
}
// atualize a lista original
listaPublicacoes = listaTemp;
//… mais código tosco aqui
}[/code]

Rapaz, dessa vez pegaram pesado mesmo com você né Daniel?

Que projetinho bizarro esse viu :stuck_out_tongue:

Alguém me explica o que a primeira linha faz alí?

totalPaginas = 1; totalPaginas = (int) Math.ceil( ((double)quantidade) / ((double)totalExibido) );

E esse código aqui…montando a grid na action…rsrs

[code] ClasseX classeX = new ClasseX ();
classeX .addColumn(“Tipo Réu”, “%dsTipo” );
classeX .addColumn(“Sequência”, “%cdSequencia” );
classeX .addColumn(“Documento”, “%cdDocumento” );
classeX .addColumn(“Nome”, “%dsNome” );
classeX .addColumn(“Período”, “%periodo” );
classeX .addColumn(“Advogado”, “%dsNomeAdvogado” );
classeX .addColumn(“OAB”, “%cdOABAdvogado” );
classeX .addColumn(“UF”, “%cdSiglaUFDocumentoAdvogado” );

classeX .setTitle(“Detalhes”);
classeX .setSubTitle(“Réu”);
classeX .setWindowHeight(“400”);
classeX .setWindowWidth(“500”);

TableGrid grid = new TableGrid();
GridText label;
GridText field;

grid.setTitle( new GridText(“Réu”, “ttltab1”) );
grid.setMultiSelection( true );
grid.setVisibleCheckBox( true, “ttltab2” );
grid.setVisibleError( false, “ttltab2” );
grid.setVisibleStatus( false, “ttltab2” );
grid.setVisibleStatus( true, “ttlTab2” );
grid.setMaxRecordsShown( 5 );
grid.setMaxPagesBlock( 5 );
grid.setPaginacao( true, “ttltab1”, ACAO_PAGINACAO );
grid.processPage( “0” );
grid.setImageGridPath( “/gcpj/imagens/” );
grid.setImagePath("/imagens/");

if(pIndTipoOperacao.equalsIgnoreCase(“A”)){

label = new GridText(“Nº Documento”, “ttlTab2”);
field = new GridText(“cdDocumento”, “txtTab1”);
grid.addColumn(new GridColumn(label, field, 140));

label = new GridText(“Nome”, “ttlTab2”);
field = new GridText(“dsNome”, “txtTab1”);
grid.addColumn( new GridColumn( label, field, 370, “”, “”,
“javascript:abrirPopUpDetalhes(’%cdCodigoReu’, ‘%cdCodigoGCC’, ‘%cdCodigoFilialGCC’, ‘%cdCodigoControleGCC’,
‘%cdIndicativoOrigemTabela’,’%dsTipo’, ‘%flagFunc’, ‘%cdEmpresaIncorporada’ )”));

label = new GridText(“Seq.”, “ttlTab2”);
field = new GridText(“cdSequencia”, “txtTab1”);
grid.addColumn( new GridColumn(label, field, 46));

} else {

label = new GridText(“Nº Documento”, “ttlTab2”);
field = new GridText(“cdDocumento”, “txtTab1”);
grid.addColumn(new GridColumn(label, field, 130));

label = new GridText(“Nome”, “ttlTab2”);
field = new GridText(“dsNome”, “txtTab1”);
grid.addColumn( new GridColumn( label, field, 340, “”, “”,
“javascript:abrirPopUpDetalhes(’%cdCodigoReu’, ‘%cdCodigoGCC’, ‘%cdCodigoFilialGCC’, ‘%cdCodigoControleGCC’,
‘%cdIndicativoOrigemTabela’, ‘%dsTipo’, ‘%flagFunc’, ‘%cdEmpresaIncorporada’ )”));

label = new GridText(“Período”, “ttlTab2”);
field = new GridText(“dataIni”, “txtTab1”);
grid.addColumn(new GridColumn(label, field, 30));

label = new GridText("", “ttlTab2”);
field = new GridText(“dataFim”, “txtTab1”);
grid.addColumn(new GridColumn(label, field, 30));

label = new GridText(“Tipo”, “ttlTab2”);
field = new GridText(“dsTipo”, “txtTab1”);
grid.addColumn(new GridColumn(label, field, 150));

label = new GridText(“Seq.”, “ttlTab2”);
field = new GridText(“cdSequencia”, “txtTab1”);
grid.addColumn(new GridColumn(label, field, 39));[/code]

:roll: :roll: :roll: :roll: :roll: :roll: :roll:

[quote=danieldestro]while( true ) { publicacaoPorPeriodo = cursor.next(); if( publicacaoPorPeriodo == null ) { // é fim do cursor? break; } list.addPublicacao(publicacaoPorPeriodo); }

O que será que um cara pensa fazendo um código como o de cima?

Era bem melhor fazer:

while( (publicacaoPorPeriodo = cursor.next()) != null ) { list.addPublicacao(publicacaoPorPeriodo); }

Não é?[/quote]

É, mas eu tive de participar de um projeto em que as regras do Checkstyle objetava contra atribuições dentro de expressões. Ou seja, tive de fazer algo muito parecido com o que o autor da digníssima expressão teve de fazer :frowning:

Um boa documentação é sempre necessária, mas isto…

/* finalize a query */ stmt1.close(); /* finalize a query */ stmt2.close(); /* finalize a query */ stmt3.close(); /* finalize a query */ stmt5.close(); /* finalize a query */ stmt6.close(); /* finalize a query */ stmt7.close(); /* finalize a query */ stmt8.close(); /* finalize a query */ stmt9.close();

E dale tosquice
    public Object[] transSAGT(String p_bit62) throws RemoteException {
        Object[] aoRetorno = new Object[3];
        String[] asPacote = (String[]) enviaMsg(p_bit62, "SAGT");
        String s = null;
        aoRetorno[0] = asPacote[0];
        ArrayList asDados = new ArrayList();
        if (aoRetorno[0].equals("011")) {
            String[][] as;
            String sTring1 = "";
            String sTring2 = "";
            int qtdeServicos = 0;

            for (int i = 1; i < asPacote.length; i++) {
                qtdeServicos = (asPacote[i].length() - 70) / 51;
                if (qtdeServicos > 0) {
                    as = new String[qtdeServicos][12];
                    for (int x = 70, z = 0; x <= asPacote[i].length() - 51; x += 51, z++) {
                        int j = 0;
                        int w = 0;
                        s = asPacote[i].substring(x, x + 51);
                        if ((s.trim()).equals(""))
                            break;
                        as[z][0] = asPacote[i].substring(j, (w = j + 6));
                        as[z][1] = asPacote[i].substring((j = w), (w = j + 2));
                        as[z][2] = asPacote[i].substring((j = w), (w = j + 4));
                        as[z][3] = asPacote[i].substring((j = w), (w = j + 3));
                        as[z][4] = asPacote[i].substring((j = w), (w = j + 55));
                        j = 0;
                        w = 0;
                        as[z][5] = s.substring((j = w), (w = w + 3));
                        as[z][6] = s.substring((j = w), (w = w + 3));
                        as[z][7] = s.substring((j = w), (w = w + 10));
                        as[z][8] = s.substring((j = w), (w = w + 10));
                        as[z][9] = s.substring((j = w), (w = w + 15));
                        as[z][10] = s.substring((j = w), (w = w + 8));
                        as[z][11] = s.substring((j = w), (w = w + 2));
                    }
                    asDados.add(as);
                }
            }
        }

        aoRetorno[1] = asDados;
        aoRetorno[2] = asPacote[asPacote.length - 1].substring(15, 55);

        return aoRetorno;
    }

E já que começamos errado, vamos terminar errado…

// 17/01/2005 - XYZ Technology // Faltou dar um close nos statements 4, 11, 12 e 13. // Obs.: O certo seria fechar os statements no finally, // mas como os autores da versão inicial fizeram tudo // assim, decidi manter. // O stmt10, também não estava sendo fechado, porém ela // deixou de ser utilizada graças a uma nova alteração na // especificação de 24/09/2004 que solicitou a sua exclusão // no processo. stmt4.close(); stmt11.close(); stmt12.close(); stmt13.close();

Nao sei se ja coloquei isso aqui, mas…

int a = Integer.parseInt("1");

Marcio Kuchma

Eu criei um post parecido com esse no JavaFree por causa de codigos muito “particulares” que vi em um projeto. No fim das contas, alguns problemas são mais pontuais e fáceis de resolver. Dificil é quando existem erros graves na arquitetura. Exemplo de codigo dentro de uma classe de negocio:

public Bah doSomething() {
	Bah result = Bah.DEFAULT;
	if (condition()) {
		try {
			result = bahHandler.getBah();
		} catch (BahException e) {
			
			if (!bahGui.showConfirmDialog(MessagesBah
					.getString("msg.bah"))) {
				throw new BahException();
			}
		}
	}
	return result;
}

E, Daniel, não me surpreenderia se vc dissesse que unit tests são artigo raro ou inexistente nesse tipo de projeto. :frowning:

valeuz…

Apesar de eu saber o que são Unit Tests, aqui eu diria: “Unit o quê???”

E outra pequena contribuição sobre como criar estruturas de dados, erhm… enfim:

public class Bah {

   private String name1;
   private Date date1;

   private String name2;
   private Date date2;

   private String name3;
   private Date date3;

   private String name4;
   private Date date4;

   private String name5;
   private Date date5;

   private String name6;
   private Date date6;

   ... // outros atributos.
}

valeuz…

[quote=kuchma]Nao sei se ja coloquei isso aqui, mas…

int a = Integer.parseInt("1");

Marcio Kuchma[/quote]

ahahahah, isso que eu chamo de ser precavido.

[code]int ano = …;

if(new Integer(ano).toString().lenght() != 4) {
// faça alguma coisa se o numero do ano nao tiver 4 digitos
}[/code]

Por que não:

if(ano < 1000 || ano > 9999) {
    // faça alguma coisa se o numero do ano nao tiver 4 digitos
}

???

essa eh pra quem conhece C++…

FEITO POR UM PROFESSOR SUBSTITUTO EM SALA DE AULA:

Como mostrar o endereço de um pointer:


int *a;

*a = 2;

 // Segundo a explicação o & mostra endereço
 // e o * o conteúdo, e ele queria mostrar o 
 // endereço do conteúdo... vai entender!?

printf("%d", &*a);

Cada um é cada um neh!?

public Exception sendMail() {
    try {
      // envia o email
    } catch(Exception e) {
       return e;
    }
    return null;
}

E então:

Exception e = sendMail(); if (e != null) { throw e; } else { // continua }