Padrão Strategy: métodos da interface nas classes filhas  XML
Índice dos Fóruns » Metodologias de Desenvolvimento e Testes de Software
Autor Mensagem
rsantik
JavaTeenager
[Avatar]

Membro desde: 09/10/2008 18:50:25
Mensagens: 177
Localização: Jundiaí
Offline

Tenho uma interface, e duas classes que a implementam..... o problema é que o método, implementado da interface, para cada filha devem retornar tipos diferentes, isto é, uma filha deve utilizar o método mas retornar uma string e outra filha deve utilizar o mesmo método mas retornar um inteiro.

Como faço nessa situação?

This message was edited 2 times. Last update was at 16/09/2011 09:31:51


Frases para você filosofar:

Os fins justificam os meios, diz o filosofo...
Outra gambiarra, diz o programador.

E-mail: rodrigo.santik@gmail.com
[Email] [WWW] [MSN]
AbelBueno
Virtual Machine Man

Membro desde: 04/08/2010 09:37:57
Mensagens: 543
Offline

Você pode usar um código como abaixo para fazer o que você quer:



A interface declara um tipo mais geral e as filhas implementando os métodos definem um tipo de retorno mais específico.

O problema é que trabalhar com inteiros e strings são duas coisas totalmente diferentes.

O que adianta ter a interface, se o código precisará saber com que tipo de implementação (classe filha) está lidando?

rsantik
JavaTeenager
[Avatar]

Membro desde: 09/10/2008 18:50:25
Mensagens: 177
Localização: Jundiaí
Offline

Então AbelBueno, essa era minha dúvida, porque segundo o Padrão Strategy, devemos encapsular os algoritmos e criar uma interface com os métodos comuns para as filhas. Me deparei com esta situação no trabalho, o mesmo método deveria retornar um int para um caso e um string para outro caso, coisas totalmente diferentes, mas as regras de negócio aqui deveria ser desta maneira. Aí pensei, para que eu declarar uma interface? Cada filha precisará saber o que retornar.... então aí manter a interface é simplesmente para dizer que estou dentro do Padrão Strategy? Só por plus? Ou manter esta interface tem alguma importância maior?

Alguém saberia me responder a pergunta acima?

This message was edited 1 time. Last update was at 16/09/2011 08:50:05


Frases para você filosofar:

Os fins justificam os meios, diz o filosofo...
Outra gambiarra, diz o programador.

E-mail: rodrigo.santik@gmail.com
[Email] [WWW] [MSN]
FernandoFranzini
GUJ Master
[Avatar]

Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline

É padrão strategy sim eu agora vejo 3 opções:
1) usar um retorno polimórfico....vc pode criar uma interface sua para isso.
2) tentar usar generic
3) usar um retorno de classe usando o padrão wrapper que guarda um tipo com generic. Aqui vc sempre retorna essa wrapper com um valor GENERICO
Eu escolheria a 3.
T+

This message was edited 1 time. Last update was at 16/09/2011 08:57:37


Fernando Franzini
[Email] [WWW]
AbelBueno
Virtual Machine Man

Membro desde: 04/08/2010 09:37:57
Mensagens: 543
Offline

A idéia do strategy é poder inserir um algoritmo diferente para realizar a mesma coisa de diversas formas...
Em resumo, isso evita algunfs ifs, melhora a manuntenção do código...

No seu caso, no retorno desse método você já colocaria um if pra saber se é inteiro ou se é string.

Talvez você deva refatorar a classe que recebe a implementação para delegar mais trabalho para o algoritmo inejtado
De forma que você possa usar a interface de forma uniforme.
FernandoFranzini
GUJ Master
[Avatar]

Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline

AbelBueno wrote:Talvez você deva refatorar a classe que recebe a implementação para delegar mais trabalho para o algoritmo inejtado
De forma que você possa usar a interface de forma uniforme.

É justamente as opções das minhas dicas...
[Email] [WWW]
AbelBueno
Virtual Machine Man

Membro desde: 04/08/2010 09:37:57
Mensagens: 543
Offline

FernandoFranzini wrote:É justamente as opções das minhas dicas...


Desculpe FernandoFranzini, talvez não tenha entendido sua sugestão.

Eu pensei que estava falando de mudar o tipo de retorno do método.

Eu falei para transferir o código que usa esse retorno para fora da classe também.
rsantik
JavaTeenager
[Avatar]

Membro desde: 09/10/2008 18:50:25
Mensagens: 177
Localização: Jundiaí
Offline

Vou tentar um retorno genérico.
Mas meio redundante, né?!

Frases para você filosofar:

