Bonjour à tous,
J'implémente un pattern très près de celui nommé "Observateur/Observable".
Voici les règles :
- L'observateur démarre un thread et poll l'observable.
- Si l'observable est disponible, alors il s'y attache via la fonction Attach(). Sinon, il ré-essaye quelques secondes plus tard. Vous aurez donc compris que l'obersavateur nécessite un pointeur vers l'observable.
- L'observateur peut se détacher de l'observable quand il le désire, via une fonction Detach() que l'observable met à sa disposition.
- Lorsque l'observateur est détruit (destructeur), il doit impérativement se détacher de l'oberservable, si il y était attaché.
- Lorsque l'observable est détruit (destructeur), il doit impérativement détacher tous ses observateurs.
Dison qu'un Observateur doit toujours dériver de CObservateurBase.
Dison qu'un Observable doit toujours dériver de CObservableBase.
Voilà où j'ai un petit problème. Le détachement !
Lorsqu'un observateur est détruit, alors il est simple de le forcer à se détacher via son destructeur dans CObservateurBase.
Par contre, lorsqu'un Observable est détruit, on peut aussi détacher tous ses observateur dans son destructeur dans CObservableBase. Mais, que se passe-t-il avec les observateurs qui le poll encore, leur pointeurs de type CObservableBase n'est plus valide !
Alors, que devrais-je faire ?
- Dériver le CObservableBase de enable_shared_from_this et de lors de l'attachement d'un observateur, on lui remet un shared_ptr ? Ce qui prolongera la vie de l'observable aussi longtemps qu'un observateur y sera connecté ?
- Emmetre une exception/assert dans le destructeur de CObservableBase lorsqu'il reste des Observateur encore connecté ? J'avoue ne pas trop aimer déclancher une exception dans un destructeur de toute façon, mais au moins cela indique au programmeur qu'il a fait une bourde !
- Présumer que l'observable aura toujours une vie plus longue que ses observateur ?
Merci
Partager