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;
}
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”.
[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]
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.
/**
* 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);
}
}
[quote=danieldestro]Nome da classe: [color=blue]Cobranca[/color][color=orange]WebService[/color][color=green]Delegate[/color][color=red]ServiceLocator[/color]