Posts Tagged ‘desenvolvimento’

assertEquals para BigDecimal

October 22, 2008

Quando, desenvolvendo software, nos deparamos com alguma situação um tanto quanto bizarra, qual a primeira coisa a se fazer?
Sair correndo para perguntar naquele forum bacana certo? É uma alternativa.
Acho os foruns fantásticos, frequento bastante. São sem dúvida uma ótima fonte de estudo. Porém uma outra solução um pouco mais difícil, demorada, porém menos preguiçosa mais … digamos … nobre, seria perder alguns poucos minutos realizando uma pesquisa.

Hoje, desenvolvendo um “Pet Project” me deparei com uma situação dessas.
Veja o seguinte código:

import java.math.BigDecimal;

import org.junit.Test;
import static org.junit.Assert.*;

public class BigDecimalTest {

	private final BigDecimal n1 = new BigDecimal("13.23");
	private final BigDecimal n2 = new BigDecimal("13.27");

	@Test
	public void should_not_be_equals_using_junit_assert_method()
	{
		assertEquals(n1, n2);
	}

	@Test
	public void should_not_be_equals_using_BigDecimal_equals_method()
	{
		assertTrue(n1.equals(n2));
	}
}

Ambos deveriam falhar correto? Mas não foi o que aconteceu.
Inexplicavelmente o primeiro teste passou. Ficou verdinho! Isso mesmo.
Minha primeira idéia foi uma pesquisa rápida no google (ooohhh), mas não encontrei nada. Talvez não tenha procurado direito, é verdade. Achei mais interessante baixar o código fonte do JUnit e eis que encontro o seguinte trecho de código:

static public void assertEquals(Object expected, Object actual) {
	assertEquals(null, expected, actual);

}

static public void assertEquals(String message, Object expected, Object actual) {
	if (expected == null && actual == null)
		return;
	if (expected != null && isEquals(expected, actual))
		return;
	else if (expected instanceof String && actual instanceof String) {
		String cleanMessage= message == null ? "" : message;
		throw new ComparisonFailure(cleanMessage, (String)expected, (String)actual);
	}
	else
	        failNotEquals(message, expected, actual);
}

private static boolean isEquals(Object expected, Object actual) {
	if (expected instanceof Number && actual instanceof Number)
		return ((Number) expected).longValue() == ((Number) actual).longValue();
	return expected.equals(actual);
}

Veja que o metodo assertEquals delega para o método isEquals cujo faz um instanceOf verificando se os objetos sendo comparados são do tipo Number. Caso sejam, o metodo os transforma em long para depois compará-los.
Bingo. Com isso compara-se apenas a parte inteira do número, logo, aquele primeiro teste passou.

Meu próximo passo foi procurar na lista de bugs do JUnit se este já era um velho conhecido.
Para minha não surpresa lá estava o danado.

Esse problema foi encontrado na versão 4.3.1 do JUnit, que vem no eclipse europa, e já foi corrigido, veja o metodo isEqual da versão 4.5

private static boolean isEquals(Object expected, Object actual) {
	return expected.equals(actual);
}

Agora sim …

Por que eu ainda estava usando o eclipse europa?
Eu sei lá. Só sei que, foi bem mais divertido que postar a pergunta e ficar dando F5 no aguardo da resposta.

Curriculo (ou Um post de fúria)

August 21, 2008

Será que alguma empresa me contrataria se eu lhe apresentasse este currículo?

Objetivo profissional

  • Desenvolver software de forma simples, não burocrática, (até prazerosa, porque não?) entregando ao cliente o que ele realmente necessita – Software funcionando (jura!?)

Qualificações profissionais

  • Não sou especialista em toda e qualquer tecnologia de 3 ou 4 letras surgida desde mil novecentos e bolinha até o último hipe do momento. Ex: TCP/IP, HTTP, XML, XSD, XSTL, SOAP, JSON, POX, EBJ, JSP, JSTL, HTML, DHTML, DOM, CSS, UML, CVS, SVN, SQL, AJAX, BPM, ESB só para citar algumas. Mas conheço um pouco de cada.
  • Não tenho vergonha, medo, pavor nem calafrios em dizer “Não sei, mas posso estudar e lhe digo”.
  • Não sei mentir. Não, nem para aquele cliente mala que está exigindo da sua consultoria um mega-blaster, power, ultra profissional, que tenha 25 anos de experiência em todas as tecnologias do primeiro item acima e “entenda do negócio”, apenas para ficar “especificando o sistema” em Microsoft Word e Enterprise Architect.
  • Odeio trabalhar mais de 8 horas por dia todos os dias. Eventualmente, veja bem, EVENTUALMENTE pode acontecer.
  • Não acho que a melhor forma de avaliar quantitativamente e/ou qualitativamente o trabalho das pessoas seja através dos entediantes e inúteis Timeshets. (Atenção para a palavra em itálico. Você trabalha com pessoas. Repita comigo pes-so-as. Recursos são impressoras, computadores, aparelhos de fax, etc).
  • Discordo da visão na qual o analista de sistemas é o cara inteligente, que pensa em tudo e faz o trabalho intelectual de especificar, enquanto o operário programador não precisa pensar pois apenas tem de apertar os parafusos, ops codificar.
  • Não tenho a “ambição” de “subir de cargo” até virar gerente de projetos, assim como não tenho nada contra “programar para sempre”. (Isso não significa que eu não queira evoluir, paguá!)
  • Não acho que esses caras (famosos: 1, 2, 3, 4, 5, 6, 7, 8 & ainda não tão famosos: 9, 10, 11, 12, 13 …) são xiitas, prepotentes que se acham e inventam ou dizem um monte de coisas simplesmente para promoverem a si mesmos ou suas empresas e/ou vender seus livros pois “essas coisas só funcionam na teoria”. (Você pelo menos já tentou?)
  • Aprecio muito, muito mesmo, uma cervejinha com os amigos de vez em quando (isso, isso mesmo, tenho amigos fora da empresa sim).

O engraçado (se não fosse trágico) é que, grande parte dessas colocações são verdades para a maioria dos desenvolvedores. Quem não gostaria de trabalhar 8 horas por dia?Quem conhece a fundo todas as tecnologias? Quantos de nós odiariamos ser gerentes de projeto?
Do outro lado, o empregador não perderia em nada prestando atenção nesses pontos. Todos eles dizem respeito a qualidade de vida, trabalho bem feito, cliente satisfeito, dinheiro no bolso.
Então qual é o problema?
Só me resta concluir que a maioria das empresas gostam de ser enganadas. Dão valor aos mentirosos, aqueles que “manjam” tudo de tudo e tem orgasmos multiplos trabalhando 15 horas por dia.

O problema, como já disse, é que não sei mentir!