EVGD: Códigos Toscos

Garantido que os parametros nunca se repetirão:


for(ResultadosIndicadores resultado : resultados)
        	{
        		StringBuilder sqlQuery = new StringBuilder();
				sqlQuery.append( ""  )
				.append(" update                     ")
				.append(" tabela ")
				.append(" set atingido = ?,          ")
				.append(" comentario_indicador = ?,  ")
				.append(" user= ?,           ")
				.append(" resultado = ?    ")
				.append(" where                      ")
				.append("  id = ?          ")
				.append(" and mes = ?                ");
				
				PreparedStatement pstmt = con.prepareStatement(sqlQuery.toString());
                   }
....

E alem do mais a cada iteração ele cria novamente um StringBuilder e um PreparedStatement
Era so chamar a cada iteracao pstmt.clearParameters();



			StringBuilder sqlQuery = new StringBuilder();
			sqlQuery.append( ""  )
			.append(" update                     ")
			.append(" tabela ")
			.append(" set atingido = ?,          ")
			.append(" comentario= ?,  ")
			.append(" user  = ?,           ")
			.append(" resultado= ?    ")
			.append(" where                      ")
			.append("  id = ?          ")
			.append(" and mes = ?                ");
			PreparedStatement pstmt = con.prepareStatement(sqlQuery.toString());

                         for(ResultadosIndicadores resultado : resultados)
        	        {  pstmt.clearParameters(); ...  }

Eu achava que não existia um tipo de coisa assim, mas na empresa pra qual eu presto serviço é possivel!

if ( 1 == 1)
{
//Favor não retirar este if
}

[quote=DaviPiala]Eu achava que não existia um tipo de coisa assim, mas na empresa pra qual eu presto serviço é possivel!

if ( 1 == 1) { //Favor não retirar este if } [/quote]

O que acontece se você retirar o if?

Haha sei lah!

Os caras tavam pensando pq que o individuo fez isso, ninguem se arriscou a tirar!

Vai ver o cara devia estar com algum problema em produção, fazendo algum debug e olhando a log.

[quote=DaviPiala]Eu achava que não existia um tipo de coisa assim, mas na empresa pra qual eu presto serviço é possivel!

if ( 1 == 1) { //Favor não retirar este if } [/quote]

Isso existe por aqui às vezes também… Mas geralmente o comentário é melhor, do tipo: “Por enquanto deixa assim, precisamos definir melhor…”.

Para mim parece ser algo relacionada ao cúmulo da preguiça. O camarada sabe que o certo é que aquele bloco de código somente seja executado quando uma dada condiçào for verdadeira. O problema é que por enquanto o cara não sabe que condição é essa. Logo, ele já deixa o if ali, “no jeito”. Quando ele descobrir o que falta lá, é só “preencher”. Afinal, provavelmente eles escreve classes gigantescas, com métodos de centenas de linhas e, caso não deixe o if pronto ali, vai ser um problema lembrar onde o mesmo deveria ser colocado depois… :stuck_out_tongue:

[quote=thegoergen][quote=DaviPiala]Eu achava que não existia um tipo de coisa assim, mas na empresa pra qual eu presto serviço é possivel!

if ( 1 == 1) { //Favor não retirar este if } [/quote]

Isso existe por aqui às vezes também… Mas geralmente o comentário é melhor, do tipo: “Por enquanto deixa assim, precisamos definir melhor…”.[/quote]

Aqui também tem algo muito parecido do tipo

if ( 1 != 1)//Retirado por ordem de bla bla bla fica assim até segunda ordem.
{

}

Achei uma aqui que È SHOOOOOW alguém me diga que que o programador tinha na cabeça?

 Exception e = null;
            if (rs.next()) {
                do {
                        //Faz o que deve fazer quando tem resultado a query
                        //...
                    }
                } while (rs.next());

                if (teste qualquer com o resultado acima) {
                    e = new Exception("Erro");
                }
            }

            if (e != null) {
                throw e;
            }

HAUShaushuashua essa foi de mata =]

[quote=jingle]Achei uma aqui que È SHOOOOOW alguém me diga que que o programador tinha na cabeça?

 Exception e = null;
            if (rs.next()) {
                do {
                        //Faz o que deve fazer quando tem resultado a query
                        //...
                    }
                } while (rs.next());

                if (teste qualquer com o resultado acima) {
                    e = new Exception("Erro");
                }
            }

            if (e != null) {
                throw e;
            }

