BrazilUtils API

Douglas, vendo uma discussão lá no RioJug, eu fiquei pensando numa idéia que o Phillip Shoes deu, que foi a do BackLog de tarefas, ao invés de ficar tentando “angariar” a simpatia de quem pode fazer isso ou aquilo.

Ah, veja se vc consegue aí pelo rio essa revista(revista do CDROM 130):
http://www.europanet.com.br/euro2003/index.php?cat_id=4
Ela contém dados de 5507 municípios num BD, pode nos ser muito útil…
Aqui não tô conseguindo!

IronLynx, há um tempo parei com o projeto e acho q acabei perdendo os fontes que eu tinha, qualquer coisa eu faço de novo, estava fazendo uma parte de matemática financeira, tu acha que foge do escopo do projeto ? Qq coisa me da outra parte que eu faço.

Eu não acho que fuja não.Eu vou discutir com o Douglas uma forma mais dinâmica de tocar isso, como o backlog de tarefas, e mando um email para o pessoal. :wink:

Fala Pessoal!!!Eu e o Douglas estamos pensando em por um release no ar(talvez semana que vem), e novas idéias serão sempre bem-vindas!!!
Um exemplo simplificado da parte de métricas:

[code]
import java.math.*;

public interface Area {
BigDecimal ACRE=new BigDecimal(0.4046856224);
BigDecimal HECTARE=new BigDecimal(10000);
BigDecimal ALQUEIRES_MINEIROS=new BigDecimal(48400);
BigDecimal ALQUEIRES_DO_NORTE=new BigDecimal(27225);
BigDecimal ALQUEIRES_PAULISTA=new BigDecimal(24200);
BigDecimal ARES=new BigDecimal(0.0247105);
BigDecimal BRACAS_QUADRADAS=new BigDecimal(3.052);
BigDecimal BRACAS_DE_SESMARIA=new BigDecimal(14520);
BigDecimal QUADRAS_QUADRADAS=new BigDecimal(17424);
}[/code]

[code]
import java.math.*;

public class Hectare extends BigDecimal implements Area {

private static final long serialVersionUID = 1L;


public Hectare(){
	super(0);
}

public Hectare(double value){	
  super(value);
}

public Hectare(String value) {
super(value);
}

public Hectare(BigDecimal value){
super(value.toString());
}

public Acre convertToAcres(){
  return new Acre(this.multiply(ACRE));

}

}[/code]

[code]
import java.math.*;
public class Acre extends BigDecimal implements Area{

	private static final long serialVersionUID = 1L;
	
	public Acre(){
		super(0);
	}
	
	public Acre(double value){
		super(value);
	}
	
	public Acre(String value) {
	    super(value);
	}
	
	public Acre(BigDecimal value) {
	    super(value.toString());
	}
		
	 private double value;
	
	public Hectare convertToHectares(){
	   	return new Hectare(this.multiply(HECTARE));
	}	

}[/code]

Para usar é só fazer algo do tipo:

Hectare h2=new Acre("12345.9").convertToHectares(); Hectare h=new Acre(123.0).convertToHectares(); Acre a=new Hectare(100).convertToAcres();
Uma dúvida: devo usar algum rounding mode, ou eu devo deixar que o usuário decida quando usar um?(Acho q devo esplicar isso no javadoc)

Ante de tudo, parabéns pela biblioteca…

Mas estou um pouco confuso com isso, suas medidas ali estão uma hora em m², outras não… pra falar a verdade, só vi acre e hectare hehehe.

Segundo a wikipedia, 1 hectare vale 2,4710538 acres internacionais, mas no seu código ele vai retornar o valor de new BigDecimal(0.4046856224) para:

Acre a=new Hectare(1).convertToAcres();

Ou eu estou enganado?

flw

Não está! :slight_smile:
Mas não se preocupe, eu ainda vou revisar no FDS todas as constantes, e a base será o M².(Menos quando houver a necessidade de milhas,KM…).
Para peso será o grama. :wink:

OBS.: O único problema é que uma medida em M² de Acres dá m em converter para BigDecimal: 4.046,856.422
Acho que vou tolerar algo como 4046.856 e aceitar uma perda.