Os fins justificam os meios, diz o filosofo...
Outra gambiarra, diz o programador.

E-mail: rodrigo.santik@gmail.com
[Email] [WWW] [MSN]
rsantik
JavaTeenager
[Avatar]

Membro desde: 09/10/2008 18:50:25
Mensagens: 177
Localização: Jundiaí
Offline

AbelBueno wrote:
FernandoFranzini wrote:É justamente as opções das minhas dicas...


Desculpe FernandoFranzini, talvez não tenha entendido sua sugestão.

Eu pensei que estava falando de mudar o tipo de retorno do método.

Eu falei para transferir o código que usa esse retorno para fora da classe também.



Mas tratar este retorno por fora? Não vai sair do padrão strategy? Se bem que é uma boa opção quando tenho que retornar objetos filhos que estão em outras estruturas hierarquicas.

Imagina essa mesma situação, porém ao invés de o retorno ser uma string e um int, eu ter que retornar um objeto PessoaFisica e um objeto PessoaJuridica, ambos herdados de um objeto Pessoa.

Acho que aí ficou bem complexo heim?
[Email] [WWW] [MSN]
FernandoFranzini
GUJ Master
[Avatar]

Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline



Mas tratar este retorno por fora? Não vai sair do padrão strategy?

Não pq seu cenários vai alem do patter

Imagina essa mesma situação, porém ao invés de o retorno ser uma string e um int, eu ter que retornar um objeto PessoaFisica e um objeto PessoaJuridica, ambos herdados de um objeto Pessoa.

Tudo bem...eu ainda prefiro wrapper....

Acho que aí ficou bem complexo heim?

Claro....seu cenário vai bem alem de 1 padrão...dai vc pode aplicar padrões compostos...
[Email] [WWW]
ViniGodoy
Moderador
[Avatar]

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

Você pode postar um exemplo dessa sua interface?

Por mim, se o retorno é diferente, ele não atende a interface, não é um caso de Strategy. Ou então, há como reescrever de maneira que isso fique indiferente.

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

Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline


Fernando Franzini
[Email] [WWW]
rsantik
JavaTeenager
[Avatar]

Membro desde: 09/10/2008 18:50:25
Mensagens: 177
Localização: Jundiaí
Offline

É isso mesmo que o Fernando escreveu, ficou ótimo o código, e atende ao padrão Strategy. Vou utiliza-lo. Obrigadão garoto! Depois pago uma rodada de cerveja pra nóis!!

Na verdade Vini, o caso é o que eu citei acima, não tenho código ainda, estou fazendo a UML do projeto e percebi que o mesmo método implementado nas filhas deveriam retornar objetos diferentes, aí gostaria de saber da comunidade GUJ qual a melhor forma de resolver esse problema, porque quando implementamos uma interface, tenho que obrigatoriamente utilizar aquele método e retorna o objeto que a interface me impõe, só que segundo as regras de negócio aqui, os métodos devem retornar objetos diferentes.... então pensei.... será que vou ter que tirar a interface e copiar e colar o método em tudo quanto é "classe que seriam filhas"? Sairia fora do padrão! Tem N maneiras de escrever esse problema... mas gostaria da melhor forma, segundo o Strategy.

Frases para você filosofar:

Os fins justificam os meios, diz o filosofo...
Outra gambiarra, diz o programador.

E-mail: rodrigo.santik@gmail.com
[Email] [WWW] [MSN]
ViniGodoy
Moderador
[Avatar]

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

Muitas vezes basta retornar o objeto da superclasse. Você até pode retornar um filho dele em cada Strategy graças a existência de covariant result types.

Agora, se sua modelagem está retornando tipos não relacionados, aí olhe bem seu design. Provavelmente tem falha aí.

@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]
rsantik
JavaTeenager
[Avatar]

Membro desde: 09/10/2008 18:50:25
Mensagens: 177
Localização: Jundiaí
Offline

ViniGodoy wrote:Muitas vezes basta retornar o objeto da superclasse. Você até pode retornar um filho dele em cada Strategy graças a existência de covariant result types.

Agora, se sua modelagem está retornando tipos não relacionados, aí olhe bem seu design. Provavelmente tem falha aí.




Vini teria algum exemplo desse "covariant result types"?

This message was edited 1 time. Last update was at 16/09/2011 19:50:52


Frases para você filosofar:

Os fins justificam os meios, diz o filosofo...
Outra gambiarra, diz o programador.

E-mail: rodrigo.santik@gmail.com
[Email] [WWW] [MSN]
 
Índice dos Fóruns » Metodologias de Desenvolvimento e Testes de Software
Ir para:   
Powered by JForum 2.1.8 © JForum Team