EVGD: Códigos Toscos

[quote=kicolobo]Esta é outra clássica que já vi.

Em um sistema que estavamos desenvolvendo, uma programadora resolveu criar a interface gráfica de uma parte do sistema que, dependendo da ação do usuário, poderia ter consequências desastrosas, pois milhares de registros poderiam ser alterados (no caso, dizia respeito à exclusão de bancos de dados).

Pois bem: a programadora terminou o trabalho, veio toda contente para nós e, juntos, fomos apresentar o resultado para o cliente. O estado de confiança da “profissional” alastrou-se entre nós. Naquele momento, possuíamos CERTEZA de que tudo daria certo (claro, nem sequer haviamos olhado o resultado do trabalho, pois o tempo era nulo).

Então, estamos na frente do cliente, e segue o seguinte diálogo.

_ A ferramenta de exclusão de registros está pronta?
_ Sim, e ficou ótima. A performance ficou excelente.
(haviamos visto os testes unitários desta parte e, realmente, ela tinha razão. A performance era perfeita. E o código, era realmente muito bacana, mas voltemos ao diálogo)

_ Gostaria de ver como isto está no sistema.
_ Ok, vou lhe mostrar. Aqui está o botão. Clique nele para ver o que acontece.

(nossos corações pararam por um segundo ao ver o que surgiu na tela. Nós naquele momento só haviamos visto a camada de negócio. Não a interface gráfica que ela havia desenvolvida (mea culpa, mea culpa, mea culpa!))

Eis que surge na tela uma caixa de diálogo com o seguinte texto:
“Você está prestes a apagar todos os registros do projeto X. Deseja continuar?”
E um único botão: “Ok.”[/quote]

Ah, isso é fácil de corrigir na frente do cliente:

  • É só clicar no xizinho… :lol:

Colaboração de um amigo:

if(validateCodPessoa(document.forms['loginForm'].codPessoa) == false){ return false; }

Só faltou o

else return true;

hahahahaha

[quote=danieldestro]Colaboração de um amigo:

if(validateCodPessoa(document.forms['loginForm'].codPessoa) == false){ return false; }

Só faltou o

else return true;

hahahahaha[/quote]

Qual o problema? Há mais checagens abaixo? O código inteiro é só este if?

Nenhum problema, mas olha que mais simples:

return validateCodPessoa(document.forms['loginForm'].codPessoa);

[quote=danieldestro]Nenhum problema, mas olha que mais simples:

return validateCodPessoa(document.forms['loginForm'].codPessoa);

Por isso que perguntem se haviam mais checagens.

Se a pessoa quisesse colocar um alert lá para debugar, ou se quisesse implementar mais validações no futuro, aquele código estaria ótimo.

100% Pog ahauhaua… tem programdor que gosta de ver o código bem grande … Este vai ser um post eterno no guj ahauah.

[quote=danieldestro]Nenhum problema, mas olha que mais simples:

return validateCodPessoa(document.forms['loginForm'].codPessoa);

desta sua forma… ele retornaria true caso o validateCodPessoa retorna true… e como você mostrou no código dele não tem o “else return true”…

dava pra mudar pra algo assim

if(!validateCodPessoa(document.forms['loginForm'].codPessoa)){ return false; }

E essa gambiarra para pegar o codigo e incrementar + 1:

