Skip to content

Quantidades e Medidas

A toolbox de Quantidades e Medidas é conceitualmente simples, mas devido à sua natureza onipresente, a sua implementação é complexa. O objetivo é simples : prover um contrato comum para todas as quantidades de diferentes sub tipos matemáticos.  Porquê ? Porque aplicações reais lidam com quantidades todo o tempo. Dinheiro, datas, intervalos de tempo, períodos de tempo, comprimentos, pesos … Aplicações mais especializadas precisam trabalhar com entidades matemáticas como vetores e matrizes. Aplicações orientadas a engenharia precisam trabalhar com diferentes unidades e conversões.

Todas estas quantidades têm que ser expressas em várias unidades sempre respeitando necessidades de internacionalização/localização

A toolbox de quantidades e medidas é essencial ao MiddleHeaven já que provê muitos tipos básicos para quantidades, unidades e conversões. Para o MiddleHeaven é uma versão atualizada dos tipos em java.lang

Grandezas, Unidades e Mensuráveis

Quando medimos algo estamos comparando o “tamanho” de uma grandeza como o “tamanho” de referencia dessa mesma grandeza. Esta referencia é chamada Padrão e o “tamanho” é chamado Unidade. O “tamanho” do Padrão para uma grandeza define  a Unidade de medida. Portanto, uma medida é sempre a razão entre o “tamanho” do Padrão ( a unidade) e o “tamanho” da grandeza no objeto sob medida.

Nem todas as coisas que existem podem ser mensuráveis e nem todas as unidades tem o mesmo valor prático. O Sistema Internacional de Unidades (abreviado SI) compila as grandezes mensuráveis essenciais e respetivas unidades. Por exemplo, o segundo é a unidade de intervalo de tempo,  “tempo”  é a grandeza e “intervalo de tempo” é o mensurável ( não se pode medir o tempo, apenas intervalos de tempo, também chamados períodos); kelvin é a unidade de temperatura (termodinâmica) , temperatura é a grandeza  e intervalo de temperatura é o mensurável.

Por simplicidade o MiddleHeaven chama quantidade à associação da unidade com a razão da medida para essa unidade e mensurável à propriedade subjacente. Em inglês a palavra Quantity representa o que chamamos de Grandeza. Todas as implementações de quantidades implementam a interface Quantity que é tipada pelo mensurável. Quantity apenas define o método getUnit que é fortemente tipado para retornar uma unidade compatível com o mesmo mensurável da quantidade. Se a quantidade é , por exemplo,  de temperatura, a unidade também será de temperatura.

Quantidades podem ser somadas e multiplicadas, contudo algumas regras se aplicam. As operações feitas À parte numérica da quantidade também se aplicam à unidade.  Nenhumas duas quantidades podem ser somadas se tiver unidades diferentes. Por exemplo,  2m (metro) + 3m = 5m e 2m x 3m = 6m2 (metro quadrado). Repare que a unidade é a mesma, apenas a sua dimensão aumentou.

Modelo

A toolbox de Quantidades e Medidas tem um modelo de tipos bastante vasto. Seria confuso mostrar todos ao mesmo tempo, então, vamos separá-los em pedaços menores. Cada um destes pedaços diz respeito a um subtipo da quantidade:

  • Estruturas – para trabalhar com vetores, matrizes, aneis , campos e outros tipos de estruturas matemáticas.
  • Números – paara trabalhar com quantidades adimencionais (sem unidade) tais como numeros  inteiros, reais e complexos. Operações e relações são baseadas na estruturas matemáticas reais subjacentes.
  • Medidas – para trabalhar com medições, incluindo a sua incerteza. Permite operações com medições e propagação de incerteza.
  • Dinheiro – para trabalha com quantidades monetárias e moedas. Introduz a Moeda como um tipo de unidades especial e provê operações especificas para operar sobre dinheiro. Por  exemplo, dividir sem perda.
  • Tempo – para trabalhar com periodos, dias, datas , fins de semana calendarios e outras quantidades relacionadas a tempo. Também inclui objetos para os conceitos de relógio, fuso horário e efeméride.
  • Coordenadas – para trabalhar com coordenadas e sistemas coordenados de referencia. Inclui mecanismos para conversão entre coordenadas.
  • Utilidades – inclui alguns tipos de uso mais geral como Interval e Range que podem ser usados em diferentes contextos e são compativeis com os outros tipos da toolbox.

Um dos objetivos do MiddleHeaven é abarcar os melhores padrões de projeto comuns a muitas aplicações e prover implementações deles “out of the box”.  O padrão Money, traduzido pelo tipo Money é um destes exemplos. Normalmente é uma padrão simples de implementar, mas aqui, procurámos integrá-lo no mesmo contexto em que estão os periodos de tempo e matrizes. Desta maneira é possivel combinar as várias possibilidades. Quem sabe se uma matriz de money não é util a alguém por ai …

Por detrás dos panos

Todos os conceitos presentes na toolbox de Quantidades e Medidas podem-lhe ser familiares, sobre tudo se você tiver algum conhecimento no campo das ciencias – especialmente física- ou se você já se cruzou com projeto como o JScience ou a JSR 275. Alguns podem perguntar-se porque esta toolbox é tão semelhante ao JScience mas o MiddleHeave não é implementado em cima dela.  A resposta é uma escolha com dois gumes.  Primeiro a JScience é uma biblioteca para uso cientifico e baseado na especificação real-time da JVM. Isto significa que o objetivo é fazer cálculos depressa. Para isso a JScience usa double como o tipo principal. Isto não era suficiente para os objetivos do MiddleHeaven. Embora, velocidade seja importante, o MiddleHeaven é desenhado para aplicações gerais e real-time não é uma preocupação por agora.Outra opção era usar a JSR 275 que é basicamente o porte da JScience para a plataforma padrão. O problema aqui é o mesmo. A JSR 275 segue o mesmo modelo que a JScience usando double em vez de um objeto. Ambas têm um problema durante os calculos. Os objetos são tipados com as unidades, mas o programador sempre têm que inferir essas unidades. Isto viola, quando ao MiddleHeaven o objetivo de controle necessários quando se fazem calculos com unidades.  E este é o motivo principal para o não uso dessas API.

Mas nunca se sabe. Então, a toolbox de Quantidades e Medidas do  MiddleHeaven é baseada em factories de numeros (NumberFactory) de forma a prover uma implementação real para os tipos de dados, especialmente os tipos numéricos. O MiddleHeaven usa BigDecimal por padrão, mas isso pode facilmente ser alterado para usar Double ou qualquer outro objeto que se quiser. A JSR 275 não inclui este mecanismo de extensão que sempre propaga os calculos com unidades. Isto é importante.

É possivel, no entando , conceber o uso do JScience por baixo dos panos se a velocidade e a performance forem realmente importantes. E claro, que é sempre possivel contribuir para o MiddleHeaven com extensões deste tipo. Não apenas para os tipos numéricos para muitos outros pontos de extensão nas outras toolboxes.

Para aqueles com olho no java 1.7 e na  JSR 310 – Date and Time API podem estar pensando porquê o MiddleHeaven tem a sua propria api de tempo e datas.  Quando o MiddleHeavne começou a ser desenvolvido esta JSR não existia, apenas a tentativas como a Joda Time e a Time and Money existiam. Por outro lado esta toolbox de Quantidades e Medidas visa unificar todas as quantidades sob um só tipo: Quantity de forma a que todas as quantidades e unidades possam ser relacionadas e misturadas. Sendo o tempo uma quantidade muito importanto em sistemas de negocios (tal como o dinheiro) não era concebivel implementar a API sem suporte a operações sob o tempo, especialmente porque este suporte não existia na plataforma Java padrão.  Porque a JSR 310 não tem esta preocupação com a unificação das  quantidades nunca será diretamente compativel com o MiddleHeaven. Uma abstração em cima da JSR 310 será sempre necessária para poder que a sua funcionalidade possa ser utilizada pelo MiddleHeaven. Esta mesma lógica se aplica à JSR 275 que não se integra com a JSR 310 e vice-versa.O objetivo unificador da toolbox de Quantidades e Medidas é exatamente não ter estes hiatos de conceito com API diferentes, e provê as mesmas funcionalidades que estas duas API, mas de forma integrada, baseada num único supertipo comum: Quantidade. Se você usar o MiddleHeaven é possivel que nunca venha a sentir a presença da JSR 310 ou da JSR 275.

A escolha foi feita para criar interfaces simples, elegantes e práticas para manipular quantidades e todos os cálculos reais são delegados a classes que podem ser alteradas e implementadas para diferentes tipos de tecnologia subjacente. Esta API de “fachada” é muito semelhante às da JSR 310 e  JSR 275 e isto não é uma coincidencia já que o modelo de ambas é baseado nas mesmas fontes (JScience,  Joda Time e a Time and Money) polvilhadas com os mesmos conceitos cientificos subjacentes e vinculados aos mesmos padrões internacionais. O resultado está armadilhado para ser semelhante.

Se o MiddleHeaven é para ser usado no dia a dia, a sua sintaxe e os seus tipos têm que ser simples  e mnemonicos. O MiddleHeaven não é desenhado para suplantar API de terceiros mas para florescer sobre esse solo fertil. As JSR 310 e 275 são otimos exemplos disto. Antes do Java 7 o MiddleHeaven pode utilizar os calculos providos pelas classes padrão (java.util.Calendar) e quando o novo java sair, ele pode utilizar as novas classes. No futuro isto pode ser verdade para uma outra nova , imprevista, API que suplante a JSR 310. Tenha em mente que o MiddleHeaven é desenhado com o objetivo de resistir ao tempo de forma que as aplicações escritas com ele durem e não morram por motivos de alterações no clima tecnologico.

Uma implementação baseada no Joda Time  para a parte de tempos e datas também seria possivel, mas porque a JSR 310 está quase ai, nenhum esforço foi feito neste sentido.

Deixe um comentário

Deixar uma resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

WordPress.com Logo

Está a comentar usando a sua conta WordPress.com Log Out / Modificar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Log Out / Modificar )

Facebook photo

Está a comentar usando a sua conta Facebook Log Out / Modificar )

Google+ photo

Está a comentar usando a sua conta Google+ Log Out / Modificar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.

%d bloggers like this: