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.
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:
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)
Não está!
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.
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;
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…
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?
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
[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…)
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)
É 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?