Como não utilizar IF ou SWITCH?  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
thiagoluisgarcia
Smalltalk
[Avatar]

Membro desde: 29/03/2007 13:46:46
Mensagens: 1
Localização: Joinville/SC
Offline

Pessoal,

Gostaria de saber como posso fazer uma implementação simples (um exemplo) não utilizando IF ou SWITCH. Alguém pode me ajudar?

[]s
Thiago
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Olá, seja bem-vindo ao GUJ!
Quando tiver um tempo, leia esse artigo que vai te orientar a como usar alguns recursos do forum.

Esse assunto é muito estressado no livro refatoração, do Martin/Fowler. O princípio básico é substituir ifs e switchs por polimorfismo.

Vou mostrar com um exemplo com o padrão Strategy. Considere a classe:



Para usar esse método, o usuário faz algo como:


Onde está o strategy nesse código? Bom, o criteria pode ser transformado num strategy. Podemos fazer isso de maneira simples, através de um enum:




Agora, aquele nosso código com o switch seria trocado por:



Para usar o novo método, o usuário fará:


Note que o switch foi completamente eliminado.

Outra vantagem é que fossemos adicionar outro método a esse strategy (por exemplo, NOT_CONTAINS), teríamos que modificar apenas o enum, e não localizar no código todos os pontos onde o switch é utilizado.

Finalmente, você poderia ter mais de um método abstrato em cada item do strategy. Não é esse caso, mas se você tivesse um enum com algoritmos de criptografia, você poderia ter o encode e o decode. A grande vantagem é que, quando alguém fosse implementar um novo algoritmo, teria um "template" pronto de quais métodos ele deve fornecer. Assim, não há risco de alguém implementar um encode() sem pelo notar a necessidade de implementar um decode().

This message was edited 2 times. Last update was at 30/07/2011 07:43:29

[WWW]
Mak
Debugger

Membro desde: 22/10/2008 22:13:38
Mensagens: 68
Offline

Olá ...

Fiquei com uma dúvida ... nesse não há os ConcreteStrategy??

Eles não são necessários para que se caracterize o padrão??

Grato
[MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Cada item do enum é um ConcreteStrategy. Nesse caso, as inner classes anônimas que implementam o comportamento do Begin, Contains, Regex, Ends e Equals.

O AbstractStrategy é dado pela própria classe do enum, que tem um método virtual. No lugar desse método virtual, o Enum poderia implementar uma interface SearchStrategy, com esse método, o que daria na mesma (embora ficasse um pouco mais flexível).

Só não fiz isso pq não tinha porque complicar o exemplo. A idéia aqui era mostrar como eliminar o switch, não tanto dar uma aula sobre o padrão e seus detalhes.

@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]
Mak
Debugger

Membro desde: 22/10/2008 22:13:38
Mensagens: 68
Offline

Ok

Agradeço a atenção
[MSN]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team