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
}
};