MeasureRuler

De BIS Wiki
Revisão de 14h20min de 15 de outubro de 2020 por Rodrigogml (discussão | contribs) (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...')
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar

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.

Unidades Personalizadas

O MeasureRuler deve em breve ter um sistema para definição de unidades personalizadas e consequentemente uma regra para conversão. Por exemplo, deve ser possível criar uma unidade de medida batizada pelo usuário de "Bandeija", ou de "Palete" ou ainda "Jigawbaca" que podem representar X unidades, ou X Kilos conforme sua vontade. E a partir dessa definição o MeasureRuler ser capaz de realizar suas conversões.


MeasureUnit

O MeasureRuler suporta várias dimensões de medidas, e cada dimensão várias unidades de medidas. Cada Dimensão é definida pela enumeration MeasureDimension. Já as unidades de cada unidade de medida são definidas pela sua própria enumeration. Por exemplo:

  • Volume - VolumeUnit
  • Comprimento - LengthUnit
  • Área - AreaUnit
  • Massa (peso) - WeightUnit
  • Unidades - UnitUnit


Interface MeasureUnit

Note que uma vez que cada dimensão tem suas unidades de medidas em enumerations diferentes, quando precisamos de um atributo que possa representar qualquer uma das unidades de medida, mesmo que de dimensões diferentes não era possível a não ser criando um atributo do tipo Object ou Enum<?>. Para melhorar essa informação, todas as enumerações de unidades de medida implementam a interface MeasureUnit. Essa interface deve ser utilizada sempre que desejamos um atributo que represente mais de uma dimensão de medida. Por exemplo, ao cadastrar um produto no sistema, a "unidade básica de estoque" dele pode ser tanto Unidades, quando Metros, Kilos, Metros Quadrados, etc.

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

No fundo como trata-se de uma enumeration, o padrão do BIS é que no banco seja um campo do tipo varchar(50) (O limite recomendado de enums no BIS é de 50 chars, embora haja uma real limitação). 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.

Assim, para definir um atributo no VO que seja do tipo MeasureUnit devemos ter algo como:

Exemplos de Composição
@BISDAOConverter(converterClass = MeasureUnitDAOConverter.class)
@BISMetaGenericField(caption = "Unidade de Medida", required = true)
private MeasureUnit measureUnit = null;


Desta forma, 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(...);


Ou seja, sempre for necessário desserializar da String para uma das unidades de medida, esse método fará o trabalho.


Unidades de Medidas Iguais
Note que 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, caso isso ocorra uma vez que o valor seja persistido, a restituição baseada só no nome da enumeration será sempre retornada pela primeira enumeration que o código procura. Retornando o tipo errado em muitos cassos.

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.