以一对一的关联关系避免样板代码

时间:2011-03-06 18:46:20

标签: c++ refactoring coding-style boilerplate

虽然我是用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 个答案:

答案 0 :(得分:1)

好。对于这种特殊情况。为什么不简单地实施Tab::getTabbable()

像这样:

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

然后用户可以这样做:

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

您无需复制所有功能。


更新:此重构通常称为Remove Middle Man