2016-12-05 11 views
1

я в настоящее время асинхронный API, где класс менеджер несет ответственность за создание других объектов класса A, B, C и т.д. Создание является асинхронным, и каждый вызов функции manager.createXXX() будет сопровождаться его обратный вызов on_createXXX_done(A& a).C++ Асинхронный создание объектов

Создание объектов A, B, C должно быть последовательным. И типичное использование API будет включать в себя вызов создания A и его обратного вызова, инициирующего создание B и т. Д.

Это связано с тем, что логика создания разделена на многие функции, которые я считаю уродливыми. Кроме того, операции, которые должны выполняться после создания всех объектов, должны быть закодированы при обратном вызове последнего созданного объекта (C), даже если нет прямой связи между этим объектом и выполняемой операцией.

Дизайн шаблона Builder на самом деле не подходит, поскольку менеджер не владеет объектами 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. 
} 

Я также проверил Folly/фьючерсы на операцию асинхронных цепей, но что бы участием обнажая библиотеки глупости через наш общественный 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(); 
     } 
    } 
} 

Если создание объектов А, В, С запускается асинхронно многими клиентами, вы можете заменить экземпляры m_a, M_B, M_C от пула объектов, доступ в потокобезопасном способе.

+0

Я не совсем согласен с решением. Класс менеджера может создавать больше объектов (или меньше). Допустим, у вас есть объекты из A-Z. Каждый вариант использования или сценарий может запрашивать создание любого подмножества объектов. Это делает ваше решение невозможным, так как вам нужно создать класс UseCase для каждого подмножества, поэтому N подмножеств (являющихся N = pow (2, количество объектов в наборе)) – FCR

+0

Вам решать, нужно ли создавать отдельный прецедент классы или общие для обработки всех случаев. И это зависит от сложности каждого варианта использования и их количества. – GeorgeT

 Смежные вопросы

  • Нет связанных вопросов^_^