Избежание шаблонного кода в отношениях один-к-одному - PullRequest
0 голосов
/ 06 марта 2011

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

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

1 Ответ

1 голос
/ 06 марта 2011

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

Как это:

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

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

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

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


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

...