public Long buscarSequencial() throws Exception {
		Long retorno = new Long(0);
		String select = 
			"select" +
				" pro.sequencial" +
			" from" +
				" Protocolo as pro" +
			" order by" +
				" pro.atualizacao desc" +
			"";

		List lst = getHibernateTemplate().find(select);
		if (!lst.isEmpty()) {
			retorno = (Long) lst.get(0);
		}
       return retorno

Depois o cidadao coloca sequencial + 1 e da um monte de pau, olha que ta em Hibernate, usem sequence pelo amor de Deus.

Refatorado.

return  Long.valueOf(getSession().createSQLQuery(querySequence).uniqueResult().toString());

Em alguma ocasião de sua vida você já usou C? No tempo do Kernighan & Ritchie era possível usar:

i += 2;

ou

i =+ 2;

É desnecessário dizer que isso era um pouco ambíguo, e não conheço nenhum compilador (mesmo o MS C 3.0) que implemente a segunda forma, que está obsoleta há muitos anos.

Lindo:

[code]for( int i=0; i<lista.size(); i++ ) {
// … código

if( i < lista.size() ) {
// SEMPRE
} else {
// NUNCA
}
}[/code]

[quote=danieldestro]Lindo:

[code]for( int i=0; i<lista.size(); i++ ) {
// … código

if( i < lista.size() ) {
// SEMPRE
} else {
// NUNCA
}
}[/code][/quote]
Esse é um dos mais feios (é só pensar um pouco, caramba!!) e, mesmo assim, dos mais comuns. E erros não faltam: mais de 40 páginas e, com certeza, tem muito mais…

[quote=danieldestro]Lindo:

[code]for( int i=0; i<lista.size(); i++ ) {
// … código

if( i < lista.size() ) {
// SEMPRE
} else {
// NUNCA
}
}[/code][/quote]

Esse me lembra uns mais comuns, principalmente com jstl em jsps:

São do tipo

for (alguma coisa)
{
  if (condição que acontece somente uma vez, na primeira iteração)

  if (ou alguma outra condição, que se for falsa, não era nem pra ter entrado no laço)
}

E lá vai o servidor executando laços sem necessidade…

auhauhauhauhauha

Este virou um bom topico de POG

Programacao Orientada a Gambiarra …

huauhauhauhahu

sempre que fizer um codigo…vou consultar aqui para ver se tem como melhorar … ahuuahuhauha

Hard way:

[code]package pacote.muito.doido;

public class ParametrosPesquisaXyz {

private Long codTaxa_1 = 0L;
private Long codTaxa_2 = 0L;
private Long codTaxa_3 = 0L;
private Long codTaxa_4 = 0L;
private Long codTaxa_5 = 0L;
private Long codTaxa_6 = 0L;
private Long codTaxa_7 = 0L;
private Long codTaxa_8 = 0L;

public void setParametros(int idx, Long valor) {
        switch (idx) {
            case 1:
                codTaxa_1 = valor;
                break;
            case 2:
                codTaxa_2 = valor;
                break;
            case 3:
                codTaxa_3 = valor;
                break;
            case 4:
                codTaxa_4 = valor;
                break;
            case 5:
                codTaxa_5 = valor;
                break;
            case 6:
                codTaxa_6 = valor;
                break;
            case 7:
                codTaxa_7 = valor;
                break;
            case 8:
                codTaxa_8 = valor;
                break;
        }        
}

public Long getParametros(int idx) {
        switch (idx) {
            case 1:
                return codTaxa_1;
            case 2:
                return codTaxa_2;
            case 3:
                return codTaxa_3;
            case 4:
                return codTaxa_4;
            case 5:
                return codTaxa_5;
            case 6:
                return codTaxa_6;
            case 7:
                return codTaxa_7;
            case 8:
                return codTaxa_8;
            default:
                return 0L;
        }        
}

}[/code]

Introduzindo o conceito de ARRAY para o progamador desavisado:

[code]package pacote.muito.doido;

public class ParametrosPesquisaXyz {

private Long[] codTaxa = new Long[8];

public ParametrosPesquisaXyz() {
    for(int i=0; i<codTaxa.length; i++)
        codTaxa[i] = 0L;
}

public void setParametros(int idx, Long valor) {
    codTaxa[i-1] = valor;
}

public Long getParametros(int idx) {
    if( idx > codTaxa.length )
        return 0L;
    return codTaxa[i-1];
}

}[/code]

[code]/**

  • Método que retorna a primeira metade de uma lista de Objetos.
    */
    public List getPrimeiraMetade(List listaInicial) {
    List listaFinal = new ArrayList();
    int primeiraMetade = (int) Math.ceil(Double.valueOf(listaInicial.size()) / Double.valueOf(2));
    for (int i = 0; i < primeiraMetade; i++) {
    listaFinal.add(listaInicial.get(i));
    }
    return listaFinal;
    }

/**

  • Método que retorna a segunda metade de uma lista de Objetos.
    */
    public List getSegundaMetade(List listaInicial) {
    // implementacao aqui…
    return listaFinal;
    }[/code]

Que tal cortar a gambiarra e usar um único método que você passa um argumento para delimitar o subset da lista? Além do que, usar Generics facilita a vida.

[quote=danieldestro][code]/**

  • Método que retorna a primeira metade de uma lista de Objetos.
    */
    public List getPrimeiraMetade(List listaInicial) {
    List listaFinal = new ArrayList();
    int primeiraMetade = (int) Math.ceil(Double.valueOf(listaInicial.size()) / Double.valueOf(2));
    for (int i = 0; i < primeiraMetade; i++) {
    listaFinal.add(listaInicial.get(i));
    }
    return listaFinal;
    }

/**

  • Método que retorna a segunda metade de uma lista de Objetos.
    */
    public List getSegundaMetade(List listaInicial) {
    // implementacao aqui…
    return listaFinal;
    }[/code]

Que tal cortar a gambiarra e usar um único método que você passa um argumento para delimitar o subset da lista? Além do que, usar Generics facilita a vida.[/quote]

Que NOOBice!

[quote=danieldestro][code]/**

  • Método que retorna a primeira metade de uma lista de Objetos.
    */
    public List getPrimeiraMetade(List listaInicial) {
    List listaFinal = new ArrayList();
    int primeiraMetade = (int) Math.ceil(Double.valueOf(listaInicial.size()) / Double.valueOf(2));
    for (int i = 0; i < primeiraMetade; i++) {
    listaFinal.add(listaInicial.get(i));
    }
    return listaFinal;
    }

/**

  • Método que retorna a segunda metade de uma lista de Objetos.
    */
    public List getSegundaMetade(List listaInicial) {
    // implementacao aqui…
    return listaFinal;
    }[/code]

Que tal cortar a gambiarra e usar um único método que você passa um argumento para delimitar o subset da lista? Além do que, usar Generics facilita a vida.[/quote]
Cada dia melhor… :slight_smile:

Por isso fica a dica (extraída da assinatura de victorwss):

[color=darkred]Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.[/color] :shock:

Daniel,

huauhauhahu

onde vc acha tanto codigo tosco assim ??? auhauhhau

esse topico é mto bom para aprender como nao programar !!!

É segredo!

E se quiser viver deve mantê-lo muiiiiito em segredo! :smiley: :stuck_out_tongue: