Skip to content

Money Toolbox

Não é possível desenvolver um negócio sem ter que lidar com dinheiro. Em ultima analise “negócio” significa “fazer dinheiro”, certo? Algumas empresas têm dinheiro como o principal produto (também conhecidas por “Bancos”), onde é ainda mais importante controlá-lo corretamente.

Dinheiro é – de forma simplificada – uma quantidade de moeda. Este é o gancho que precisamos do dinheiro para o integrar na toolbox de Quantidade e Medida. O dinheiro é uma medida da quantidade de moeda.

O padrão Money

Toda a gente sabe que doubles e floats não são suficientes quando queremos lidar com dinheiro. A plataforma java  padrão oferece a possibilidade de usar BigDecimal como objeto para representar um valor monetário, mas existe uma solução mais simples e fortemente tipada. O padrão de projeto Money (Dinheiro) é uma bem conhecida solução deste problema.

Então, começamos por considerar que o dinheiro é uma quantidade finitamente divisível. Não é possível representar um 1 / 3 com o dinheiro. Simplesmente não é. Além disso existe uma quantidade mínima que não divisível. Esta quantidade pode ser a centésima parte, a décima parte , ou a unidade em si e para cada moeda diferentes quantidades são a unidade indivisível.  Por exemplo, para o Real, o Euro e o Dolar a unidade indivisível é a centésima parte da moeda. Isso significa que para estas moedas não podemos pagar ou receber menos que um centavo.
Isto nos mostra que, se considerarmos a unidade indivisível de cada moeda,  todas as operações com dinheiro são operações sobre números inteiros. Isto simplifica bastante os cálculos já que não são necessários arredondamentos. e como todas as operações com dinheiro são operações sobre inteiros  podemos usar um long para armazenar o valor.

Dado um montante em uma certa moeda, temos que o multiplicar por uma potência de 10 de forma a obter a quantidade de centavos. Quando o montante é solicitado, nós dividiremos pelo mesmo fator antes de retornar. Muito simples, já que são multiplicações e divisões por múltiplos de 10 (é só mexer a virgula). Depois armazenaremos os centavos e faremos contas com centavos.

Usar um long de centavos é muitos esperto mas necessitamos multiplicar por um fator que é uma potencia de dez. Mas qual potencia ? Para o dolar a menor unidade é 1 cêntimo ( a centésima parte de 1 dolar), logo precisamos multiplicar por 100 = 10 2 . O mesmo pode ser usado para euro e real, mas e para o yen ? Ora, o interessante é que o yen não tem parte decimal. A menor unidade é realmente 1 yen. O nosso factor seria então 1 ( 10 elevado a zero)

Sim, nem todas as moedas têm o mesmo número de dígitos fracionários. Alguns têm nenhum, e alguns têm mais do que dois. Na plataforma Java padrão usamos getDefaultFractionDigits() da java.util.Currency para descobrir a fração dígitos para cada moeda.

Moeda

Moeda não é a unidade de quantias em dinheiro de forma semelhante em que o metro é a unidade de comprimento. Trata-se de uma unidade. Existem, de facto, várias unidades de comprimento como existem várias moedas. A principal diferença é que, para unidades físicas  existem unidades que são mais usadas que as outras unidades. O Sistema Internacional de Pesos e Medidas (SI) utiliza metros, e qualquer um usando o SI utiliza a mesma unidade. Para dinheiro isto não é possível, não existe uma moeda padrão. Primeiro porque cada país adopta a sua própria moeda, e segundo porque o comércio com todos os outros países (que precisam de converter valores entre as diferentes moedas ) estabelece o valor relativo da cada uma em relação à outra. Este valor de unidade relativa da moeda é bem diferente do valor de unidade absoluta do metro ou do segundo.

A conversão não é, em essência, diferente da conversão de comprimento unitário (digamos metros para milha), mas, na prática, as moedas não têm taxas de conversão fixas e constantes. Converter dinheiro de uma moeda para a outra é uma operação instantânea; ou seja, apenas naquele momento da conversão os montantes das suas moedas representam o mesmo valor para a quantidade. Após a conversão isso não é mais verdade.

Informações atualizadas sobre as taxas de conversão é um trunfo, de tal forma que muitas empresas vendem acesso a esta informação (hoje maioritariamente sobre serviços web). Então, uma outra operação na base da Money Toolbox é a conversão cambial, ou seja, converter dinheiro com um montante expresso em uma moeda, para um montante expresso em outra moeda.

No plataforma Java padrão usamos getDefaultFractionDigits() da  class java.util.Currency para descobrir a fração dígitos para cada moeda, mas para o MiddleHeaven  a Currency é uma unidade. Como podemos lidar com isso? O MiddleHeaven resolve este problema fornecendo Currency  como uma classe abstrata. Desta forma podemos implementar nossas próprias moedas. Algumas aplicações (especialmente relacionadas com finanças), podem criar diferentes conjuntos de propriedades para estes “objetos moeda”, mas para o caso comum o MiddleHeaven prevê a implementação ISOCurrency que é, de facto, baseada na classe java.util.Currency. Ambas se baseiam no padrão ISO para código de moedas. Este é um dos pontos em que o seguimento de padrões globais como o ISO se fazem importantes.

Moedas são ainda relacionados com países, culturas , tratados  e convenções (como o euro) que mudam ao longo da história. Um país pode ter mais que uma moeda oficial e pode ter mais que uma moeda ao longo dos anos. Então, todos esses detalhes para movimentação de moedas está vinculado ao acompanhamento de todas estas mudanças e possibilidades.

É neste ponto que a Money Toolbox toca com a Global : Culture Toolbox já que “dinheiro” é uma coisa inerentemente cultural.

Modelo

A classe Money representa montantes de dinheiro em uma certa moeda e permite operações aritméticas. Algumas operações são especiais, como a divisão, e não há uma operação para multiplicar money por money (não há dinheiro quadrado).Você pode, no entanto, multiplicar-la por qualquer número real. Money é uma  uma Amount , um Amount é um Quantity que pode executar operações grupo (adição e subtração) Currency é o mensurável. ISOCurrency é a implementação padrão para Currency

O MoneyConverter é uma interface simples para a conversão entre as moedas  e é utilizado em conjunto com MoneyConverterService. Nós vamos cobrir estes serviços mais tarde, e vamos voltar a esta panóplia de exemplos.

Uso

Este exemplo demonstra uma unidade de ensaio que realiza operações com o dinheiro. Uma moeda precisa ser especificado e como padrão podemos especificá-lo por meio do código ISO da moeda.

01
02 Money a = Money.money ( 100 , “USD” ) ;
03 Money b = Money.money ( 230 , “USD” ) ;
04 Money t = Money.money ( 330 , “USD” ) ;
05
06 Money c = Money.money ( 330 , “EUR” ) ;
07
08 Money m = a.plus ( b ) ;
09
10 assertEquals ( t, m ) ;
11
12 // money are equal if both amount and currency are equal
13 assertFalse ( t.equals ( c )) ;
14
15 // can only add money of the same currency
16 // will throw IncompatibleUnitsException
17 t.plus ( c ) ;
18
19
20 // ‘EU’ is not an ISO code
21 // will throw IllegalArgumentException
22
23 Money.money ( 330 , “EU” ) ; // ‘EU’ is not an ISO code
24
25
26 // divide by a real
27 Real n = Real.valueOf ( 3 ) ;
28 Money y = t.over ( n ) ;
29 assertEquals ( Money.money ( 110 , “USD” ) , y ) ;
30
31




Código 1: Exemplo de utilização de Dinheiro

Deixe uma Resposta

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

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s

%d bloggers like this: