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