IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[conception] gestion d'un objet omnipresent


Sujet :

C++

  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut [conception] gestion d'un objet omnipresent
    Bonjour à tous,

    Ce que j'appelle un "objet omniprésent" c'est une instance d'une classe dont on va avoir besoin quasiment partout dans le programme. Cela arrive assez fréquemment. Par exemple un logger, ou une classe de gestion de session sur les applis de type serveur, etc.

    Pour gérer cela, je vois deux solutions:
    1. Le singleton, bête et bourrin
    2. Le pointeur que l'on va se trimbaler partout

    Ca doit se sentir dans la forme de ma prose: aucune de ces 2 solutions ne me plaît. Mais je n'en vois pas d'autre. Auriez-vous d'autres idées à proposer?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Par défaut
    Si il est omniprésent et logiquement instance unique, alors je pense que le singleton est la solution la plus propre.
    En tous cas, avoir ton objet passé par pointeur dans tous les sens je trouve vraiment pas mieux.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Je mettrais un bête objet global. Ou si tu n'as pas besoin de le construire, une classe avec des fonctions statiques.

    L'avantage de l'objet global, c'est si, à un moment, ton objet omniprésent doit exister en deux exemplaires (genre deux loggers, vers des logs différents: tu peux bien sur ajouter un paramètre à tous tes appels de log, si tu as du temps libre, mais...)

    Francois

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par fcharton Voir le message
    Je mettrais un bête objet global. Ou si tu n'as pas besoin de le construire, une classe avec des fonctions statiques.
    Ou tout simplement des fonctions libres avec éventuellement accès à un singleton si pertinent.

    Citation Envoyé par fcharton Voir le message
    L'avantage de l'objet global, c'est si, à un moment, ton objet omniprésent doit exister en deux exemplaires (genre deux loggers, vers des logs différents: tu peux bien sur ajouter un paramètre à tous tes appels de log, si tu as du temps libre, mais...)
    On peut aussi, si c'est adéquat utiliser un pattern Chaîne de responsabilité dans ce cas.

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Oui en fait, je me suis un peu emmêlé les pinceaux dans mon premier post. Je voulais parler d'un objet omniprésent, mais dont on peut avoir plusieurs instances.

    L'exemple des sessions dans un serveur me semble un bon exemple.
    Prenons un programme définit ainsi:
    - il reçoit en entrée des requête provenant d'un client distant
    - pour traiter ces requêtes, il va effectuer des recherches sur une bdd, faire des calculs, puis renvoyer le résultat au client
    - il doit gérer les connections multiples (plusieurs clients connectés en même temps)

    Définition assez classique d'un serveur quelconque.
    Bien souvent, nous aurons besoin d'une petite classe, que l'on appelera Session, qui contient les données d'un client (ce concept existe en natif dans certains langages "orienté réseau" comme php par ex.).
    Pour chaque client, on aura donc une Session. Et on en aura besoin à peu près partout.

    Existe-t-il un idiome pour gérer cela de façon élégante en c++?

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par r0d Voir le message
    Et on en aura besoin à peu près partout.
    C'est cette phrase qui me fait tiquer. La question que je me pose est plutôt de savoir si les responsabilités entre les classes ont bien été définies pour faire apparaître ce besoin de voir Session partout dans la gestion du client ?

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    349
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 349
    Par défaut
    Pourquoi pas un SessionManager (qui lui serait un singleton), qui te permet de gérer l'ouverture, la fermeture, l'accès, etc, de tes sessions.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Cheps Voir le message
    Pourquoi pas un SessionManager (qui lui serait un singleton), qui te permet de gérer l'ouverture, la fermeture, l'accès, etc, de tes sessions.
    Ca me fait penser à l'intervention d'Emmanuel Deloget sur les 'god classes' dans la discussion sur Demeter.

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Ceci dit, je ne serais pas très loin de proposer, effectivement, un singleton (à défaut d'une classe essentiellement composée de membres et fonctions statiques) mais servant de "collection de sessions", regroupant les différentes sessions qui, pour suivre plus ou moins l'intervention d'Emmanuel, se chargerait de:
    1. "enregistrer" les nouvelles sessions (qui lui sont envoyées par une fabrique)
    2. "désenregistrer" les sessions finies (qui sont indiquées comme telles par un "killer")
    3. retrouver une session donnée parmi les sessions existantes
    La session contiendrait juste ce qu'il faut pour déterminer si un acces donné est autorisé ou non à l'utilisateur qu'elle représente.

    Une fonction libre prendrait en paramètre la session, la base de données à laquelle tentative d'acces est faite et le type de la requete (select, update, delete, add) et donnerait un go / no go.

    Les dépendances seraient (dépendant -> dépendance)
    • Fabrique -> collection de session (registerSession(Session ) ) (amitié )
    • "killer" -> collection de session (unregisterSession(SessionId) ) (amitié )
    • goNoGo
      • collection de session findSession(SessionId) ->Session
      • BDD
      • RequestType
    • tout le reste ->goNoGo
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par r0d Voir le message
    Existe-t-il un idiome pour gérer cela de façon élégante en c++?
    Là je mettrais un conteneur global, contenant des objets sessions... Typiquement, si ta session est associée à un identifiant, un tableau associatif (map ou autre). Pour récupérer une session tu fais juste conteneur_global[ma_session].

    Il te faut ensuite deux fonctions, une pour créer une session, une pour la fermer. Si la création est très simple, tu peux la mettre dans le constructeur, qui sera appelé si tu appelles conteneur_global[ma_session] sur un identifiant inconnu... Pour la fermeture, ca peut être une fonction de l'objet Session (mais alors elle restera dans le conteneur), ou une fonction membre du tableau associatif.

    Francois
    Dernière modification par Invité ; 04/11/2009 à 18h03.

  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Probablement qu'une variable globale pour le log est adéquat, pour les sessions, j'en suis moins persuadé.

    Citation Envoyé par r0d Voir le message
    L'exemple des sessions dans un serveur me semble un bon exemple.
    J'ai l'impression que chaque exemple génère sa solution spécifique (cf ci-dessus et discussion forkée sur le log).
    D'où :

    Citation Envoyé par r0d Voir le message
    Existe-t-il un idiome pour gérer cela de façon élégante en c++?
    Il semblerait que chaque cas ait son type de solution et qu'on peut difficilement généraliser.

Discussions similaires

  1. [conception] gestion étiquettes
    Par ludolan dans le forum Modélisation
    Réponses: 4
    Dernier message: 18/10/2005, 11h34
  2. [ Struts ]Gestion de l'objet session
    Par trax020 dans le forum Struts 1
    Réponses: 5
    Dernier message: 22/08/2005, 16h56
  3. [Conception] gestion tables temporaires bd ?
    Par Pwill dans le forum Général Java
    Réponses: 12
    Dernier message: 08/07/2005, 14h49
  4. [Conception] Gestion des accents dans une base de données
    Par MiJack dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 07/07/2005, 11h41
  5. [Débutant(e)][Conception] prob de programmation objet
    Par gregorian dans le forum Général Java
    Réponses: 3
    Dernier message: 07/07/2005, 11h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo