2012-05-21 3 views
2
//Ex1: (passing by object) 
class A { 
} 

class B { 
    void foo(A a) { 
     <do something with a> 
    } 
} 

//Ex2: (composition) 
class C { 
    A a 
    void foo(){ 
     <do something with a> 
    } 
} 

제 질문은 어떤 패턴이 더 낮은 커플 링입니까? 그리고 어떤 패턴이 현실 세계에서 더 선호됩니까?자바에서 결합력이 낮은 패턴 : 객체를 메소드에 전달하거나 컴포지션을 사용합니까?

+0

상황에 따라 각각의 장점/약점이 있습니다 –

+1

개체를 전달하면 모든 메서드 호출마다 다른 개체를 전달할 수 있습니다. 따라서 속성을 갖는 것과 의미 적으로 차이가 있습니다. "결합력 저하"는 무엇을 의미합니까, btw? 동일한 문제를 풀려고하면 속성을 사용하여 다른 A를 먼저 사용하기 전에 항상 세터를 호출해야합니다. –

+1

클래스 B를 선호하지만 foo에 A를주는 대신 A로 구현 된 인터페이스를 제공 할 것입니다. 그런 식으로 결합 될 가능성은 낮습니다. –

답변

0

나는 둘 다 커플 링이 낮다고 말하고 싶습니다. 더 많은 구현에 의존합니다. 커플 링에 대한 가장 간단한 설명은 클래스 A의 속성이 변경되면 클래스 B를 얼마만큼 변경해야하는지입니다.이 경우 foo 메서드는 대부분 두 시나리오에서 동일한 변경을 수행해야합니다.

현실 세계와 마찬가지로 상황에 완전히 의존합니다. 클래스 A는 클래스 B에서만 사용됩니까? 그것은 웹 응용 프로그램인가요? A 클래스를 주입하거나 배출해야합니까? A가 싱글 톤이 될 것입니까? B 급은 무엇을 사용합니까? 각 클래스는 무엇을합니까?!

요약하면 각 클래스의 기능과 사용 방법 (응집력이 들어오는 지점)을 살펴볼 때까지는 논쟁을 할 수 없습니다. 때문에

0

이럴 두 번째 옵션 (구성)이 바람직하다 :

  • 발신자이 알 필요가 없습니다에 대한 A
  • B 이외의 클래스를 사용하는 구현을 변경하는 무료 A (호출 코드에 영향을 미치거나 다시 컴파일하지 않고)

첫 번째 옵션 (객체 전달)은 호출간에 더 큰 결합을 만듭니다. 그리고 A (비록 B이 어느 방향으로도 연결되어 있음).

1

루스 커플 링을 설명하려고합니다.

  1. 런타임에 동일한 인터페이스를 구현하는 다른 유형의 객체를 전달할 수있는 인터페이스의 프로그램이며, 여기에서 다른 상속 트리의 클래스는 동일한 인터페이스를 구현할 수 있습니다.

예 :

Animal is the Interface 

    Dog class implements Animal 
    Cat class implements Animal 
    Lion class implements Animal 

    ///////////////// 
    calling method 
    ///////////////// 

    callAnimal(new Dog); 



    ///////////////// 
    called method 
    ///////////////// 

    public void (Animal a){ 

    // some code 

    } 

변경이 올 때 쉽게 할 수 있도록, 추상 클래스, 또는 인터페이스로 .... 계속 변화 동작을 캡슐화하고,이 느슨하게 결합 될 때,있다 코드가 깨질 가능성이 적습니다.