Избежание стандартного кода в отношениях один-к-одному
Хотя я программирую на 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();
Вам не нужно копировать все функции.
Обновление: этот рефакторинг обычно называется " Удалить посредника".