Singleton et bibliothèque dynamique

Singleton et bibliothèque dynamique - C++ - Programmation

Marsh Posté le 30-07-2010 à 12:26:35    

Bonjour,
 
J'ai une classe singleton qui me permet d'écrire des logs dans une console.
Dans mon appli je charge dynamiquement du code (dll), et cette dll écrit des choses via la classe de log.
Le problème est que ce code chargé dynamiquement crée une nouvelle instance de mon singleton, au lieu d'utiliser celle déjà existante.
 
Y a-t-il moyen de régler ce problème ?


---------------
Be the one with the flames.
Reply

Marsh Posté le 30-07-2010 à 12:26:35   

Reply

Marsh Posté le 30-07-2010 à 13:56:48    

ne pas utiliser de singleton. c'ets l'anti-pattern absolu qui ne résout jamais rien.

Reply

Marsh Posté le 30-07-2010 à 14:24:31    

Ok, tu aurais une piste pour faire ce que je veux ?


---------------
Be the one with the flames.
Reply

Marsh Posté le 30-07-2010 à 14:47:47    

Joel F a écrit :

ne pas utiliser de singleton. c'ets l'anti-pattern absolu qui ne résout jamais rien.


 
C'est l'exemple canonique du pattern dont certains abusent, je suis d'accord.  Mais anti-pattern absolu me semble trop fort.  Surtout dans ce contexte qui est un des cas ou le singleton a du sens (meme si personnellement j'ai tendance a proposer une API avec une classe monostate ou meme simplement procedurale plutot que d'exposer le singleton qui se trouve eventuellement derriere)
 

Riot a écrit :

Ok, tu aurais une piste pour faire ce que je veux ?


 
Sans voir ton code, c'est difficile de trouver la cause.  En prime, suivant comment tu implementes le singleton les differences entre DLL de Windows et objets partages d'Unix entrent peut-etre en jeu et je connais mal Windows.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 30-07-2010 à 14:55:37    

Un Programmeur a écrit :

Sans voir ton code, c'est difficile de trouver la cause.  En prime, suivant comment tu implementes le singleton les differences entre DLL de Windows et objets partages d'Unix entrent peut-etre en jeu et je connais mal Windows.


Je code sous Windows effectivement, et le code de mon singleton est vraiment basique, du genre :
 

Code :
  1. // decl
  2.     class Log
  3.     {
  4.     public:
  5.       static Log* getInstance();
  6.       static void destroy();
  7.       void write( const std::string& );
  8.    
  9.     private:
  10.       static Log* p_instance;
  11.    
  12.       Log();
  13.       ~Log();
  14.     };
  15.    
  16.     // impl
  17.     Log* Log::p_instance = 0;
  18.    
  19.     Log* Log::getInstance()
  20.     {
  21.       if( !p_instance )
  22.         p_instance = new Log();
  23.       return p_instance;
  24.     }
  25.    
  26.     void Log::destroy()
  27.     {
  28.       if( p_instance )
  29.         delete p_instance;
  30.     }
  31.     void write( const std::string& msg )
  32.     {
  33.       std::cout << msg << std::endl;
  34.     }
  35.    
  36.     Log::Log()
  37.     {
  38.     }
  39.    
  40.     Log::~Log()
  41.     {
  42.     }


Message édité par Riot le 30-07-2010 à 14:56:16

---------------
Be the one with the flames.
Reply

Marsh Posté le 30-07-2010 à 15:16:44    

Si le code suivant impl est dans un CPP et linke qu'une fois, je ne vois pas de probleme.  (Il me semble me souvenir, mais je peux me tromper, que ca implique sous Windows qu'il soit dans une DLL a part du programme principal et de la DLL chargee dynamiquement et qu'il faut aussi une serie d'annotation pour que les fonctions publiques soient bien exportees -- sous Unix en general tout est exporte par defaut)


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 30-07-2010 à 18:27:46    

Merci beaucoup, ça fonctionne. Mon Logger était compilé dans une lib statique. :jap:


---------------
Be the one with the flames.
Reply

Marsh Posté le 02-08-2010 à 09:19:19    

Intéressant, je note !


---------------
Be the one with the flames.
Reply

Marsh Posté le 18-08-2010 à 23:53:10    

Joel F a écrit :

ne pas utiliser de singleton. c'ets l'anti-pattern absolu qui ne résout jamais rien.


comment gérer les classes ou l'on ne veut qu'une seule instance dans le programme , et où l'on souhaite y accéder à droite et à gauche ? le singleton
est tellement pratique dans ces cas là :/


---------------
.
Reply

Marsh Posté le 18-08-2010 à 23:53:10   

Reply

Marsh Posté le 19-08-2010 à 07:59:07    

tu veux une seule instance ? tu n'en crée que une.  
Tu veux l'utiliser à droite à gauche, et bien, les paramètres de fonctions/méthodes ne sont pas la pour rien.

Reply

Marsh Posté le 19-08-2010 à 08:51:30    

Joel F a écrit :

tu veux une seule instance ? tu n'en crée que une.  
Tu veux l'utiliser à droite à gauche, et bien, les paramètres de fonctions/méthodes ne sont pas la pour rien.


 
Pour un logger?


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 19-08-2010 à 08:53:22    

comme je l'aideja dit (ici ou ailelurs je ne sais plus) , le logger c'ets bien le seul cas ou le singleton a peut etre un sens. Encore que pour moi, les logger j'aime bien en avoir diverses instacnes avec diverses réglages etc ...

Reply

Marsh Posté le 19-08-2010 à 09:43:26    

Joel F a écrit :

comme je l'aideja dit (ici ou ailelurs je ne sais plus) , le logger c'ets bien le seul cas ou le singleton a peut etre un sens.


 
 
Les factories sont un autre cas.  Un gestionnaire de configuration aussi.
 
Si tu as un interpreteur embarque dans ton application, il est aussi souvent unique ou du moins il y en a un principal qui est reference un peu partout (meme si je ne concevrais pas un interpreteur comme singleton, je vois bien un singleton permettant d'y acceder).
 

Citation :

Encore que pour moi, les logger j'aime bien en avoir diverses instacnes avec diverses réglages etc ...


 
Je prefere un argument au log qui choisit une configuration nommee pour ca.  Entre autres parce que passer tes differentes instances configurees differemment un peu partout est encore plus lourd que d'y passer un logger unique.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 20-08-2010 à 21:50:37    

autrement dit en quoi le pattern est il l'atii pattern tant décrié


---------------
.
Reply

Marsh Posté le 21-08-2010 à 10:11:34    

en ce que les gens en mettes partout ou il n'a pas de sens. Donc en general, on réfléchi avant de vraiment trouver que y a que ça pour résoudre un probleme.

Reply

Marsh Posté le 21-08-2010 à 10:24:27    

dans mes applis bien souvent j'ai ma classe main qui est un singleton dans laquelle j'aggrège d'autres objets, tout ces objets n'ont vocation qu'à avoir une seule instance dans le programme, comme une liste de connexion , une connexion à une Bdd etc, ça marche bien en multi thread et c'est très pratique de pouvoir avoir accés simplement à tous ces objets dans le thread de la gui dans les thread socket etc
 


---------------
.
Reply

Marsh Posté le 21-08-2010 à 12:16:55    

tu fait du JAVA donc ...

Reply

Marsh Posté le 21-08-2010 à 15:51:04    

Joel F a écrit :

tu fait du JAVA donc ...


 
pourquoi?

Reply

Marsh Posté le 21-08-2010 à 18:09:08    

tu parles d'une classe main ...

Reply

Marsh Posté le 21-08-2010 à 18:54:30    

une classe main = une classe centrale, qui contient en membre donné tous les objets importants de l'appli, c'est une manière révolutionnaire de faire les applis imo


---------------
.
Reply

Marsh Posté le 21-08-2010 à 21:50:07    

Glock 17Pro a écrit :

une classe main = une classe centrale, qui contient en membre donné tous les objets importants de l'appli, c'est une manière révolutionnaire de faire les applis imo


 
Un truc qui est déclaré en global mais qu'on n'a pas le droit de faire mais qui marche trop bien?

Reply

Marsh Posté le 21-08-2010 à 22:42:58    

ouais ca evite de reflechir au design, tu peux ecrire du C++ qui ressemble à du C moche. Quelle avancée

Reply

Marsh Posté le 21-08-2010 à 22:43:01    

ça évite de faire un design foireux inutilement...là t'as un design simple fiable efficace en MThread, qui fait ce qu'on lui demande, facile à faire évoluer bref wtf with singleton
 
PS : philosophie qui convient certainement en environnement où le temps de développement est cours et les évolutions fréquentes


Message édité par Glock 17Pro le 21-08-2010 à 22:50:12

---------------
.
Reply

Marsh Posté le 21-08-2010 à 23:11:08    

des boites de dev de qualité ça madame :/

Reply

Marsh Posté le 21-08-2010 à 23:16:31    

des boites où la qualité du dev à peu d'importance puisque dans 2 ans ça sera à jeter, seul importe la fiabilité maximal et le temps de dev le plus court possible. chose que le singleton à comme avantage


---------------
.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed