Je viens de me faire brûler par un bug qui est en partie dû à mon manque de compréhension, et en partie à cause de ce que je pense être un design sous-optimal dans notre base de code. Je suis curieux de savoir comment ma solution de 5 minutes peut être améliorée.Meilleure pratique pour l'idiome de référence scopé?
Nous utilisons des objets comptés par ref, où nous avons AddRef() et Release() sur les objets de ces classes. Un objet particulier est dérivé de l'objet ref-count, mais une fonction commune pour obtenir une instance de ces objets (GetExisting) cache un AddRef() en lui-même sans annoncer qu'il le fait. Cela nécessite de faire une Release à la fin du bloc fonctionnel pour libérer l'objet caché, mais un développeur qui n'a pas inspecté l'implémentation de GetExisting() ne le saurait pas, et quelqu'un qui oublie d'ajouter une Release à la fin de la fonction (disons, au cours d'une course folle de temps de crunch de correction de bugs) fuit des objets. Ceci, bien sûr, était ma brûlure. J'ai donc écrit une petite classe pour éviter la nécessité de Release() à la fin de ces fonctions.
class ThreadContainer
{
private:
ThreadClass *m_T;
public:
ThreadContainer(Thread *T){ m_T = T; }
~ThreadContainer() { if(m_T) m_T->Release(); }
ThreadClass * Thread() const { return m_T; }
};
Alors que maintenant je peux faire ceci:
void SomeFunction(ProgramStateInfo *P)
{
ThreadContainer ThreadC(ThreadClass::GetExisting(P));
// some code goes here
bool result = UseThreadSomehow(ThreadC.Thread());
// some code goes here
// Automagic Release() in ThreadC Destructor!!!
}
Ce que je n'aime pas est que pour accéder au pointeur de fil, je dois appeler une fonction de membre de ThreadContainer, Fil() . Y a-t-il un moyen astucieux de nettoyer cela pour qu'il soit syntaxiquement plus joli, ou est-ce que quelque chose comme ça obscurcirait la signification du conteneur et introduirait de nouveaux problèmes pour les développeurs qui ne connaissent pas le code?
Merci.
La réponse de Mark Ransom était ce que je voulais, mais votre réponse me pousse vers une bonne direction d'apprentissage de nouvelles des trucs et une solution de niveau supérieur au problème global, donc je vais le marquer comme "La" réponse. Merci. –
Content d'entendre. Vous êtes les bienvenus. Il est vraiment préférable d'utiliser une classe de genre pour toutes les choses similaires à la place d'écrire une solution séparée pour chacun d'eux. – bayda