Избегайте шаблонного кода в однозначных отношениях ассоциации

Хотя я программирую на 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
}

Много кода дублируется и кажется ненужным. Наследование здесь определенно не работает, потому что вы не можете поместить Tab в Tab.

Это просто то, с чем мы должны иметь дело? Или есть способы обойти эти ситуации?


person Alexander Kondratskiy    schedule 06.03.2011    source источник


Ответы (1)


Хорошо. К этой конкретной ситуации. Почему бы просто не реализовать Tab::getTabbable()?

Нравится:

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

Затем пользователи могут:

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

Вам не нужно копировать все функции.


Обновление: этот рефакторинг обычно называется Удаление среднего человека.

person Johan Kotlinski    schedule 06.03.2011