Variável que pode ser Integer, Float, String simultaneamente!
19/12/2016 12:00
0
Ola Pessoal,

estou em um projeto onde preciso que uma variável receba diferentes tipos de valores ou seja que em determinado momento receba inteiros, outra hora receba flutuantes, outra hora textos.

Em meu projeto inicial fiz uma classe que continha cada  um desses tipos exemplo:

?class registro{

?Integer varInteger
?Float varFloat
?String varString
?Date varDate
?Boolean varBoolean
}


Quando o cliente inseria uma determinada informação eu mandava salvar no atributo de seu respectivo tipo. O problema é que isso foi enchendo meu banco de dados.

Um colega criticou tal procedimento alegando que não é uma boa prática pois para 1 registro preenchido vários outros estariam nulos e vazios e que a melhor estratégica seria ter apenas 1 variável e dela se desdobrar em diferentes tipos.

O problema é que eu não sei como fazer isso ? Como seria a busca por outras variáveis de mesmo tipo?

Alguém com mais experiência poderia me dizer qual o melhor meio de fazer isso?
Tags: Grails, variável, def


1
Não entendi o sentido disso , porem  vc poderia ter uma variavel string  e  dar parse nela, nada impede vc escrever um float , int ,date , boolean como  string. Mais ainda acharia isso uma POG  , qual o sentido  de uma classe com 1 ou varios atributos  que se usam pro mesmo "contexto"
19/12/2016 14:45


1
Se você persiste com hibernate, pode usar um usertype que persiste uma string contendo o valor e a informação sobre o tipo (se é string, data, etc)
Pode dar mais detalhes sobre o seu caso concreto? Cada solução faz mais sentido em um cenário


0
Pessoal, muito obrigado por responderem. Eu queria fazer isso porque existe uma variável genérica em um formulário que poderia receber vários tipos de respostas e com o conjunto de vários resultados elaborar uma análise das respostas dos usuários. POr isso seria importante a variável salvar no tipo correto.
22/12/2016 00:04


1
E tem mesmo necessidade de armazenar no mesmo campo?
Provavelmente as analises que seu sistema fará nao devem ser identicas para todos os tipos, certo? A analise de respostas boolean não deve ser a mesma para data por exemplo.
Se você quiser utilizar o proprio sgbd para fazer algumas analises, por exemplo, contar quantas ocorrencias de cada resposta do tipo string, ou a média dos valores em respostas do tipo numerico, não irá conseguir.

Se ainda quiser gravar tudo no mesmo campo, como eu disse, dá pra usar um usertype

o domain ficaria mais ou menos assim:
class Resposta {
    Object resposta
    static mapping = { resposta type: RespostaUserType }
}

Sendo que RespostaUserType é uma classe que implementa UserType do hibernate.

O usertype pode codificar a resposta num json e persistir num campo varchar ou blob. Por exemplo, se for String iria virar algo assim:
{valor: "blabla", tipo: "java.lang.String"}

Pesquise se não é possível fazer algo com polimorfismo, tipo assim:
abstract class AbstractResposta<T> {
    abstract T getResposta()
    void setResposta(T resposta)
}

class RespostaString extends AbstractResposta<String> {
    String respostaString
    String getResposta { respostaString }
    void setResposta(String resposta) { respostaString = resposta }
}


1
Agora, minha opinião já que vc detalhou um pouco mais seu projeto:
Eu tenho um sistema de pesquisas, no meu caso há um conjunto de domains que definem a pesquisa (quais são as questões e caracteristicas de cada uma), mas as resposta eu persisto tudo como string. Na hora das analises, olhando a definição da pesquisa o sistema sabe como tratar as respostas.


0
Magno, seu exemplo me ajudou demais. Obrigado pela explicação. Valeu mesmo.
22/12/2016 21:02



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto