MeasureRuler: mudanças entre as edições
Criou página com 'O MeasureRuler é, pela própria tradução, uma régua de medidas. Essa régua de medidas tem a intenção de oferecer aos sistemas a facilidade para converter unidades de me...' |
|||
(6 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 6: | Linha 6: | ||
A classe MeasureRuler apresenta os métodos para conversão de forma estática. Para mais informações consulte o JavaDoc da classe. | A classe MeasureRuler apresenta os métodos para conversão de forma estática. Para mais informações consulte o JavaDoc da classe. | ||
= MeasureUnit = | = MeasureUnit = | ||
O MeasureRuler suporta várias dimensões de medidas | O MeasureRuler suporta várias dimensões de medidas. Cada dimensão pode conter várias unidades de medidas. A dimensão é definida pela enumeration '''MeasureDimension'''. Já as unidades de cada unidade de medida são definidas pela sua própria enumeration que estendem a interface '''MeasureUnit'''. Por exemplo: | ||
* '''Volume''' - VolumeUnit | * '''Volume''' - VolumeUnit | ||
* '''Comprimento''' - LengthUnit | * '''Comprimento''' - LengthUnit | ||
Linha 24: | Linha 19: | ||
== Interface MeasureUnit == | == Interface MeasureUnit == | ||
Cada dimensão tem suas unidades de medidas em enumerations diferentes. Assim, quando precisamos representar qualquer uma das unidades de medida utilizamos essa interface. Um exemplo: ao cadastrar um produto no sistema, a "unidade básica de estoque" dele pode ser tanto Unidades, quando Metros, Kilos, Metros Quadrados, etc.. Assim, a melhor maneira de definir este atributo é através desta interface. | |||
A interface MeasureUnit apresenta métodos como getDimension(), que retorna a enumeration de MeasureDimension para indicar que Dimensão de Medida esta Unidade pertence. | A interface '''MeasureUnit''' apresenta métodos como '''getDimension()''', que retorna a enumeration de '''MeasureDimension''' para indicar que Dimensão de Medida esta Unidade pertence. | ||
== Persistência da Interface MeasureUnit - MeasureUnitDAOConverter == | == Persistência da Interface MeasureUnit - MeasureUnitDAOConverter == | ||
Por tratar-se de uma enumeration, o padrão do FW é que no banco seja um campo do tipo varchar(50) (O limite recomendado de enums no BIS é de 50 chars). Mas uma vez que a MeasureUnit é uma interface, o BISDAO não sabe como proceder para persisti-la e reconstruir o VO com os dados do banco. Para isso temos de utilizar uma '''BISDAOConverter'''. E para simplificar o MeasureRuler já oferece uma implementação pronta para isso a '''MeasureUnitDAOConverter'''. | |||
Para definir um atributo no VO que seja do tipo '''MeasureUnit''' devemos ter algo como: | |||
{{java|Exemplos de | {{java|Exemplos de Declaração|<syntaxhighlight lang="java"> | ||
@BISDAOConverter(converterClass = MeasureUnitDAOConverter.class) | @BISDAOConverter(converterClass = MeasureUnitDAOConverter.class) | ||
Linha 44: | Linha 39: | ||
Sempre que o BISDAO lêr a String no banco de dados que representa a unidade de medida, o Converter conseguirá descobrir de qual enumeration devemos realizar o "valueOf(...)". | |||
Note que o método utilizado dentro do converter é o | Note que o método utilizado dentro do converter é o | ||
<pre>MeasureRuler.valueOf(...);</pre> | <pre>MeasureRuler.valueOf(...);</pre> | ||
, sempre que for necessário desserializar da String para uma das unidades de medida, esse método fará o trabalho. | |||
{{stop|Unidades de Medidas Iguais|Por conta de termos várias unidades de medidas de dimensões diferentes representadas em enumerations diferentes, o Java permitirá que tenhamos uma unidade de medida "X" tanto em '''VolumeUnit''' quanto em '''AreaUnit'''. Embora o Java não tenha problemas para compilar esse código, ao ser persistido no banco de dados (salvo apenas o NAME da enumeration), a recuperação do objeto é baseada apenas no nome da enumeration. Isso fará com que seja sempre retornada pela primeira enumeration que o código procura. | |||
Para evitar esse problemas as unidades de medidas devem '''sempre ter nomes diferentes mesmo que em dimensões distintas'''. Embora não conheça nenhuma unidade de medida que tenha o mesmo o nome e represente coisas diferentes, é bom que o DEV tenha ciência dessa situação. | |||
}} | |||
= Unidades de Medidas Personalizadas = | |||
O MeasureRuler permite que o usuário crie suas próprias unidades de medidas bastando apenas definir um nome e um símbolo. Em uma classe que estenda a interface '''MeasureUnit'''. Para que a unidade de medida se torne funcional será ainda necessário estabelecer uma régua de equivalências, explicado no tópico de utilização. | |||
{{nota|Persistência de Unidades de Medidas Personalizadas|Vale ressaltar que as unidades de medidas personalizadas não podem ser persistidas com o MeasureUnitDAOConverter. Esses objetos devem ser persistidos em atributos separados como um objeto do sistema, ou o desenvolvedor deve implementar seu próprio converter para o determinado atributo.}} | |||
= Estabelecendo Paridade de Conversão - MeasureRulerEquivalenceIntercade = | |||
Embora o MeasureRuler já seja capaz de converter unidades de medidas dentro da mesma dimensão, é possível estabelecer equivalências entre as unidades de medidas. Como, por exemplo, estabelecer que 1 unidade tem 50g, e depois disso pedir que a régua converta 1 Dúzia em Kilos. | |||
Essas paridades são definidas apenas implementando a interface '''MeasureRulerEquivalenceInterface'''. Nela há apenas um método que deve retornar uma '''Hash<MeasureUnit, BigDecimal>'''. A chave da hash é qualquer unidade de medida, e seu valor é um BigDecimal que estabelece o peso da unidade de medida. Exemplos: | |||
* '''1 Unidade = 50g = 30ml''' - Devemos ter os seguintes objetos na Hash: | |||
** hash.put(UnitUnit.UNIT, BigDecimal.ONE); | |||
** hash.put(WeightUnit.GRAM, new BigDecimal("50"); | |||
** hash.put(VolumeUnit.MILILITER, new BigDecimal("30"); | |||
{{stop|Informações Redundantes|Só devemos ter uma unidade de medida de cada dimensão. Incluir na Hash múltiplas informações da mesma dimensão é desnecessário, e podem resultar em resultados "aleatórios" se elas não forem coerentes. | |||
Exemplos: | |||
'''Incluir 1Kg, 1000g e 50Unidades''' - A hash aceitará a unidade de medida KILOGRAM e GRAM, mas a informação é redundante, mas não causará nenhum problema. | |||
'''Incluir 1Kg, 500g e 50Unidades''' - Informar que 1Kg é equivalente à 500g é uma informação incoerente. Ao procurar as equivalências para converter Unidades em Massa, o MeasureRuler pode hora utilizar a informação de 1Kg - 50 Unidades, hora utilizar 500g - 50Unidades. Dependendo da informação que encontrar primeiro na Hash o resultado será diferente. | |||
}} | }} | ||
Com esses três objetos estabelecemos a referência entre as dimensões Unidades, Massa e Volume. Podendo converter de Toneladas para Centimetros Cúbicos, por exemplo. Para estabelecer, uma referência com uma unidade de medida personalizada basta colocar na Hash a instância da unidade de media personalizada na Hash e estabelecer o seu peso em comparação as demais unidades presentes na Hash. | |||
= Utilização da Régua = | |||
Para realizar a conversão das unidades de medidas, utilizando ou não a régua de equivalências e/ou unidades de medidas pesonalizadas, devemos focar nos métodos '''.convertTo(...)''' da classe '''MeasureRuler'''. Há métodos simples utilizados para conversão dentro da mesma dimensão (sem utilização de equivalências) até métodos completos com a entrada de equivalências e definição da precisão de casas decimais. | |||
= Validação da MeasureRulerEquivalenceInterface = | |||
A classe '''MeasureRuller''' contém um método de validação para garantir que as informações da Hash de equivalências não estão redundantes ou incoerentes. |
Edição atual tal como às 14h53min de 23 de novembro de 2021
O MeasureRuler é, pela própria tradução, uma régua de medidas. Essa régua de medidas tem a intenção de oferecer aos sistemas a facilidade para converter unidades de medidas da mesma dimensão, ou mesmo entre dimensões diferentes quando estabelecida a regra de conversão.
Definições:
- Dimensão - tipo de medida utiliza, como "Comprimento", "Área", "Volume", "Massa (Peso)", etc. Embora estas hoje sejam as dimensões que o BIS suporta, nada impede de se criar dimensões mais complexas como "Energia", "Luminosidade", "Torque", e assim por diante.
- Unidade de Medida - Unidade de medida utilizada para medir a Dimensão desejada. Por exemplo, comprimento pode ser medido em "Metros", "Centimetros", "Pés", "Polegadas", etc. "Massa" pode ser medida em "Arrobas", "Kilos", "Pounds", etc.
A classe MeasureRuler apresenta os métodos para conversão de forma estática. Para mais informações consulte o JavaDoc da classe.
MeasureUnit
O MeasureRuler suporta várias dimensões de medidas. Cada dimensão pode conter várias unidades de medidas. A dimensão é definida pela enumeration MeasureDimension. Já as unidades de cada unidade de medida são definidas pela sua própria enumeration que estendem a interface MeasureUnit. Por exemplo:
- Volume - VolumeUnit
- Comprimento - LengthUnit
- Área - AreaUnit
- Massa (peso) - WeightUnit
- Unidades - UnitUnit
Interface MeasureUnit
Cada dimensão tem suas unidades de medidas em enumerations diferentes. Assim, quando precisamos representar qualquer uma das unidades de medida utilizamos essa interface. Um exemplo: ao cadastrar um produto no sistema, a "unidade básica de estoque" dele pode ser tanto Unidades, quando Metros, Kilos, Metros Quadrados, etc.. Assim, a melhor maneira de definir este atributo é através desta interface.
A interface MeasureUnit apresenta métodos como getDimension(), que retorna a enumeration de MeasureDimension para indicar que Dimensão de Medida esta Unidade pertence.
Persistência da Interface MeasureUnit - MeasureUnitDAOConverter
Por tratar-se de uma enumeration, o padrão do FW é que no banco seja um campo do tipo varchar(50) (O limite recomendado de enums no BIS é de 50 chars). Mas uma vez que a MeasureUnit é uma interface, o BISDAO não sabe como proceder para persisti-la e reconstruir o VO com os dados do banco. Para isso temos de utilizar uma BISDAOConverter. E para simplificar o MeasureRuler já oferece uma implementação pronta para isso a MeasureUnitDAOConverter.
Para definir um atributo no VO que seja do tipo MeasureUnit devemos ter algo como:
![]() |
Exemplos de Declaração
@BISDAOConverter(converterClass = MeasureUnitDAOConverter.class)
@BISMetaGenericField(caption = "Unidade de Medida", required = true)
private MeasureUnit measureUnit = null;
|
Sempre que o BISDAO lêr a String no banco de dados que representa a unidade de medida, o Converter conseguirá descobrir de qual enumeration devemos realizar o "valueOf(...)".
Note que o método utilizado dentro do converter é o
MeasureRuler.valueOf(...);
, sempre que for necessário desserializar da String para uma das unidades de medida, esse método fará o trabalho.
![]() |
|
Unidades de Medidas Personalizadas
O MeasureRuler permite que o usuário crie suas próprias unidades de medidas bastando apenas definir um nome e um símbolo. Em uma classe que estenda a interface MeasureUnit. Para que a unidade de medida se torne funcional será ainda necessário estabelecer uma régua de equivalências, explicado no tópico de utilização.
![]() |
|
Estabelecendo Paridade de Conversão - MeasureRulerEquivalenceIntercade
Embora o MeasureRuler já seja capaz de converter unidades de medidas dentro da mesma dimensão, é possível estabelecer equivalências entre as unidades de medidas. Como, por exemplo, estabelecer que 1 unidade tem 50g, e depois disso pedir que a régua converta 1 Dúzia em Kilos.
Essas paridades são definidas apenas implementando a interface MeasureRulerEquivalenceInterface. Nela há apenas um método que deve retornar uma Hash<MeasureUnit, BigDecimal>. A chave da hash é qualquer unidade de medida, e seu valor é um BigDecimal que estabelece o peso da unidade de medida. Exemplos:
- 1 Unidade = 50g = 30ml - Devemos ter os seguintes objetos na Hash:
- hash.put(UnitUnit.UNIT, BigDecimal.ONE);
- hash.put(WeightUnit.GRAM, new BigDecimal("50");
- hash.put(VolumeUnit.MILILITER, new BigDecimal("30");
![]() |
|
Com esses três objetos estabelecemos a referência entre as dimensões Unidades, Massa e Volume. Podendo converter de Toneladas para Centimetros Cúbicos, por exemplo. Para estabelecer, uma referência com uma unidade de medida personalizada basta colocar na Hash a instância da unidade de media personalizada na Hash e estabelecer o seu peso em comparação as demais unidades presentes na Hash.
Utilização da Régua
Para realizar a conversão das unidades de medidas, utilizando ou não a régua de equivalências e/ou unidades de medidas pesonalizadas, devemos focar nos métodos .convertTo(...) da classe MeasureRuler. Há métodos simples utilizados para conversão dentro da mesma dimensão (sem utilização de equivalências) até métodos completos com a entrada de equivalências e definição da precisão de casas decimais.
Validação da MeasureRulerEquivalenceInterface
A classe MeasureRuller contém um método de validação para garantir que as informações da Hash de equivalências não estão redundantes ou incoerentes.