c++ - 将线程逻辑与业务逻辑解耦?

标签 c++ multithreading unit-testing tdd

将线程逻辑与业务逻辑结合起来是常见的做法吗?我问的是测试驱动开发,想知道测试与线程逻辑相关的商业智能是否有好处/缺点。考虑以下几点,

class Thread { ... }
class FooThread : public Thread {
  /* business intelligence coupled to threading */
}

或者,

class Thread { ... }
class Foo {
  ...
  /* once again coupled */
  Thread th;
}

这些方法似乎在某种程度上不利于在测试类时抽象出依赖关系。是否可以/可以接受设计一个可以与线程完全解耦实例化的类,也许可以使用模板?

template<class SomeFooClass>
class Thread { ... }

class Foo { 
  /* this class can be tested separately */
}

typedef Thread<Foo> FooThread;

这样做有什么好处/缺点吗?是否可以使用相同的方法将业务逻辑与其他常见设计模式分离?

最佳答案

线程和其他计算效果往往会让单元测试作者头疼。如果可以的话,请将线程管理封装起来,远离被测试的业务逻辑。

如果您正在寻找有关如何做到这一点的想法,请考虑创建一个表示线程可能执行的工作的类型(该类型可以是 Functor、成熟的类,或者可能只是一个函数指针。)

将“纯”业务逻辑放入此“可运行”类型的实例中,并在此接口(interface)上进行测试。然后,您可以实现一个可重用的线程池,它(比如说)接受队列中的这些可运行对象并执行每个线程。这种模式可以有多种变化;我建议在 boost 库中查找现有的实现。

这种分离通常不会让您免于同步的负担,这通常是一个跨领域的问题。锁有一种进入原本干净的业务逻辑的方式。您可以尝试通过模拟它们来处理它们,或者尝试通过序列化访问(例如,根据具体情况)完全消除锁定。具有专用的“代理”线程和可运行队列。

关于c++ - 将线程逻辑与业务逻辑解耦?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15694541/

相关文章:

ios - 使用 OCUnit 对 keyWindow 进行单元测试会抛出错误

silverlight - MS Fakes - 未在/reference 选项中指定 extern 别名

c++ - haskell 中用多态性替换条件的等效模式是什么?

c++ - 编译器如何定义 type_traits 中的类?

c++ - 检查 cv::mat 的所有元素是否为正或等于 0

java - 如何创建 boolean 方法以从处理程序返回值

Python:从Thread调用时解密失败或错误记录mac

c++ - 使用 Atomic Builtins 旋转线程屏障

java - DBUnit,运行插入选择语句

C++ 如何在文本文件中搜索特定整数的出现次数?