Como não usar Singleton e Static em Aplicação Desktop (sem container!)

2 respostas
rruppel

oi galera,

li muita coisa esses dias valorizando Injeção de Dependencias e Domain Driven Design e, por outro lado, esculhambando uso de statics e Singletons

eu concordo com as vantagens de Injeção de Dependencias e DDD, porém estou desenvolvendo uma aplicação Desktop para a loja de um amigo meu e e escolhi o Java por ser a linguagem com a qual tenho mais intimidade… já até fiz algumas “consultorias” aqui (no guj… hehehe), mas dessa vez gostaria de perguntar algo diferente:

Como não quero usar containers (acho q a maquina de produção não é suficientemente poderosa para tal), fica impossibilitado o uso de Injeção de Dependencias, e portanto, estou usando o PersistenceUtil que utiliza uma ThreadLocal para me fornecer os EntityManager… isso é desaconselhável ? (pois pelo q entendi isso é um Singleton) ? Por que é desaconselhável? Eu li o post do blog da caelum: Singletons e static: perigo à vista mas como não posso usar injeção de dependencias, não vejo alternativas…

Outra coisa é que eu estava usando Dao para encapsular as consultas SQL… deixar todo o “lixo” do SQL dentro dos Dao e fazer meus Managers consultarem coisas do Banco de Dados com os Daos…

como não posso usar Injeção de Dependencia, eu estava pensando em usar metodos estáticos no Dao… e até acho que faz sentido ter uma classe como “Utilitária de Consulta ao Banco de Dados”… e por ser algo utilitário faz sentido ter métodos estáticos…

porém… com todas críticas a essas duas arquiteturas, eu queria saber então qual seria uma alternativa…

e mais importante ainda: pq essas arquiteturas são tão criticadas? (o post da Caelum ao meu ver não dá um motivo… o único citado é q não faz sentido… mas eu particularmente acho q faz sentido :D)

ps: se essa resposta for muito óbvia eu me contento com link para algum lugar q cite os problemas dessas arquiteturas…
eu pensei aki em criar uma classe ManagerGenerico que conteria o EntityManager… e assim os Managers extenderiam dele e teriam acesso ao EntityManager por herança… achei uma boa… o problema é como passar esse EntityManager aos Daos…
(e os EntityManager precisam ficar sob responsabilidade dos managers pois se não eu teria q criar uma transação por operação… e isso acho errado… até pq se eu estiver no meio de um metodo do manager… caso haja rollback… ele tem q voltar TUDO)…

um jeito de passar o EntityManager para os Daos seria por setters ou por contrutores… mas acho q ficar instanciando Daos e passando EntityManagers é muito feio… sou mais os metodos statics mesmo com o PersistenceUtil me fornecendo o EntityManager…

eu juro q ficaria satisfeito de encontrar uma solução q não fosse tão na contramão das criticas mais recentes… e por isso agradeço qualquer ajuda… até pq estou fazendo essa aplicação para aprender mais Java e portanto queria usar as coisas mais modernas :smiley:

abraços e agradeço qualquer ajuda…

2 Respostas

Aldrin_Leal

É desaconselhável por causa de manutenção. A idéia do IoC é, principalmente, CENTRALIZAR toda a sua necessidade de manipulação de classes.

Vamos supor um caso simples: Seu sistema cresce e, em um determinado momento, a loja precisa atender na web.

Sabe o que vai acontecer?

Você vai descartar tudo o que fez, provavelmente. Porque amarrando em um contexto estático, todas as threads irão compartilhar aquilo e aí você vai ter problemas com thread-safety.

É bastante compreensível seu medo em utilizar container de IoC. O que fazer?

a) Considerar outros containers (sei que você provavelmente pensa no Spring, mas posso sugerir o plexus e o guice)
b) Considerar apenas utilizar um pattern de contexto (como o que o javolution provê), abstraindo o que era um ThreadLocal mas ainda permitindo ter um controle sobre o que estará disponível para os seus commands
c) Considerar utilizar padrões Command e Chain-of-Responsibility. Porque? Bem, utilizando algo como o commons-chains e o dispatchAction, você pode esquecer um pouco se é desktop ou web, e pensar em termo de funcionalidade. E, usando uma metodologia test-driven, construir a lógica de negócio e a camada de regras, e, junto com as sugestões anteriores, considerar qual a melhor maneira de instanciar e configurar seus componentes.
d) Muito do seu medo pode ser por causa do DAO. Hibernate, JPA e semelhantes não são coisas leves e impõem um overhead, certo? Bem, que tal considerar usar ibatis e, embora restringindo um pouco a flexibilidade, ter uma relação performance/manutenção/flexibilidade pendendo mais pra performance e manutenção e menos pra flexibilidade?

agodinho

Se vc algum dia migrar seus DAO para dentro de uma aplicação EJB vc terá problemas com esses métodos estáticos.

iBatis tb é uma boa escolha para o DAO - principalmente se sua aplicação for orientada à banco.

Criado 2 de janeiro de 2008
Ultima resposta 3 de jan. de 2008
Respostas 2
Participantes 3