HAUShaushuashua essa foi de mata =][/quote]

O DO-WHILE é fácil de entender: O cara aprendeu a usar o DO-WILE e resolveu aplicar, daí ele pensou: Meu Deus! Mas eu preciso de algum valor inicial do ResultSet, já sei! Vou primeiro dar um if (rs.next)…".

huahauhaau

A Exception é algo inexplicável… huahauhau

[quote=DaviPiala]Eu achava que não existia um tipo de coisa assim, mas na empresa pra qual eu presto serviço é possivel!

if ( 1 == 1) { //Favor não retirar este if } [/quote]

Deve ser alguma simpatia… :lol:

eheh

Isso no Genexus é um if performático!
:twisted:

[quote=DaviPiala]Eu achava que não existia um tipo de coisa assim, mas na empresa pra qual eu presto serviço é possivel!

if ( 1 == 1) { //Favor não retirar este if } [/quote]

Cara já vi esse tipo de situação, um pouco diferente usando uma function

validarValor()
{
//Favor não retirar este if, pelo amor de Deus, acredite, hehe.
}

E por pior que pareça não pode ser removido.
A situação em que eu encontrei foi em um jsp, em um codigo javascript, tinha um certo reaproveitamento, onde esse método era invocado por um formulario filho, o que acontecia era que esse método era inutil dependendo do pai, mas teria que existir para não dar erro de javascript.

[quote=vanzella][quote=DaviPiala]Eu achava que não existia um tipo de coisa assim, mas na empresa pra qual eu presto serviço é possivel!

if ( 1 == 1) { //Favor não retirar este if } [/quote]

Cara já vi esse tipo de situação, e por pior que pareça não pode ser removido.
A situação em que eu encontrei foi em um jsp, em um codigo javascript, tinha um certo reaproveitamento, onde esse método era invocado por um formulario filho, o que acontecia era que esse método era inutil, mas teria que existir para não dar erro de javascript.
[/quote]

Isso também já aconteceu comigo.

O javascript é possuido por forças ocultas além da nossa imaginação. :lol:

Esse “if (1 == 1) { … }” equivale semanticamente a:
“{ … }” (e o compilador sabe muito bem que “1 == 1”; se não for o javac, que é extremamente burro (nem sei se ele faz corretamente constant folding ou eliminação de “if (false)”), pelo menos o just-in-time compiler do Java vai saber disso na hora de executar o programa.

Digamos que alguém declare alguma variável local dentro dessas chaves, ou então ela tenha um label. Nessas condições você não pode simplesmente remover o “if” E as chaves; mas você pode remover o if, ou seja, você poderia deixar como

{
// favor ...
}

Bom descompilando o codigo, o if não aparece, a não ser que tenha algo util na condição, então gurizada, liberou geral :smiley:

[quote=thingol]Esse “if (1 == 1) { … }” equivale semanticamente a:
“{ … }” (e o compilador sabe muito bem que “1 == 1”; se não for o javac, que é extremamente burro (nem sei se ele faz corretamente constant folding ou eliminação de “if (false)”), pelo menos o just-in-time compiler do Java vai saber disso na hora de executar o programa.

Digamos que alguém declare alguma variável local dentro dessas chaves, ou então ela tenha um label. Nessas condições você não pode simplesmente remover o “if” E as chaves; mas você pode remover o if, ou seja, você poderia deixar como

{ // favor ... } [/quote]

Que tal somente:

// favor ...

Essa é em pl/sql mas vale para ilustrar

Notem o exception
:smiley: :smiley: :smiley: :smiley:

[code]begin

– limpando registros anteriores
delete tm_gps
where cod_grupo = p_cod_grupo
and cod_empresa = p_cod_empresa
and data_ref_gps = v_data_fim;

  -- gravando os registros apurados para codigos diferentes de 2100
  open c_notas;
  fetch c_notas into v_notas;
  while c_notas %found loop

     if v_notas.cod_retencao_ret = '2100' then
        v_vlr_imposto  := v_vlr_imposto  + v_notas.vr_imposto;
        v_vlr_basecalc := v_vlr_basecalc + v_notas.basecalculo;

     else   
        if v_notas.vr_imposto > 29 then
              begin
              ...
              exception
                    when dup_val_on_index then
                          update tm_gps
                             set valor_inss_gps  = v_notas.vr_imposto,
                                 base_calc_gps   = v_notas.basecalculo,
                                 data_venc_gps   = v_data_venc,
                                 cod_cei         = v_notas.cod_cei
                           where cod_grupo       = v_notas.cod_grupo
                             and cod_empresa     = v_notas.cod_empresa
                             and cnpj_fornecedor = v_notas.cnpj_ret
                             and cod_retencao    = v_notas.cod_retencao_ret
                             and data_ref_gps    = v_data_fim;
                          commit;
              end;
        end if;
     end if;

     fetch c_notas into v_notas;
  end loop;
  close c_notas;

[/code]

[quote=Dark Optimus Prime]Essa é em pl/sql mas vale para ilustrar
Notem o exception [/quote]

Não entendi qual o problema!?!?!?!?

"Mióris" práticas:

private boolean validarCaracteresNumeroLogico(String numero) { String charValidos = "ABCDEFGHIJKLMNOPQRSTUVXZWY0123456789"; for (int i = 0; i < numero.length(); i++) { if (charValidos.indexOf(numero.substring(i, i + 1)) < 0) { return false; } } return true; }

Ai resolvi fazer um teste para averiguar o tempo de execução deste código e de maneiras mais eficazes de se fazer a mesma coisa. Olha que diferença faz você escrever bem um código:

[code]package teste;

public class Teste {

public static void main(String[] args) {

	Teste t = new Teste();
	String num = "";
	final int size = 1000;
	
	long t0 = System.currentTimeMillis();
	
	for(int i=0; i<size; i++) {
		num += i;
		t.validarCaracteresNumeroLogico(num);
	}
	
	long t1 = System.currentTimeMillis();
	
	num = "";
	for(int i=0; i><size; i++) {
		num += i;
		t.validarCaracteresNumeroLogico2(num);
	}
	
	long t2 = System.currentTimeMillis();
	
	num = "";
	for(int i=0; i><size; i++) {
		num += i;
		t.validarCaracteresNumeroLogico3(num);
	}
	
	long t3 = System.currentTimeMillis();

	System.out.println("T1: " + (t1-t0));
	System.out.println("T2: " + (t2-t1));
	System.out.println("T3: " + (t3-t2));

}

private boolean validarCaracteresNumeroLogico(String numero) {
	String charValidos = "ABCDEFGHIJKLMNOPQRSTUVXZWY0123456789";
	for (int i = 0; i >< numero.length(); i++) {
		if (charValidos.indexOf(numero.substring(i, i + 1)) < 0) {
			return false;
		}
	}
	return true;
}

private boolean validarCaracteresNumeroLogico2(String numero) {
	String charValidos = "ABCDEFGHIJKLMNOPQRSTUVXZWY0123456789";
	for (int i = 0; i < numero.length(); i++) {
		if (charValidos.indexOf(numero.charAt(i)) < 0) {
			return false;
		}
	}
	return true;
}

private boolean validarCaracteresNumeroLogico3(String numero) {
	return numero.matches("[A-Z0-9]+");
}

}[/code]

Resultado:

[quote]T1: 266
T2: 172
T3: 156[/quote]

Ou seja, a solução 3 rodou em quase metade do tempo da solução 1 (ruim). Só o fato de ter mudado um método na solução 2 ajudou a cair e muito o tempo de processamento com relação à solução 1.

Beleza, eu executei e tive esses resultados:
T1: 740
T2: 479
T3: 27191

Depois eu alterei a REGEX para ^\w+$, ou seja, do começo ao fim deve ser pelo menos 1 caracter alfa numérico, usando a flag de case insensitive

public static Pattern charValidos = Pattern.compile("^\w+$",Pattern.CASE_INSENSITIVE); (...) private boolean validarCaracteresNumeroLogico3(String numero) { return Pattern.compile("^\w+$",Pattern.CASE_INSENSITIVE).matcher(numero).matches(); } private boolean validarCaracteresNumeroLogico4(String numero) { return charValidos.matcher(numero).matches(); }

Resultado:
T1: 731
T2: 477
T3: 268 # sem cache do pattern
T4: 271 # com cache do pattern

Ou seja, a pesquisa por lista de caracteres é lenta, mas usar metacaracteres mais inteligente fica bem legal :slight_smile: