c++ - 避免一对一关联关系中的样板代码

标签 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 中。

这只是我们必须处理的事情吗?或者有解决这些情况的方法吗?

最佳答案

嗯。针对这种特殊情况。为什么不简单地实现 Tab::getTabbable()

像这样:

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

然后用户可以:

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

您不必复制所有功能。


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

关于c++ - 避免一对一关联关系中的样板代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5212609/

相关文章:

c++ - 使用OpenCv的矩阵运算(加法和减法)OpenCV C++

c++ - Lambda、局部类型和全局命名空间

python - 长字典属性行的重构

Javadoc 不匹配代码

python - 将属性重命名为 _property 的原因

c++ - 为 Mac OS X 修改旧的 Windows 程序

c++ - 从 Qt4 运行 Linux 命令

database - 什么时候/为什么我应该开始使用数据库?

c++ - 代表模板类型的名称应该是单个字符吗?

C# 可选参数或方法重载?