C++异步创建对象
问题描述:
的我现在有一个异步API,其中一个Manager类是负责创建A
类,B
,C
等创建是异步的其他对象,并且每次调用一个函数manager.createXXX()
将伴随其回调on_createXXX_done(A& a)
。C++异步创建对象
创建A
,B
,C
对象需要是连续的。而API的典型用法将涉及创建A
,并在其回调中触发创建B
等等。
这涉及到创建逻辑分裂成许多功能,我觉得很丑。此外,创建所有对象后需要执行的操作需要在最后创建的对象(C
)的回调中编码,即使该对象与要执行的操作之间没有直接关系。
生成器设计模式实际上并不适合,因为管理者不拥有的对象A
,B
,C
,它只是帮助上创建并返回它们。
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暴露愚蠢库,对不对?
在这种情况下使用什么样的好模式?
答
将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实例。
我不太同意这个解决方案。经理类可以创建更多的对象(或更少)。假设您有来自A - Z的对象。每个用例或场景都可以请求创建对象的任何子集。这使得你的解决方案变得不可能,因为你需要为每个子集创建一个UseCase类,所以N个子集(N = pow(2,集合中的对象数)) – FCR
决定是否必须创建单独的用例类或一般来处理所有情况。这取决于每个用例的复杂程度和它们的数量。 – GeorgeT