C++ 类接口复制

C++ 类接口复制,c++,testing,design-patterns,C++,Testing,Design Patterns,我有时会遇到这样的情况,主要是在处理旧代码时,一个类只是将调用转发给另一个类。假设有一个旧的控制器控制一些东西,但是其中一些可以专用于一个新类。现在,旧的控制器将调用新的类接口 前 现在,当考虑测试软件时,可能需要在这两个类中测试接口,而在控制器中则更难,因为在控制器测试中检查工作人员更改是必要的 这种用法是否特别糟糕,或者在已经存在的代码中使用这种设计是否可以,如上所述 谢谢很难回答这个代码是好是坏——这取决于具体情况。所讨论的代码(除了m_Wrk字段应该是指针这一事实)是一种模式,这是一种模

我有时会遇到这样的情况,主要是在处理旧代码时,一个类只是将调用转发给另一个类。假设有一个旧的控制器控制一些东西,但是其中一些可以专用于一个新类。现在,旧的控制器将调用新的类接口

现在,当考虑测试软件时,可能需要在这两个类中测试接口,而在控制器中则更难,因为在控制器测试中检查工作人员更改是必要的

这种用法是否特别糟糕,或者在已经存在的代码中使用这种设计是否可以,如上所述


谢谢

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

例如,如果你写了一个C++库,并且你想提供一个稳定的ABI,如果公共接口没有变化,它就不会改变,你可以把“<代码>控制器< /Cult>接口放在头中,连同前面的代码< Works> Works/Cuffo>类一起声明,并将

Worker
的接口和实现放在
.cpp
文件中。当
工作者
发生变化时,
控制器
ABI保持不变。如果实现细节直接放在
Controller
类中,则ABI可能会更改

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

另外,如果
控制器
实现了与
工作者
相同的接口,那么将来它可以实现一些额外的行为,比如在模式中


如果其中一种情况发生在您的项目中(或者将来可能发生),那么这可能是一个好代码。如果没有,这只是一个不必要的复杂问题。

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

例如,如果你写了一个C++库,并且你想提供一个稳定的ABI,如果公共接口没有变化,它就不会改变,你可以把“<代码>控制器< /Cult>接口放在头中,连同前面的代码< Works> Works/Cuffo>类一起声明,并将

Worker
的接口和实现放在
.cpp
文件中。当
工作者
发生变化时,
控制器
ABI保持不变。如果实现细节直接放在
Controller
类中,则ABI可能会更改

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

另外,如果
控制器
实现了与
工作者
相同的接口,那么将来它可以实现一些额外的行为,比如在模式中


如果其中一种情况发生在您的项目中(或者将来可能发生),那么这可能是一个好代码。如果没有,这只是一个不必要的复杂问题。

我说的
m_Wrk
应该是指针吗?打字错误。不一定,这不是一个PIMPL吗。我想我正在努力理解这个问题。现在,当考虑测试软件时,可能需要在这两个类中测试接口,而在控制器中则更难,因为这主要是因为需要在控制器测试中检查工作更改。这种用法是否特别糟糕,或者在上面解释的已经存在的代码中使用这种设计是否可以。我认为
m_Wrk
应该是指针吗?打字错误。不一定,这不是一个PIMPL吗。我想我正在努力理解这个问题。现在,当考虑测试软件时,可能需要在这两个类中测试接口,而在控制器中则更难,因为这主要是因为需要在控制器测试中检查工作更改。这种用法是否特别糟糕,或者在已经存在的代码中使用这种设计是否可以,如上所述。
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
    }
};