| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/01/2012 19:25:27
|
gambazinho
Java Ninja
Membro desde: 15/09/2010 10:27:22
Mensagens: 254
Offline
|
Pessoal,
sempre que construo um sistema de login, no meu controller LoginUser(por exemplo) eu acabo fazendo o seguinte:
uma forma que pensei para contornar esses ifs seria criar uma interface para usuário e cada perfil de usuário saberia para que página retornar, ficaria mais ou menos assim:
as implementações
dessa forma eu até evito de ter o atributo perfil, pq a própria classe é o perfil. e assim no meu controller eu teria algo como:
só que fazendo isso eu estou colocando a regra de login dentro do meu modelo, o próprio objeto administrador/Cliente saberia como fazer o login.
aí vem minha dúvida, isso é modelo rico ou gambiarra?
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/01/2012 20:11:26
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
Essa é a famosa refatoração: Substituir if/switch por polimorfismo.
Outra opção seria usar um map:
E na hora h...
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/01/2012 20:11:38
|
AbelBueno
Virtual Machine Man
Membro desde: 04/08/2010 09:37:57
Mensagens: 543
Offline
|
Não acho que seja gambiarra.
Mas o que eu faria é criar uma classe para o atributo Perfil, ou mesmo uma enum.
Nesta classe/enum teria o método para retornar o html correto.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/01/2012 21:07:15
|
jakefrog
GUJ Expert
![[Avatar]](/images/avatar/6e2400ec18b6f1952f1053c65df7a8b6.png)
Membro desde: 22/01/2007 22:00:53
Mensagens: 4191
Offline
|
Como já até falaram, eu prefiro por enum viu. Algo parecido como abaixo:
|
Meu blog sobre java uaiHebert.com
Conceitos OO - Diga, não pergunte!, Lei de Demeter
TDD Primeiros Passos, JUnit com HSQLDB, JPA e Hibernate, Cobertura de testes com JUnit Ant e Emma, Cobrindo seus testes com Cobertura, JUnit, HSQLDB, JPA
Código Limpo: Partes: 01,02,03,04,05
Web/JSF - Criando um WebServer, Tratando Exceções, Autenticação de Usuários (Filter/Servlet), JSF - Hello World, AutoComplete, JSF: Converter e Bean Auto Complete, Validação de Login de Usuário com JSF e JAAS, JSF Exibindo Objeto e Mensagens após Redirect, JSF Exemplos Simples com Ajax, JSF Parametros por Get Request RESTFullAplicação Web Completa JSF EJB JPA JAAS, Lazy JSF Datatable Pagination (Primefaces)
Design Pattern - Strategy, Design Pattern - Observer (Parte 01), Design Pattern - Observer (Parte 02)
Business (JPA)- Hibernate 3 com JPA 2, Create schema script: Ant, Hibernate 3 e JPA 2, TableGenerator Chave Primária Simples, SequenceGenerator,Chave Primária Composta, Mapeando Datas (Date) e Enum, Mapeando Duas Tabelas em uma Classe, @OneToOne Unidirecional e Bidirecional, @OneToMany e @ManyToOne Unidirecional e Bidirecional, @ManyToMany Unidirecional e Bidirecional, Ordernando listas e utilizando Map como atributo mapeado,Uma tabela por herança, JPA Uma Classe por Sub-Classe, JPA Consultas e Dicas, [HOT]Quatro soluções para LazyInitializationException[HOT]
SCJP(1.6 - Ingles - 29/12/2009)
SCWCD(1.5 - Ingles - 30/06/2010)
Vamos em frente que atrás vem gente! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 25/01/2012 21:21:44
|
gambazinho
Java Ninja
Membro desde: 15/09/2010 10:27:22
Mensagens: 254
Offline
|
só que fazendo isso eu estou colocando a regra de login dentro do meu modelo
e sobre isso? não fica estranho isso?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2012 07:13:43
|
jakefrog
GUJ Expert
![[Avatar]](/images/avatar/6e2400ec18b6f1952f1053c65df7a8b6.png)
Membro desde: 22/01/2007 22:00:53
Mensagens: 4191
Offline
|
gambazinho wrote:só que fazendo isso eu estou colocando a regra de login dentro do meu modelo
e sobre isso? não fica estranho isso?
Para fugir disso então, você poderia no caso do enum, criar: um arquivo de constantes de páginas, ou um resource bundle ou um arquivo de configurações e salvar apenas a chave da página no enum.
Tipo assim:
ADMIN("PAGINA_ADMIN"), USER("PAGINA_USER")
e quando você fosse utilizar esse valor, você buscaria no real da página.
Desse modo, seu modelo sabe apenas que o ADMIN teria uma PAGINA_ADMIN mas não terá conhecimento de qual página é.
Que tal?
|
Meu blog sobre java uaiHebert.com
Conceitos OO - Diga, não pergunte!, Lei de Demeter
TDD Primeiros Passos, JUnit com HSQLDB, JPA e Hibernate, Cobertura de testes com JUnit Ant e Emma, Cobrindo seus testes com Cobertura, JUnit, HSQLDB, JPA
Código Limpo: Partes: 01,02,03,04,05
Web/JSF - Criando um WebServer, Tratando Exceções, Autenticação de Usuários (Filter/Servlet), JSF - Hello World, AutoComplete, JSF: Converter e Bean Auto Complete, Validação de Login de Usuário com JSF e JAAS, JSF Exibindo Objeto e Mensagens após Redirect, JSF Exemplos Simples com Ajax, JSF Parametros por Get Request RESTFullAplicação Web Completa JSF EJB JPA JAAS, Lazy JSF Datatable Pagination (Primefaces)
Design Pattern - Strategy, Design Pattern - Observer (Parte 01), Design Pattern - Observer (Parte 02)
Business (JPA)- Hibernate 3 com JPA 2, Create schema script: Ant, Hibernate 3 e JPA 2, TableGenerator Chave Primária Simples, SequenceGenerator,Chave Primária Composta, Mapeando Datas (Date) e Enum, Mapeando Duas Tabelas em uma Classe, @OneToOne Unidirecional e Bidirecional, @OneToMany e @ManyToOne Unidirecional e Bidirecional, @ManyToMany Unidirecional e Bidirecional, Ordernando listas e utilizando Map como atributo mapeado,Uma tabela por herança, JPA Uma Classe por Sub-Classe, JPA Consultas e Dicas, [HOT]Quatro soluções para LazyInitializationException[HOT]
SCJP(1.6 - Ingles - 29/12/2009)
SCWCD(1.5 - Ingles - 30/06/2010)
Vamos em frente que atrás vem gente! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2012 07:43:36
|
FernandoFranzini
GUJ Master
![[Avatar]](/images/avatar/33f6c40df1060aa3c548ad2d499eced0.jpg)
Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline
|
Vc esta correto sim!
Prefira estrutura polimórficas sobre controle de IF's.
No caso vc optou bem, implementando o padrão STRATEGY.
Unico erro é que vc furou a camada, colocando a pagina dentro do modelo.
A regra de negocio deve ser independente de infra estrutura e detalhes de front-end.
|
Fernando Franzini |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2012 08:00:56
|
gambazinho
Java Ninja
Membro desde: 15/09/2010 10:27:22
Mensagens: 254
Offline
|
FernandoFranzini wrote:
Unico erro é que vc furou a camada, colocando a pagina dentro do modelo.
A regra de negocio deve ser independente de infra estrutura e detalhes de front-end.
então é essa minha dúvida, como corrigir isso sem ter de criar enum??
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2012 08:13:29
|
jakefrog
GUJ Expert
![[Avatar]](/images/avatar/6e2400ec18b6f1952f1053c65df7a8b6.png)
Membro desde: 22/01/2007 22:00:53
Mensagens: 4191
Offline
|
gambazinho wrote:
FernandoFranzini wrote:
Unico erro é que vc furou a camada, colocando a pagina dentro do modelo.
A regra de negocio deve ser independente de infra estrutura e detalhes de front-end.
então é essa minha dúvida, como corrigir isso sem ter de criar enum??
Pq não criar enum?
O enum abaixo não vai ter detalhe algum do front-end. Em que a solução abaixo fura o modelo?
jakefrog wrote:Para fugir disso então, você poderia no caso do enum, criar: um arquivo de constantes de páginas, ou um resource bundle ou um arquivo de configurações e salvar apenas a chave da página no enum.
Tipo assim:
ADMIN("PAGINA_ADMIN"), USER("PAGINA_USER")
e quando você fosse utilizar esse valor, você buscaria no real da página.
Desse modo, seu modelo sabe apenas que o ADMIN teria uma PAGINA_ADMIN mas não terá conhecimento de qual página é.
Que tal?
|
Meu blog sobre java uaiHebert.com
Conceitos OO - Diga, não pergunte!, Lei de Demeter
TDD Primeiros Passos, JUnit com HSQLDB, JPA e Hibernate, Cobertura de testes com JUnit Ant e Emma, Cobrindo seus testes com Cobertura, JUnit, HSQLDB, JPA
Código Limpo: Partes: 01,02,03,04,05
Web/JSF - Criando um WebServer, Tratando Exceções, Autenticação de Usuários (Filter/Servlet), JSF - Hello World, AutoComplete, JSF: Converter e Bean Auto Complete, Validação de Login de Usuário com JSF e JAAS, JSF Exibindo Objeto e Mensagens após Redirect, JSF Exemplos Simples com Ajax, JSF Parametros por Get Request RESTFullAplicação Web Completa JSF EJB JPA JAAS, Lazy JSF Datatable Pagination (Primefaces)
Design Pattern - Strategy, Design Pattern - Observer (Parte 01), Design Pattern - Observer (Parte 02)
Business (JPA)- Hibernate 3 com JPA 2, Create schema script: Ant, Hibernate 3 e JPA 2, TableGenerator Chave Primária Simples, SequenceGenerator,Chave Primária Composta, Mapeando Datas (Date) e Enum, Mapeando Duas Tabelas em uma Classe, @OneToOne Unidirecional e Bidirecional, @OneToMany e @ManyToOne Unidirecional e Bidirecional, @ManyToMany Unidirecional e Bidirecional, Ordernando listas e utilizando Map como atributo mapeado,Uma tabela por herança, JPA Uma Classe por Sub-Classe, JPA Consultas e Dicas, [HOT]Quatro soluções para LazyInitializationException[HOT]
SCJP(1.6 - Ingles - 29/12/2009)
SCWCD(1.5 - Ingles - 30/06/2010)
Vamos em frente que atrás vem gente! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2012 08:18:26
|
gambazinho
Java Ninja
Membro desde: 15/09/2010 10:27:22
Mensagens: 254
Offline
|
jakefrog poderia dar um pequeno exemplo de como isso ficaria? em que pacote eu criaria esse enum?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2012 08:25:25
|
jakefrog
GUJ Expert
![[Avatar]](/images/avatar/6e2400ec18b6f1952f1053c65df7a8b6.png)
Membro desde: 22/01/2007 22:00:53
Mensagens: 4191
Offline
|
gambazinho wrote:jakefrog poderia dar um pequeno exemplo de como isso ficaria? em que pacote eu criaria esse enum?
Você criaria dentro do mesmo pacote do seu usuário, pois faz parte do modelo saber qual o perfil do seu usuário.
Quando você fosse buscar a página, você buscar em um arquivo properties algo como abaixo:
Perfil, seria o Enum. Note, que o perfil vai indicar o tipo/chave (admin.page) da página mas não a página em si (/pages/admin.xhtml).
Em seu arquivo de properties você teria algo do tipo:
E seu enum seria tipo:
|
Meu blog sobre java uaiHebert.com
Conceitos OO - Diga, não pergunte!, Lei de Demeter
TDD Primeiros Passos, JUnit com HSQLDB, JPA e Hibernate, Cobertura de testes com JUnit Ant e Emma, Cobrindo seus testes com Cobertura, JUnit, HSQLDB, JPA
Código Limpo: Partes: 01,02,03,04,05
Web/JSF - Criando um WebServer, Tratando Exceções, Autenticação de Usuários (Filter/Servlet), JSF - Hello World, AutoComplete, JSF: Converter e Bean Auto Complete, Validação de Login de Usuário com JSF e JAAS, JSF Exibindo Objeto e Mensagens após Redirect, JSF Exemplos Simples com Ajax, JSF Parametros por Get Request RESTFullAplicação Web Completa JSF EJB JPA JAAS, Lazy JSF Datatable Pagination (Primefaces)
Design Pattern - Strategy, Design Pattern - Observer (Parte 01), Design Pattern - Observer (Parte 02)
Business (JPA)- Hibernate 3 com JPA 2, Create schema script: Ant, Hibernate 3 e JPA 2, TableGenerator Chave Primária Simples, SequenceGenerator,Chave Primária Composta, Mapeando Datas (Date) e Enum, Mapeando Duas Tabelas em uma Classe, @OneToOne Unidirecional e Bidirecional, @OneToMany e @ManyToOne Unidirecional e Bidirecional, @ManyToMany Unidirecional e Bidirecional, Ordernando listas e utilizando Map como atributo mapeado,Uma tabela por herança, JPA Uma Classe por Sub-Classe, JPA Consultas e Dicas, [HOT]Quatro soluções para LazyInitializationException[HOT]
SCJP(1.6 - Ingles - 29/12/2009)
SCWCD(1.5 - Ingles - 30/06/2010)
Vamos em frente que atrás vem gente! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2012 08:30:18
|
FernandoFranzini
GUJ Master
![[Avatar]](/images/avatar/33f6c40df1060aa3c548ad2d499eced0.jpg)
Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline
|
1) O controle de decisão do front-end deve ficar na camada de visão utilizada - web, desktop, celular, smartphone etc.
2) O tipo polimórfico do objeto de domínio ja indica isso, vc não precisa misturar o strategy + template method.
Na camada de visão:
if (objetoDominio instanceof X) {
return enviar para front-end A;
} else if (objetoDominio instanceof Y) {
return enviar para front-end B;
{
Tipico metodo de camada front-end MVC.
|
Fernando Franzini |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2012 08:35:16
|
gambazinho
Java Ninja
Membro desde: 15/09/2010 10:27:22
Mensagens: 254
Offline
|
FernandoFranzini wrote:1) O controle de decisão do front-end deve ficar na camada de visão utilizada - web, desktop, celular, smartphone etc.
2) O tipo polimórfico do objeto de domínio ja indica isso, vc não precisa misturar o strategy + template method.
Na camada de visão:
if (objetoDominio instanceof X) {
return enviar para front-end A;
} else if (objetoDominio instanceof Y) {
return enviar para front-end B;
{
Tipico metodo de camada front-end MVC.
mas aí eu estaria apenas trocando um if por outro... o problema dos ifs continuariam da mesma forma...
concorda?
e
This message was edited 3 times. Last update was at 26/01/2012 08:41:01
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2012 09:03:53
|
FernandoFranzini
GUJ Master
![[Avatar]](/images/avatar/33f6c40df1060aa3c548ad2d499eced0.jpg)
Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline
|
mas aí eu estaria apenas trocando um if por outro... o problema dos ifs continuariam da mesma forma...
concorda?
Sim...mas agora esta:
1) flexível
2) Extensível
3) Na camada correta.
Veja que a cada vez que vc criar uma classe nova de sua API q tenha regras de autenticação intercambial, vc precisa manutenir esse if:
1) criar uma classe novo, herdando da base.
2) criar um html novo.
3) aumentar o if.
Seu estrategia arquitetural esta 100% compatível.
Qual o problema?
|
Fernando Franzini |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/01/2012 09:34:40
|
gambazinho
Java Ninja
Membro desde: 15/09/2010 10:27:22
Mensagens: 254
Offline
|
FernandoFranzini wrote:
3) aumentar o if.
Qual o problema?
esse é o problema...
|
|
|
 |
|
|
|
|