EVGD: Códigos Toscos

Lembrei de mais um clássico. Davamos manutenção num sistema feito em C, e descobrimos que algumas variáveis de controle, imprescindíveis para o funcionamento do sistema, eram globais.

Isso por sí só já mereceria um lugar nessa lista… porém, uma delas tem destaque de honra:
A variável se chamava i.

Exatamente. Qualquer código que fizesse um "for (i = 0; i < x; i++)" estaria corrompendo um valor de controle importante, e global…

Obviamente, alguns programadores (que vieram depois do inteligente que declarou esse global), tentavam fazer declarações de i em escopos locais, recebiam um warning (de variável eclipsada) e então removiam a declaração…

switch(i){ case 0: plano.setDescricao(visitas.get(i).getDataVisita() == null?"":DateUtil.format( visitas.get(i).getDataVisita(), "dd/MM/yyyy")); break; case 1: plano.setColuna1(visitas.get(i).getDataVisita() == null?"":DateUtil.format( visitas.get(i).getDataVisita(), "dd/MM/yyyy")); break; case 2: plano.setColuna2(visitas.get(i).getDataVisita() == null?"":DateUtil.format( visitas.get(i).getDataVisita(), "dd/MM/yyyy")); break; case 3: plano.setColuna3(visitas.get(i).getDataVisita() == null?"":DateUtil.format( visitas.get(i).getDataVisita(), "dd/MM/yyyy")); break; case 4: plano.setColuna4(visitas.get(i).getDataVisita() == null?"":DateUtil.format( visitas.get(i).getDataVisita(), "dd/MM/yyyy")); break; case 5: plano.setColuna5(visitas.get(i).getDataVisita() == null?"":DateUtil.format( visitas.get(i).getDataVisita(), "dd/MM/yyyy")); break; case 6: plano.setColuna6(visitas.get(i).getDataVisita() == null?"":DateUtil.format( visitas.get(i).getDataVisita(), "dd/MM/yyyy")); break; case 7: plano.setColuna7(visitas.get(i).getDataVisita() == null?"":DateUtil.format( visitas.get(i).getDataVisita(), "dd/MM/yyyy")); break; case 8: plano.setColuna8(visitas.get(i).getDataVisita() == null?"":DateUtil.format( visitas.get(i).getDataVisita(), "dd/MM/yyyy")); break; case 9: plano.setColuna9(visitas.get(i).getDataVisita() == null?"":DateUtil.format( visitas.get(i).getDataVisita(), "dd/MM/yyyy")); break; case 10: plano.setColuna10(visitas.get(i).getDataVisita() == null?"":DateUtil.format( visitas.get(i).getDataVisita(), "dd/MM/yyyy")); break; case 11: plano.setColuna11(visitas.get(i).getDataVisita() == null?"":DateUtil.format( visitas.get(i).getDataVisita(), "dd/MM/yyyy")); break; case 12: plano.setColuna12(visitas.get(i).getDataVisita() == null?"":DateUtil.format( visitas.get(i).getDataVisita(), "dd/MM/yyyy")); break; }

Vamos salvá-lo da manutenção tenebrosa:

String data = visitas.get(i).getDataVisita() == null?"":DateUtil.format( visitas.get(i).getDataVisita(), "dd/MM/yyyy"); switch(i){ case 0: plano.setDescricao(data); break; case 1: plano.setColuna1(data); break; case 2: plano.setColuna2(data); break; case 3: plano.setColuna3(data); break; case 4: plano.setColuna4(data); break; case 5: plano.setColuna5(data); break; case 6: plano.setColuna6(data); break; case 7: plano.setColuna7(data); break; case 8: plano.setColuna8(data); break; case 9: plano.setColuna9(data); break; case 10: plano.setColuna10(data); break; case 11: plano.setColuna11(data); break; case 12: plano.setColuna12(data); break; }

Ainda daria pra melhorar, mas já ajudou bastante.

Eu faria assim ainda:

String data = visitas.get(i).getDataVisita() == null?"":DateUtil.format( visitas.get(i).getDataVisita(), "dd/MM/yyyy");  

if (i == 0) {
    plano.setDescricao(data);
} else {
    BeanUtils.setProperty(plano, "coluna" + i, data);
}

[code]try {
// algum código que lança ValidacaoException
} catch (ValidacaoException e) {
ValidacaoException validacao = new ValidacaoException();
for (MensagemValidacao val : e.getMensagens()) {
validacao.add(val.getKey());
}

addActionError(validacao);

return INPUT;
}[/code]

Vou salvar a alma do incauto:

