2011-03-06 5 views
0

저는 C++로 프로그래밍하고 있지만 디자인에 대한 일반적인 질문입니다.일대일 연결 관계에서 상용구 코드 피하기

개체가 일대일 연결 관계에있을 때, 그 사이에 많은 일반적인 메서드가있는 경향이있어 본질적으로 내부 클래스의 메서드를 직접 호출하는 상용구 코드로 이어지는 경향이 있습니다.

예를 들어, 나는 탭을 나타내는 Tab이라는 클래스와 해당 위젯을 가지고 있습니다. 객체가 상속받을 수있는 Tabbable 클래스가 있으므로 탭에 표시 할 수 있습니다. 그런 다음 Tab은이 Tabbable 개체를 가져 와서 올바르게 렌더링 할 수 있습니다. 이 두 클래스에는 예를 들어 제목이나 아이콘과 관련된 많은 유사한 메서드가 있습니다.

class ITabbable { 
    public: 
    ITabbable(); 
    virtual ~ITabbable(); 

    virtual string getTitle() = 0; 
    virtual widget getContentWidget() = 0; 


    // etc... 
} 


class Tab { 
    public: 
    Tab(ITabbable* tabbableObject); 


    // lots of boilerplate code: 
    string getTitle() { 
     return m_tabbableObject->getTitle(); 
    } 

    widget getContentWidget() { 
     return m_tabbableObject->getContentWidget(); 
    } 

    // etc... 

    private: 
    ITabbable* m_tabbableObject; // association relationship 
} 

많은 코드가 중복되어 불필요한 것으로 보입니다. TabTab에 넣을 수 없으므로 상속을 확실히 사용할 수 없습니다.

이것은 우리가 처리해야 할 대상입니까? 아니면 이러한 상황을 해결할 수있는 방법이 있습니까?

답변

1

음. 이 특별한 상황에. 단순히 Tab::getTabbable()을 구현하지 않는 이유는 무엇입니까? 이처럼

:

const ITabbable* Tab::getTabbable() const { return m_tabbableObject; } 

그런 다음 사용자가 수행 할 수

const ITabbable* obj = tab->getTabbable(); 
string title = obj->getTitle(); 

당신은 모든 기능을 복제 할 필요가 없습니다.


업데이트 :이 리팩터링은 일반적으로 Remove Middle Man이라고합니다.

+0

매우 간단하고 우아한 덕분입니다! –

관련 문제