2012-07-10 2 views
0

컴포지션을 사용하여 다른 객체 내에서 속성으로 객체를 사용하거나 속성에서 메소드를 호출하는 것보다는 객체를 전반적으로 잘 결합하는 것이 다소 혼란 스럽습니다.작곡 대 감소 커플 링?

여기에 절충점이 있습니까?

아마도 차이점을 설명하기 위해 불량 커플 링 예제를 제공하는 것이 더 쉽습니다 (차이점이있을 경우)?

EDIT 예 :

public class MyClass(){ 
    MyOtherClass moc; 

    public MyClass(MyOtherClass temp){ 
     moc = temp; 
    } 

    public void method(){ 
     moc.call() 
    } 
} 

때문에 조성의 관계에 대한 종속성이 나쁜 커플 링 ?? 그렇지 않은 경우이 예에서 불량 커플 링이 무엇입니까? 클래스를 관련하는

+0

"전체적인 커플 링"이란 무엇입니까? 일반적으로 거의 모든 종류의 커플 링은 바람직하지 않습니다. –

+0

몇 가지 예를 들려주세요. – Nick

+0

예 : – mezamorphic

답변

1

두 가지 기본적인 방법은 두 클래스 사이의 상속 관계를 구축 .When inheritancecomposition, 당신은 dynamic bindingpolymorphism을 활용할 수 있습니다.

inheritance 관계로 인해 수퍼 클래스의 interface을 변경하는 것이 어려워지면 composition에서 제공하는 대체 방법을 살펴 보는 것이 좋습니다. 목표가 코드 재사용 인 경우 composition은 변경하기 쉬운 코드를 산출하는 접근 방식을 제공합니다. 미래의 어떤 시점에서, 그러나, 당신은 껍질의 반환 값을 변경하려면

class Fruit { 

// Return int number of pieces of peel that 
// resulted from the peeling activity. 
public int peel() { 

    System.out.println("Peeling is appealing."); 
    return 1; 
} 
} 

class Apple extends Fruit { 
} 

class Example1 { 

public static void main(String[] args) { 

    Apple apple = new Apple(); 
    int pieces = apple.peel(); 
} 
} 

() 예 1 직접 애플을 사용하여 명시 적으로 언급하지 비록 당신은 예 1 코드에 대한 코드를 깰 것, Peel를 입력합니다 과일.

Composition은 사과가 peel()이라는 과일의 구현을 재사용 할 수있는 대체 방법을 제공합니다. Apple은 Fruit을 확장하는 대신 Fruit 인스턴스에 대한 참조를 보유하고 Fruit에서 peel()을 호출하는 자체 peel() 메서드를 정의 할 수 있습니다. 여기 코드는 다음과 같습니다

class Fruit { 

// Return int number of pieces of peel that 
// resulted from the peeling activity. 
public int peel() { 

    System.out.println("Peeling is appealing."); 
    return 1; 
} 
} 

class Apple { 

private Fruit fruit = new Fruit(); 

public int peel() { 
    return fruit.peel(); 
} 
} 

class Example2 { 

public static void main(String[] args) { 

    Apple apple = new Apple(); 
    int pieces = apple.peel(); 
} 
} 

Inheritance 당신에게 Composition보다 높은 커플 링을 제공합니다.

+0

나는 약간의 안경을 예전에 보았고 상속의 "위험"을 전파하는 위험을 안다.그렇다면 컴포지션을 사용하는 것이 좋습니다.이 기술은 잘못된 커플 링이 아닙니까? – mezamorphic

+0

@Porcupine 두 개의 객체가 실제로 결합되어 있다면 그것을 피할 수는 없지만 네 구성이 상속보다 선호됩니다. – amicngh

+0

정상적인 커플 링은 순수 주의자들이 싫어하는 것 중 하나 인 '악마'가 아닙니다. – mezamorphic

1

불량/양호 커플 링 대신 가장 느슨한 커플 링이 가장 보편적 인 것으로 보이며 느슨하게 결합 된 오브젝트가 선호됩니다. 당신의 예에서, 단단한 커플 링 (그림 추가 기능과) 같은 것을 할 수 있습니다 : 여기

public class MyClass() 
{ 
    MyOtherClass moc; 
    public MyClass(MyOtherClass temp) 
    { 
     moc = temp; 
    } 

    public void method() 
    { 
     for (int i = 0; i < moc.items.Count; i++) 
     { 
      moc.items[i].Price += 5; 
     } 
    } 
} 

를, MyClass의는 MyOtherClass (항목의 목록, 비용 등의 구현의 특정 구현 세부 사항에 따라 달라집니다 ..). 이런 유형의 시나리오를 다루기 위해 좀 더 느슨하게 결합 된 방법은 그 논리를 MyOtherClass의 함수로 옮기는 것입니다. 그렇게하면 MyOtherClass의 모든 구현 세부 사항이 MyClass에서 숨겨지고 MyClass와 독립적으로 변경할 수 있습니다.

관련 문제