quarta-feira, 3 de abril de 2013

Domínios Enumerados 'Desbloqueados'

Domínio enumerado é um recurso muito interessante, creio que você já o esta utilizando, pois podemos criar listas com valores constantes e pré-definidos, e com isso eliminar definitivamente as constantes da programação, tornando o código final mais legível, mais atraente, até parece que fica mais inteligente. Mas por outro lado, ao decidir utilizar esse recurso, todas as operações sobre o atributo ou variável do tipo domínio ficam reféns das definições iniciais.

Se por exemplo definirmos um domínio enumerado do tipo Status, com os valores Aberto e Fechado, como apresentado abaixo, somente poderemos manipular valores, para os atributos e variáveis definidas nesse tipo, de acordo com esse conjunto.


Isso significa o seguinte, se a variável &status abaixo, definida do tipo Status, somente aceita atribuições do tipo:

&status = Status.Aberto

Que, claro, é exatamente o objetivo desse recurso, melhorar a sintaxe e definir conteúdos limitados, e previamente definidos.

Ok, mas o que acontece quando precisamos designar para &status valores a partir de outros tipos, numeric, character, ...

&status = 1

Isso não será possível (pelo menos da forma habitual).

'Desbloqueando' Domínios Enumerados


O termo 'desbloqueando' é meio forte para definir esse assunto, mas achei que se adequava muito bem a esse contexto.  A situação que me ocorreu foi a necessidade de guardar o valor desta variável &status na sessão, e claro, nesse local somente temos a possibilidade de armazenar textos.

&websession.set("STATUS", &Status.ToString())

Portanto, para se obter o valor convertido para texto, nada mais simples que um ToString().

A recuperação do valor foi o desafio aqui, pois como faríamos,  pois a variável não aceitaria valores numéricos convertidos como na expressão abaixo.

&status = &websession.Get("STATUS").toNumeric()

A saída é uma operação, meio escondida na documentação chamada Convert, que pode ser realizada da seguinte forma:


&status = Status.Convert(&websession.Get("STATUS").ToNumeric())

Meio estranho, mas funciona, o resultado será a conversão do valor numérico pelo valor respectivo no conjunto.