Qual possui acoplamento menor?  XML
Índice dos Fóruns » Metodologias de Desenvolvimento e Testes de Software
Autor Mensagem
rylphs
HelloWorld
[Avatar]

Membro desde: 09/04/2009 06:52:17
Mensagens: 15
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.
rodrigoy
Virtual Machine Man
[Avatar]

Membro desde: 18/04/2006 01:06:28
Mensagens: 748
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 27/fev | Requisitos 02/mar | CSM 22/mar | OOAD-UML 05/abr

Goiânia: Scrum 05/mar | DDD 07/mar

Débito Técnico Blog: blog.aspercom.com.br
[WWW]
Bruno Laturner
Forum Spammer
[Avatar]

Membro desde: 18/02/2008 16:17:53
Mensagens: 2717
Localização: Cuiabá, MT
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
[WWW] [MSN]
Ferryman
JavaGuru
[Avatar]

Membro desde: 26/10/2006 16:30:23
Mensagens: 208
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


Jsigner - Engenharia reversa automática através do maven. Acesse http://code.google.com/p/jsigner
rylphs
HelloWorld
[Avatar]

Membro desde: 09/04/2009 06:52:17
Mensagens: 15
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.
fantomas
Forum Spammer
[Avatar]

Membro desde: 24/04/2008 16:10:55
Mensagens: 1253
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
rylphs
HelloWorld
[Avatar]

Membro desde: 09/04/2009 06:52:17
Mensagens: 15
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.
Andre Brito
Forum Spammer
[Avatar]

Membro desde: 21/07/2007 17:44:31
Mensagens: 1875
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?

"Já que o rei não vai virar humilde, eu vou fazer o humilde virar rei."
Emicida.

DuranServiceException
Science: If you ain't pissin' people off, you ain't doin' it right.

Ferryman
JavaGuru
[Avatar]

Membro desde: 26/10/2006 16:30:23
Mensagens: 208
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

Jsigner - Engenharia reversa automática através do maven. Acesse http://code.google.com/p/jsigner
Fernando Generoso da Rosa
JavaEvangelist

Membro desde: 14/01/2003 14:48:21
Mensagens: 462
Localização: Sombrio/SC
Offline

Ferryman wrote: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


Seguiria, se ClasseX fosse uma interface...

Fernando
[Email] [MSN]
fantomas
Forum Spammer
[Avatar]

Membro desde: 24/04/2008 16:10:55
Mensagens: 1253
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

osmio
JavaGuru
[Avatar]

Membro desde: 22/08/2006 20:27:54
Mensagens: 238
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
[Email]
rylphs
HelloWorld
[Avatar]

Membro desde: 09/04/2009 06:52:17
Mensagens: 15
Offline

Fernando Generoso da Rosa wrote:
Ferryman wrote: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


Seguiria, se ClasseX fosse uma interface...

Fernando



Então o ideal é que eu sempre crie interfaces? Ou só em casos específicos?
cmoscoso
Virtual Machine Man

Membro desde: 23/10/2007 10:08:29
Mensagens: 684
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.

http://twitter.com/cmoscoso
[Email]
rylphs
HelloWorld
[Avatar]

Membro desde: 09/04/2009 06:52:17
Mensagens: 15
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

 
Índice dos Fóruns » Metodologias de Desenvolvimento e Testes de Software
Ir para:   
Powered by JForum 2.1.8 © JForum Team