modelo rico ou gambiarra?  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
gambazinho
Java Ninja
[Avatar]
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?
ViniGodoy
Moderador
[Avatar]

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
[WWW]
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.

jakefrog
GUJ Expert
[Avatar]

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!
gambazinho
Java Ninja
[Avatar]
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?
jakefrog
GUJ Expert
[Avatar]

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!
FernandoFranzini
GUJ Master
[Avatar]

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
[Email] [WWW]
gambazinho
Java Ninja
[Avatar]
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??
jakefrog
GUJ Expert
[Avatar]

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!
gambazinho
Java Ninja
[Avatar]
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?
jakefrog
GUJ Expert
[Avatar]

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!
FernandoFranzini
GUJ Master
[Avatar]

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
[Email] [WWW]
gambazinho
Java Ninja
[Avatar]
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

FernandoFranzini
GUJ Master
[Avatar]

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
[Email] [WWW]
gambazinho
Java Ninja
[Avatar]
Membro desde: 15/09/2010 10:27:22
Mensagens: 254
Offline

FernandoFranzini wrote:
3) aumentar o if.
Qual o problema?


esse é o problema...
 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team