类接口重复

Class interface duplication

本文关键字:接口      更新时间:2023-10-16

我有时会遇到,主要是在使用旧代码时,一个类仅仅是将呼叫的转发到另一个班级的情况。想象一下,有一个旧的控制器可以控制一些部分,但是其中一些可以专用于新课程。现在,旧控制器将调用新类接口。

ex。

class Controller {
  public:
    void addObject(const std::string & id,
      const Object * obj) {
      m_Wrk.addObject(id, obj);
    }
  private:
    Worker m_Wrk;
};
class Worker {
  public:
    void addObject(const std::string & id,
      const Object * obj) {
      //do actual adding
    }
};

现在,在考虑测试软件时,可能需要在两个类中对接口进行测试,并且在控制器中更难,因为它并不是因为它不需要检查控制器测试的工作者更改。

这种用法特别糟糕,还是可以在已经存在的代码中使用此类设计,如上所述。

谢谢

很难回答此代码是好还是坏 - 取决于情况。所讨论的代码(除了m_Wrk字段应该是指针的事实)是PIMPL模式,它是一种桥梁模式。该模式用于分裂抽象和实现,以便它们可以独立更改。

例如,如果您编写了C 库,并且您想提供一个稳定的ABI,如果没有公共接口没有更改,则可以将Controller接口放入标题中,并将Worker类的插入,并将Worker的接口和实现放在.cpp文件中。当Worker更改时,Controller ABI保持不变。如果将实现详细信息直接放在Controller类中,则ABI可能会更改。

此外,这种模式(通常是桥梁)允许您使用给定的抽象的不同实现,因此,可以根据liskov替换的接口扩展和继承分离继承。

另外,如果Controller实现与Worker相同的接口,将来它可以实现一些其他行为,例如代理模式。

如果其中一种情况发生在您的项目中(或将来可能发生),则可能是一个很好的代码。如果没有,那只是一个不必要的并发症。