| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2011 07:58:02
|
rsantik
JavaTeenager
![[Avatar]](/images/avatar/1d015de3059eb8754a365b5bbc735818.png)
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 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2011 08:26:15
|
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?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2011 08:32:26
|
rsantik
JavaTeenager
![[Avatar]](/images/avatar/1d015de3059eb8754a365b5bbc735818.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2011 08:56:50
|
FernandoFranzini
GUJ Master
![[Avatar]](/images/avatar/33f6c40df1060aa3c548ad2d499eced0.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2011 09:45:05
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2011 09:46:33
|
FernandoFranzini
GUJ Master
![[Avatar]](/images/avatar/33f6c40df1060aa3c548ad2d499eced0.jpg)
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...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2011 10:25:34
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2011 10:27:42
|
rsantik
JavaTeenager
![[Avatar]](/images/avatar/1d015de3059eb8754a365b5bbc735818.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2011 10:35:14
|
rsantik
JavaTeenager
![[Avatar]](/images/avatar/1d015de3059eb8754a365b5bbc735818.png)
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?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2011 11:31:01
|
FernandoFranzini
GUJ Master
![[Avatar]](/images/avatar/33f6c40df1060aa3c548ad2d499eced0.jpg)
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...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2011 14:09:42
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2011 14:19:43
|
FernandoFranzini
GUJ Master
![[Avatar]](/images/avatar/33f6c40df1060aa3c548ad2d499eced0.jpg)
Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline
|
|
Fernando Franzini |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2011 15:08:30
|
rsantik
JavaTeenager
![[Avatar]](/images/avatar/1d015de3059eb8754a365b5bbc735818.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2011 15:12:45
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/09/2011 19:48:03
|
rsantik
JavaTeenager
![[Avatar]](/images/avatar/1d015de3059eb8754a365b5bbc735818.png)
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 |
|
|
 |
|
|