Избежание стандартного кода в отношениях один-к-одному

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

Решение

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

Как это:

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

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

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

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


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

Другие вопросы по тегам