C++异步创建对象

标签 c++ api asynchronous builder chaining

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

ABC 对象的创建需要按顺序进行。 API 的典型使用将涉及调用 A 的创建,并在其回调中触发 B 的创建,等等。

这涉及将创建逻辑拆分为许多函数,我觉得这很丑陋。此外,一旦创建了所有对象就需要执行的操作将需要在最后创建的对象 (C) 的回调中进行编码,即使该对象与要执行的操作。

Builder 设计模式实际上并不适用,因为管理器不拥有对象 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.
}

我还检查了 folly/futures 以链接异步操作,但这需要通过我们的公共(public) API 公开 folly 库,对吧?

在这种情况下使用什么模式比较好?

最佳答案

将 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 实例替换为以线程安全方式访问的对象池。

关于C++异步创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40978996/

相关文章:

c# - 如何在 C# 4.5 中将同步 4.0 转换为异步

c++ - 如何在 C++ 中执行跨平台异步文件 I/O

javascript - 如何检查 Facebook 粉丝专页是否被点赞

c++ - 这段C++代码有什么作用?

php - YouTube API 请求 : How could I get the Right token ( about Jim S. ' 代码 )

iphone - 如何处理应用程序中的 api token 过期

javascript - 如何在for循环中等待每次迭代并返回响应作为nodeJS中的API响应

javascript - 使用异步等待时无法获取对象的属性

c++ - ImageMagick- eclipse

c++ - 哪些 C/C++ 编译器可用于 VxWorks?