2016-12-05 95 views
1

的我現在有一個異步API,其中一個Manager類是負責創建A類,BC等創建是異步的其他對象,並且每次調用一個函數manager.createXXX()將伴隨其回調on_createXXX_done(A& a)C++異步創建對象

創建A,B,C對象需要是連續的。而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暴露愚蠢庫,對不對?

在這種情況下使用什麼樣的好模式?

回答

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實例。

+0

我不太同意這個解決方案。經理類可以創建更多的對象(或更少)。假設您有來自A - Z的對象。每個用例或場景都可以請求創建對象的任何子集。這使得你的解決方案變得不可能,因爲你需要爲每個子集創建一個UseCase類,所以N個子集(N = pow(2,集合中的對象數)) – FCR

+0

決定是否必須創建單獨的用例類或一般來處理所有情況。這取決於每個用例的複雜程度和它們的數量。 – GeorgeT