try { // algum código que lança ValidacaoException } catch (ValidacaoException e) { addActionError(e); return INPUT; }

Nota do usuário: o método “addActionError” tem uma sobrecarga que recebe um ValidacaoException e já faz o trabalho repetitivo.

// até tentei discutir, mas cliente quer por que quer bananas. public List selectBananas() throws SQLException

Eu tinha um colega que quando fazia um booble-sort com objetos do tipo Pessoa, colocava o nome da variável temporária de jesus. O motivo: “Apenas Jesus pode salvar as Pessoas”.

Enquanto isso, na classe utilitária do sistema:

[code]// guaranteed to hold execution of current thread for at least the specified number of milliseconds
public static void hold(int millis) {
int remainder = millis;
long start = System.currentTimeMillis();
do {
try {
Thread.sleep(Math.max(MIN_PAUSE_INTERVAL, remainder));
} catch (InterruptedException _) { }
remainder = millis - (int)(System.currentTimeMillis() - start);
} while (remainder > 0);
}

// return ‘true’ if the the specified number of milliseconds has elapsed
public static boolean sleep(int millis) {
long start = System.currentTimeMillis();
try {
Thread.sleep(Math.max(MIN_PAUSE_INTERVAL, millis));
}
catch (InterruptedException _) { }
return (millis <= (int)(System.currentTimeMillis() - start));
}

// wait until one of the following takes place:
// - the provided monitor is signalled
// - a spurios wakeup has occurred
// - the specified number of milliseconds has elapsed
// return ‘true’ if the the specified number of milliseconds has elapsed
public static boolean wait(Object monitor, int millis) {
int remainder = millis;
long start = System.currentTimeMillis();
synchronized (monitor) {
do {
try {
monitor.wait(Math.max(remainder, MIN_PAUSE_INTERVAL));
remainder = millis - (int)(System.currentTimeMillis() - start);
break;
} catch (InterruptedException e) {
remainder = millis - (int)(System.currentTimeMillis() - start);
}
} while (remainder > 0);
}
return (remainder <= 0);
}

// wait until one of the following takes place:
// - the provided callable monitor returns ‘true’ upon inquiry
// - the specified number of milliseconds has elapsed
// return the monitor’s response to the last inquiry
public static boolean wait(Callable monitor, int millis) throws IllegalStateException {
boolean result;
try {
result = monitor.call().booleanValue();
} catch (Exception e) {
throw new IllegalStateException(e);
}
if (!result) {
int remainder = millis;
long start = System.currentTimeMillis();
synchronized (monitor) {
do {
try {
monitor.wait(Math.max(remainder, MIN_PAUSE_INTERVAL));
try {
result = monitor.call().booleanValue();
} catch (Exception e) {
throw new IllegalStateException(e);
}
} catch (InterruptedException _) { }
remainder = millis - (int)(System.currentTimeMillis() - start);
} while (!result && remainder > 0);
}
}
return result;
}[/code]

Lindo!!!

Um dos “famosos” truques para apresentar a tela de “Aguarde, carregando…”, para impressionar o usuário com uma Splash Screen bonita. rsrsrs

Nome da classe: [color=blue]Cobranca[/color][color=orange]WebService[/color][color=green]Delegate[/color][color=red]ServiceLocator[/color]

Isso é o que eu chamo de multi-pattern!

O if…else que eu nem acreditei quando vi:

if ( num >= 10 ) { //codigo } else { if ( num < 10 ) { //codigo } else { //me diga quando o fluxo do programa entrará nesse else? ¬¬ } }

Olha, vou dizer que tem programador que tem o “dom” de fazer isso funcionar… hahahahaha

public boolean isEmpty() { return ((lista == null) && (lista.size() != 0)); }

Super-jeito-bom-de-tratar-exceção:

try { // algum código aqui } catch( ValidacaoException e ) { String erro = this.converterI18NMessageKeys(e); // converte as KEYS da exceção para mensagens i18n String msgNenhumRegistro = converterI18NMessageKey("msg.009")+"<br/>"; // pega mensagem i18n if ( erro.equals(msgNenhumRegistro) ) { // lançar erro de inconsistência da base de dados throw new AjaxException(converterI18NMessageKey("msg.0128.erro.base.inconsistente")); } }

“Super-bom” comparar as mensagens i18n da exceção para ver o “tipo” do erro, ainda mais com HTML incluso. Acho que neste caso um código ajudaria.

[quote=ozix] public boolean isEmpty() { return ((lista == null) && (lista.size() != 0)); }[/quote]

esse ai logo logo vai receber um belo de um NullPointerException

Oi,

Revirando a codificação da sun:

/** * Provides a hint as to whether or not newly created <code>JDialog</code>s * should have their Window decorations (such as borders, widgets to * close the window, title...) provided by the current look * and feel. If <code>defaultLookAndFeelDecorated</code> is true, * the current <code>LookAndFeel</code> supports providing window * decorations, and the current window manager supports undecorated * windows, then newly created <code>JDialog</code>s will have their * Window decorations provided by the current <code>LookAndFeel</code>. * Otherwise, newly created <code>JDialog</code>s will have their * Window decorations provided by the current window manager. * <p> * You can get the same effect on a single JDialog by doing the following: * <pre> * JDialog dialog = new JDialog(); * dialog.setUndecorated(true); * dialog.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG); * </pre> * * @param defaultLookAndFeelDecorated A hint as to whether or not current * look and feel should provide window decorations * @see javax.swing.LookAndFeel#getSupportsWindowDecorations * @since 1.4 */ public static void setDefaultLookAndFeelDecorated(boolean defaultLookAndFeelDecorated) { if (defaultLookAndFeelDecorated) { SwingUtilities.appContextPut(defaultLookAndFeelDecoratedKey, Boolean.TRUE); } else { SwingUtilities.appContextPut(defaultLookAndFeelDecoratedKey, Boolean.FALSE); } }

:twisted:

Tchauzin!

if(condicao){ //não faz nada }else{ //o código aqui }

ps:. tinha exatamente esse coment…“não faz nada”
acho q n conhecia o “!condicao”

não é código, mas continua tosco:

[quote=danieldestro]Nome da classe: [color=blue]Cobranca[/color][color=orange]WebService[/color][color=green]Delegate[/color][color=red]ServiceLocator[/color]

Isso é o que eu chamo de multi-pattern![/quote]

q nada é híbrido!

String yes_no = rs.getString("foo"); if (yes_no != null) { if ( yes_no.equals("Y") || yes_no.equals("YES") || yes_no.equals("Yes") || yes_no.equals("y") || yes_no.equals("yes") ) ret = true; }

[quote=André Fonseca]String yes_no = rs.getString("foo"); if (yes_no != null) { if ( yes_no.equals("Y") || yes_no.equals("YES") || yes_no.equals("Yes") || yes_no.equals("y") || yes_no.equals("yes") ) ret = true; } [/quote]

bacana ein!