| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/05/2009 20:47:45
|
rylphs
Thread.start()
![[Avatar]](/images/avatar/69439823d43b4464cf6229e9f49eb510.png)
Membro desde: 09/04/2009 06:52:17
Mensagens: 37
Offline
|
Será que alguém poderia tirar uma dúvida minha?
Em qual das duas situações eu tenho um acoplemento menor?
Nessa?
Ou nessa?
Eu acho que a primeira forma é melhor, não é? Que tipos de acoplamento eu tenho nos dois casos?
Obrigado.
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/05/2009 21:31:53
|
rodrigoy
GUJ Ranger
![[Avatar]](/images/avatar/cf79ae6addba60ad018347359bd144d2.jpg)
Membro desde: 18/04/2006 01:06:28
Mensagens: 758
Localização: São Paulo
Offline
|
Não tem muita relação com acoplamento. Nas duas alternativas a classe está dependendo da Classe X. Se a classe X é abstrata, aí sim a alternativa 1 é menos acoplada. Se não é, tanto faz...
Para falar a verdade, na alternativa 2 você está com uma dependência maior com relação à criação do objeto, mas, como disse, a dependência existe nas duas opções.
|
Rodrigo Yoshima
www.ASPERCOM.com.br
Próximas Turmas:
São Paulo: Scrum 28/agosto | OOAD-UML 13/setembro
Débito Técnico Blog: blog.aspercom.com.br
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/05/2009 21:40:23
|
Bruno Laturner
JWizard
![[Avatar]](/images/avatar/5800ccd9514fd789d08e5831951aa6bc.jpg)
Membro desde: 18/02/2008 16:17:53
Mensagens: 2981
Offline
|
No segundo é menor o acoplamento pois as classes que chamam o método não precisam saber da existência de ClasseX
|
A resposta acima foi achada em menos de 5 minutos no google.
The prisoner falls in love with his chains. --E.W. Dijkstra |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/05/2009 07:42:13
|
Ferryman
JavaGuru
![[Avatar]](/images/avatar/2e3907cbad887e6a1bea84d450b756db.jpg)
Membro desde: 26/10/2006 16:30:23
Mensagens: 220
Offline
|
Descordo, A primeira a opção possui menor acoplamento, pois o método "algumaCoisa(ClasseX x)" não sabe como criar uma instancia da ClasseX. Seria possível criar por exemplo um subtipo da ClasseX e passar como parâmetro para o método "algumaCoisa(ClasseX x)". Essa pode ser uma boa pratica para fazer testes unitários por exemplo, isolando o Objeto que está sendo testado de suas dependências. []s
This message was edited 1 time. Last update was at 29/05/2009 07:45:02
|
Rafael Farias Silva (@rafaferry)
Jsigner - Engenharia reversa automática através do maven. Acesse http://code.google.com/p/jsigner |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/06/2009 09:18:51
|
rylphs
Thread.start()
![[Avatar]](/images/avatar/69439823d43b4464cf6229e9f49eb510.png)
Membro desde: 09/04/2009 06:52:17
Mensagens: 37
Offline
|
O acoplamento então seria o mesmo? O primeiro o método é mais independente da classe X não é? Primeiro porque não precisa saber como a classe é criada, e segundo porque posso alterar a classe X chamada somente chamando o método com outro parâmetro, desde que a classe que eu passe por parâmetro tenha a mesma interface de X. Estou no caminho certo?
Mesmo compreendendo o conceito de acoplamento, às vezes acho difícil mensurar isso na prática e decidir o melhor caminho pra diminuir o mesmo. No link http://en.wikipedia.org/wiki/Coupling_(computer_science) tem uma fórmula pra calcular o acoplamento, mas não consegui identificar perfeitamente cada tipo de acoplamento.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/06/2009 10:37:12
|
fantomas
GUJ Master
![[Avatar]](/images/avatar/a2bf57c3aee957f2aaf75aa84717b3be.jpg)
Membro desde: 24/04/2008 16:10:55
Mensagens: 1506
Localização: Terra (maior parte do tempo)
Offline
|
Na minha opinião sem usar interfaces ou classes abstratas seu acoplamento sempre será visto como alto.
flws
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/06/2009 12:22:57
|
rylphs
Thread.start()
![[Avatar]](/images/avatar/69439823d43b4464cf6229e9f49eb510.png)
Membro desde: 09/04/2009 06:52:17
Mensagens: 37
Offline
|
Entendi. Mas mesmo assim o primeiro caso ainda seria melhor, não é? A dúvida surgiu quando eu estava analisando uma classe de um programa que eu e amigos meus estamos desenvolvendo. A gente criou um singleton que permite acesso a alguns DAO's. Algo como isso:
Eu não gostei, e sugeri que fosse usado algo como:
No segundo caso tiraria até a necessidade da classe ser singleton. Ela ficaria visível somente a uma classe que a passaria por parâmetro quando chamasse o método. Funcionaria como uma fábrica?
Eu pensei também na possibilidade de colocar os DAOs que eu vou utilizar como atributos, e eu passaria "x" no construtor da classe que obteria os DAOs, mais ou menos assim:
Bem, me desculpem por tantas dúvidas, mas é que ainda estou muito cru com relação a OO, padrões, e com relação a java, e muitas dúvidas aparecem. O que vocês acham? Talvez tenham até outra sugestão. Me desculpem também por passar algo muito abstrato, mas não lembro direito do código.
Ah, e obrigado pelas respostas.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 01/06/2009 19:43:03
|
Andre Brito
JWizard
Membro desde: 21/07/2007 17:44:31
Mensagens: 2485
Localização: Paraná
Offline
|
Bruno Laturner,,
Achei bem colocado o que você disse. Só que o acoplamento, nesse caso, vai existir sempre "do nível de classe". Então acho que teria mais alguma classe envolvida aí (algo como Façade (não tenho certeza)).
fantomas wrote:Na minha opinião sem usar interfaces ou classes abstratas seu acoplamento sempre será visto como alto.
Fantomas, pode explicar melhor isso?
|
Como organizar o GUJ.
Meu Twitter.
Meu blog.
Future proofing means making code easy to change, not trying to anticipate every possible way your code might need to change. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/06/2009 06:42:54
|
Ferryman
JavaGuru
![[Avatar]](/images/avatar/2e3907cbad887e6a1bea84d450b756db.jpg)
Membro desde: 26/10/2006 16:30:23
Mensagens: 220
Offline
|
O primeiro exemplo segue a idéia de IoC, da uma lida aqui que você vai entender porque o acoplamento é menor.
http://en.wikipedia.org/wiki/Inversion_of_Control
[]s
|
Rafael Farias Silva (@rafaferry)
Jsigner - Engenharia reversa automática através do maven. Acesse http://code.google.com/p/jsigner |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/06/2009 07:08:26
|
Fernando Generoso da Rosa
Virtual Machine Man
Membro desde: 14/01/2003 14:48:21
Mensagens: 546
Localização: Sombrio/SC
Offline
|
Seguiria, se ClasseX fosse uma interface...
Fernando
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/06/2009 07:19:42
|
fantomas
GUJ Master
![[Avatar]](/images/avatar/a2bf57c3aee957f2aaf75aa84717b3be.jpg)
Membro desde: 24/04/2008 16:10:55
Mensagens: 1506
Localização: Terra (maior parte do tempo)
Offline
|
=Andre Brito wrote:Fantomas, pode explicar melhor isso?
Sim...
Programar para interface e não para implementação é um dos princípios da OO.
E para suportar essa idéia segue estes itens:
a) O objeto cliente fica independente da implementação do objeto que lhe serve.
b) O objeto que implementa uma interface pode ser facilmente substituido por outro, mesmo dinamicamente.
c) Tem baixo acoplamento.
d) Aumenta as chances de reuso.
e) Aumenta a possibilidade do uso da composição pelo fato de vc poder utilizar vários objetos diferentes mas do mesmo tipo (interface).
flws
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/06/2009 09:08:40
|
osmio
Java Ninja
Membro desde: 22/08/2006 20:27:54
Mensagens: 252
Offline
|
Bruno Laturner wrote:No segundo é menor o acoplamento pois as classes que chamam o método não precisam saber da existência de ClasseX
Tem certeza disso? rsrs
Bom, para as classes "chamadoras", não importa o que o método faz internamente. Porém, a pergunta sobre acoplamento é da classe que implementa o método.
Nesse caso, concordo com a resposta do rodrigoy.
A estrutura ao redor da implementação desse objeto teria que ser muito bem elaborada para que diminuisse o acoplamento.
Repare que eu disse "diminuir". Em ambas as situações, a dependencia ainda existirá.
Até.
This message was edited 1 time. Last update was at 02/06/2009 09:09:07
|
"O pensamento lógico pode levar você de A a B, mas a imaginação te leva a qualquer parte do universo."
- Einstein, Albert |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/06/2009 11:15:39
|
rylphs
Thread.start()
![[Avatar]](/images/avatar/69439823d43b4464cf6229e9f49eb510.png)
Membro desde: 09/04/2009 06:52:17
Mensagens: 37
Offline
|
Fernando Generoso da Rosa wrote:
Seguiria, se ClasseX fosse uma interface...
Fernando
Então o ideal é que eu sempre crie interfaces? Ou só em casos específicos?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/06/2009 12:17:17
|
cmoscoso
Virtual Machine Man
Membro desde: 23/10/2007 10:08:29
Mensagens: 687
Offline
|
O primeiro exemplo dói até na espinha. Chamar um método void num objeto recebido como parâmetro no mínimo é sinal que o design tem que melhorar.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/06/2009 12:29:03
|
rylphs
Thread.start()
![[Avatar]](/images/avatar/69439823d43b4464cf6229e9f49eb510.png)
Membro desde: 09/04/2009 06:52:17
Mensagens: 37
Offline
|
cmoscoso wrote:O primeiro exemplo dói até na espinha. Chamar um método void num objeto recebido como parâmetro no mínimo é sinal que o design tem que melhorar.
Isso foi só um exemplo mais curto. A questão é o que eu devo fazer quando me deparar com esse tipo de situação. Devo criar o objeto dentro da classe, delegar a criação à quem irá chamar o método, ou talvez isso dependa da situação? Gostaria de saber também sobre o uso de interfaces. Sempre devo criar interfaces? É isso que significa "Programe para uma interface, e não para uma classe"?
Mais uma vez, me desculpem por tantas perguntas, mas ainda tenho muito o que aprender.
Obrigado
This message was edited 1 time. Last update was at 02/06/2009 12:30:12
|
|
|
 |
|
|