MeasureRuler: mudanças entre as edições

De BIS Wiki
Ir para navegação Ir para pesquisar
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.
= 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 =
= MeasureUnit =

Edição das 13h48min 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 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.