C ++异步创建对象

时间:2016-12-05 16:36:53

标签: c++ api asynchronous builder chaining

我目前有一个异步API,其中一个Manager类负责创建类ABC等其他对象。创建是异步的,每次调用都是函数manager.createXXX()将伴随其回调on_createXXX_done(A& a)

ABC对象的创建需要是顺序的。 API的典型用法包括调用A的创建,并在其回调中触发B的创建,依此类推。

这涉及将创建逻辑拆分成许多函数,我觉得这很难看。此外,创建所有对象后需要执行的操作将需要在最后创建的对象(C)的回调上进行编码,即使该对象与要执行的操作之间没有直接关系也是如此

构建器设计模式实际上并不合适,因为管理器不拥有对象ABC,它只是帮助创建并返回它们。

void on_creationA_done(A& a)
{
    m_a = a;
    //Trigger next creation
    m_manager.createB()
}
void on_creationB_done(B& b)
{
    m_b = b;
    //Trigger next creation
    m_manager.createC()
}

void on_creationC_done(C& c)
{
    m_c = c;
    //No more creations are needed. Just perform some post-creation actions  
    do_something() // This needs to be called once all A, B, C are created.
}

我还检查了愚蠢/期货以链接异步操作,但这会涉及通过我们的公共API暴露愚蠢的库,对吗?

在这种情况下使用什么样的好模式?

1 个答案:

答案 0 :(得分:0)

在回调中链接A,B,C创建似乎有点限制(而且不可扩展)。如果将来需要实现更多用例,则必须在回调中处理它们,使代码过于复杂且不直观。

当前案例是一个特定的用例,应该在另一个管理器类的帮助下处理,我们称之为UseCaseABC,它知道用例的特定要求,约束等。

在UseCaseABC类中,您可以跟踪A,B,C对象的创建,并在存在所有三个对象时调用do_something。

class UseCaseABC
{

    void on_creationA_done(A& a) 
    {
       m_A = a;
       NotifyCreation();
    }
    void on_creationB_done(B& b) 
    {
       m_B = b;
       NotifyCreation();
    }
    void on_creationC_done(C& c) 
    {
       m_C = c;
       NotifyCreation();
    }    

    void NotifyCreation()
    {
       if (all three objects created)
       {
           do_something();

           ClearABCMembers();
       }
    }
}

如果许多客户端异步触发A,B,C对象的创建,则可以用线程安全方式访问的对象池替换m_A,m_B,m_C实例。