MeasureRuler: mudanças entre as edições

De BIS Wiki
Ir para navegação Ir para pesquisar
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...'
 
Linha 14: Linha 14:
= MeasureUnit =
= 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:
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 24:
== Interface MeasureUnit ==
== 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.  
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 ==


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'''.
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'''.


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


{{java|Exemplos de Composição|<syntaxhighlight lang="java">
{{java|Exemplos de Declaração|<syntaxhighlight lang="java">


@BISDAOConverter(converterClass = MeasureUnitDAOConverter.class)
@BISDAOConverter(converterClass = MeasureUnitDAOConverter.class)
Linha 44: Linha 44:




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(...)".
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.




Ou seja, sempre 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.
 
 
{{stop|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 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.
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.
}}
}}

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.

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. 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.