Olhando bem, não ficaria legal…
Pensando bem, acho melhor deixar a relação que uma tem para outra(no caso 1 Ha=2,4710538 acres e dar uma opção de converter em Metros Quadrados não?

Não tem muito jeito não… vou ter que refinar as constantes mesmo(e os métodos), vai ficar um pouco grande, mas ficará beem mais claro:
HECTARE_TO_ACRES=2,4710538, HECTARES_TO_SQUARE_METERS=10000… e por aí vai.

Acho que poderia facilitar se a base for uma só pra cada tipo de unidade, como metros, metros quadrados, gramas, e por aí vai. E também, se sua interface obrigar a implementar um método que converta a unidade desejada para a unidade base, algo assim:

[code]public class Area {
public static final BigDecimal M2 = new BigDecimal(1);
public static final BigDecimal HECTARE = new BigDecimal(1);
public static final BigDecimal ACRE = new BigDecimal(“4046.856422”);
public static final BigDecimal UNIDADE_BASE = M2;

protected BigDecimal valor;
protected BigDecimal unidade;

public BigDecimal toBase() {
    return valor.divide(unidade);
}

public BigDecimal convert(BigDecimal unidade) {
return toBase().multiply(unidade);
}

}
[/code]

Chegando em casa, ou amanhã, penso um pouco mais sobre isso ehhehe, mas a minha idéia é por aí.

Flw

caraca que bom saber que o BrasilUtils nao esta parado, eu estava com umas ideias interessantes para integrar annotaton a ele, e algumas classses para manipulacao de datas.
Eu vou reler os posts desete topico pra ver quais sao as ideias e amanha de manha eu me cadastro…
flws!!!

Acho q tô + ou - entendendo, mas isso implica em chamar o método convert dentro do método que eu chamo para mudança de unidade não?Isso é BD(BigDecimal) e cada operação é lenta, duas multiplicações(ou duas divisões em sequência), podem acarretar custo(principalmente em números com dezenas de casas…), por isso eu tava falando do modo mais “rude” mesmo, tipo colocando uma constante (por ex. HECTARE_TO_ACRE) direto no método de conversão.Mas não sei se entendi direito, explique melhor.

Classe de manipulação de datas é sempre bom, mas quanto ao lance de anotações, isso é perigoso devido a necessidade de retrocompatibilidade com JDK´s inferiores ao Tiger(1.5.0).

Bom, é lento mas nem tanto assim, e tem como dar uma acelerada. Hoje fiz aqui umas classes que mostram mais ou menos minha idéia… veja o que você acha. Era uma idéia minha antiga, de fazer um conversor entre qualquer tipo de unidades para outra do mesmo tipo, mas que nunca tinha começado hehehe.

Dá pra fazer umas melhorias ainda, claro… na implementação eu levei em conta isso que vc disse de ter de fazer 2 operações pra converter pra outras unidades…

Falou :slight_smile:

[code]import java.math.BigDecimal;
import java.math.MathContext;

public class Area implements ValorComUnidade {
/* unidades pré-definidas de área */
public static final Unidade M2 = new Unidade(“m²”, new BigDecimal(1, MathContext.DECIMAL32));

public static final Unidade HECTARE = new Unidade("hectare", new BigDecimal(10000, MathContext.DECIMAL32));

public static final Unidade ACRE = new Unidade("acre", new BigDecimal("4046.856422", MathContext.DECIMAL32));

public static final Unidade UNIDADE_BASE = M2;

BigDecimal valor;

BigDecimal valorNaBase;

Unidade unidade;

public ValorComUnidade convertTo(Unidade unidade) {
	return new Area(valorNaBase.divide(unidade.getValorNaUnidadeBase(), MathContext.DECIMAL32), unidade);
}

public Unidade getUnidade() {
	return unidade;
}

public void setUnidade(Unidade unidade) {
	this.unidade = unidade;
	this.valor = valorNaBase.divide(unidade.getValorNaUnidadeBase(), MathContext.DECIMAL32);
}

public BigDecimal getValor() {
	return valor;
}

public void setValor(BigDecimal valor) {
	this.valor = valor;
	valorNaBase = valor.multiply(unidade.getValorNaUnidadeBase(), MathContext.DECIMAL32);
}

public Area(BigDecimal valor, Unidade unidade) {
	this.valorNaBase = valor.multiply(unidade.getValorNaUnidadeBase(), MathContext.DECIMAL32);
	this.valor = valor;
	this.unidade = unidade;
}

@Override
public String toString() {
	return "[valor=" + valor + ",unidade=" + unidade + ",valorNaBase=" + valorNaBase + "]";
}

public static void main(String[] args) {
	Area area1 = new Area(new BigDecimal(10000, MathContext.DECIMAL32), Area.M2);
	System.out.println(area1);
	System.out.println(area1.convertTo(Area.HECTARE));
	System.out.println(area1.convertTo(Area.ACRE));
}

}[/code]
Agora Saquei!(E gostei!Diga-se de passagem…)
Mas será que para o usuário toupeira(Eh, até nisso nós temos q pensar…) uma chamada a um método passando uma constante:
area1.convertTo(Area.ACRE) é mais claro que um
area1.convertToAcre()???
Cadê o nosso Scrachator-In-Chief(o CV) que não aparece no tópico?

Opa, que bom, hehehe

Bom, acho que é questão de costume mesmo… porque se não for assim, teríamos que ter um convertToxxx pra cada unidade de área, e vai saber quantas tem hehehe. Desse jeito acredito ser bem mais simples.

SIC? hehehe… vou dar um summon* nele usando MP

  • 6ª feira, louco pra chegar em casa e jogar FF X!!! hehehe

flw

[quote]SIC? hehehe… vou dar um summon* nele usando MP
[/quote]
O CV agora ganha 200mil euros anuais lá na Zooropa, não entra mais em tópico de pobre não… :lol:

Tb acho.Mas seria legal se o pessoal se manifestasse…
Bom, eu vou rever todas as constantes nesse fim de semana(tem várias fontes erradas, acho que vou adotar a Wikipedia, mas nem sempre é seguro…)

Vocês poderia tirar uma dúvida minha?

O BrazilUtils propõe ser uma biblioteca de rotinas de validação, ou seria também uma API que propõe uma arquitetura de validação?

Não temos a prepotência de propormos uma arquitetura de validação.Acho arriscado até.

Chequei as constantes de área:

[code]
import java.math.*;

public interface ConstantesDeArea{
//A base é Metros Quadrados
BigDecimal ACRE=new BigDecimal( 4046.8564224 );
BigDecimal ARES=new BigDecimal(100);
BigDecimal ALQUEIRES_MINEIROS=new BigDecimal(48400);
BigDecimal ALQUEIRES_DO_NORTE=new BigDecimal(27225);
BigDecimal ALQUEIRES_PAULISTA=new BigDecimal(24200);
BigDecimal BRACAS_QUADRADAS=new BigDecimal(3052);
BigDecimal BRACAS_DE_SESMARIA=new BigDecimal(14520);
BigDecimal CADEIAS_QUADRADAS= new BigDecimal(404.68564224);
BigDecimal HECTARE=new BigDecimal(10000);
BigDecimal JARDAS_QUADRADAS=new BigDecimal(0.83612736);
BigDecimal MILHA_QUADRADA=new BigDecimal(2589988.110336);
BigDecimal PES_QUADRADOS=new BigDecimal(0.09290304);
BigDecimal QUADRAS_QUADRADAS=new BigDecimal(17424);
BigDecimal QUILOMETRO_QUADRADO=new BigDecimal(1000000);
}[/code]
Parece Ok.Vou para as demais.
Ah, para os que querem se informar, eu tiro daqui as infos:
Pesos & Medidas:
http://www.ipem.sp.gov.br/#

http://www.inglesduvidas.com.br/pesosemedidas.asp
http://www.planetaeventos.com/turismo/pesos_e_medidas.htm //principalmente BR
http://www.chemkeys.com/bra/ag/uec_7/sidu_4/pemnb_7/pemnb_7.htm
http://www.publico.clix.pt/nos/livro_estilo/22-factores-c.html
http://www.dhl.com.br/publish/br/pt/tools/conversion.high.html //fatores de convers
http://www.guiadoscuriosos.com.br/index.php?cat_id=52755
http://www.metalica.com.br/pg_dinamica/bin/pg_dinamica.php?id_pag=43

bom, só uma coisa, recomendo usar, quando for número com casas decimais, o construtor com String, e em todos eles passando um MathContext, pois senão nas divisões pode gerar exceção aritmética quando o resultado não for exato (como 10 / 3). Isso aconteceu nos meus testes e resolvi usando o construtor assim:

new BigDecimal("4046.856422", MathContext.DECIMAL32)

flw

É eu sabia disso, até que na API tá claro:
When a MathContext object is supplied with a precision setting of 0 (for example, MathContext.UNLIMITED), arithmetic operations are exact, as are the arithmetic methods which take no MathContext object. (This is the only behavior that was supported in releases prior to 5.) As a corollary of computing the exact result, the rounding mode setting of a MathContext object with a precision setting of 0 is not used and thus irrelevant. In the case of divide, the exact quotient could have an infinitely long decimal expansion; for example, 1 divided by 3. If the quotient has a nonterminating decimal expansion and the operation is specified to return an exact result, an ArithmeticException is thrown. Otherwise, the exact result of the division is returned, as done for other operations.

Mas eu acho q devemos usar, quando o usuário for dividir, DECIMAL128, pois permite 34 casas.É melhor permitirmos com o máximo possível do que com os menores e deixar o usuário decidir.

Outra coisa, é que na Area:

Area area1 = new Area(new BigDecimal(10000, MathContext.DECIMAL32), Area.M2);

Será q isso seria tão claro quanto
Area=new Area(BD valor,Unidade unidadeAtual,Unidade unidadeParaConversao);
para o usuário?Sabe, para mim da forma que vc fez tah clara, mas devemos pensar na forma que fique mais “mole” para quem for utilizar.
O que vc acha?

Acho que desse jeito aí não faz muito sentido, você já passa a unidade que vai converter no construtor? Eu não entendi isso muito bem…