c++ - 类接口(interface)重复

标签 c++ testing design-patterns

我有时会遇到这样的情况,主要是在使用旧代码时,一个类只是将调用转发给另一个类。想象一下,有一个旧 Controller 可以控制某些东西,但其中一些可以专用于新类。现在,旧 Controller 将调用新类接口(interface)。

例。

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

现在,在考虑测试软件时,接口(interface)可能需要在两个类中进行测试,而在 Controller 中更难,因为它不需要检查 Controller 测试中的 worker 更改。

这种用法是否特别糟糕,或者可以在上面解释的现有代码中使用这种设计。

谢谢

最佳答案

很难回答这段代码是好是坏——这取决于环境。有问题的代码(除了 m_Wrk 字段应该是一个指针这一事实)是一个 PImpl模式,这是一种 bridge图案。此模式用于拆分抽象和实现,以便它们可以独立更改。

例如,如果您编写一个 C++ 库,并且希望提供一个稳定的 ABI,如果公共(public)接口(interface)没有变化,该 ABI 也不会改变,您可以将 Controller 接口(interface)放在header,连同Worker类的前向声明,并将Worker的接口(interface)和实现放在.cpp文件中。当 Worker 改变时,Controller ABI 保持不变。如果将实现细节直接放在 Controller 类中,ABI 可能会发生变化。

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

此外,如果 Controller 实现与 Worker 相同的接口(interface),将来它可以实现一些额外的行为,例如 proxy模式。

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

关于c++ - 类接口(interface)重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41015237/

相关文章:

c++ - 使用 opencv/c++ 应用 canny 边缘检测器后出现 "Unhandled exception"错误

python - test_urls.py 和 test_views.py 的区别

ios - 如何使用 UIAutomatoin 的 javascript(iOS) 控制应用程序流程?

java - 为什么对象在单例模式中是静态的?

oop - DDD - 应如何设计域规则,以便上层知道规则何时被破坏?

c++ - 从容器中获取前 5 名算法?

c++ - 如何查找进程中单个线程的 CPU 使用率

c++ - sigqueue 可以与 pthreads 一起使用吗?

unit-testing - 使用 TFS 进行自动化测试 - 在所有已注册代理上全面运行测试

android - 使用 Retrofit Android 对多个 API 进行常见成功/失败/错误处理的良好设计