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 :

interface entre une classe et une DB


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2017
    Messages : 11
    Par défaut interface entre une classe et une DB
    Bonjour,

    je débute un petit projet C++ que je pourrais résumer comme ceci :
    1 j'ai un fichier contenant des messages appartenant a differentes grandes catégories.
    2 Je dois modifier ces messages moyennant l'interrogation d'une base de données postgres ou sqlite.

    Voici comment j'ai modélisé le 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class Fichier {
     
      vector<Category *> categoryList;
     
    };
     
     
    class Category {
     
      vector<Message *> messageList;
     
    };
     
    class Message {
     
     
    };
    Pour l'instant je n'utilise pas l'héritage.

    Pour le point 2, je ne souhaiterais ouvrir qu'une seule connexion par fichier pour modifier l'ensemble des messages qu'il contient. Je pense donc à l'héritage au plus haut niveau, pour la classe Fichier, et en cascade aussi pour Category et Message.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    class Fichier {
     
    ...
    // plus de categoryList
     
    };
     
    class Category {
     
    ...
    // plus de messageList
     
    };
     
    class Message {
     
    ...
     
    };
    class FichierPg : Fichier {
     
    vector<CategoryPG> categoryList;
     
    private :
      PGconn maConnexion;
     
     
    }
     
    class CategoryPG : Category {
     
      vector<MessagePG> messageList;
     
    }
     
    class MessagePG : Message {
     
     
    int setMetadataVal(PGConn);
     
    }
     
     
    class Fichier SQlite : fichier {
     
    vector<CategorySQlite> categoryList;
     
    private:
      sqlite3 maConnexion;
     
    }
     
    class CategorySQlite : Category {
     
     
    vector<MessageSQlite> messageList; 
     
    }
     
    class MessageSQlite : Message {
     
    int setMetadataVal(sqlite3);
     
    }

    Est ce que c'est correct ?

    Merci d'avance pour votre aide

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Salut,

    ta hiérarchie des Messages, Catégories et Fichiers semble logique, mais que vient faire une connexion dans un fichier ? Et surtout quel est l'intérêt de créer une connexion par fichier ? (spoiler alert : sûrement aucune).
    Ton programme a ses données, et une connexion qu'il utilisera pour upload/download dans/depuis la base de données. Et surtout les 2 ne devraient avoir aucun lien, ce sont des concepts orthogonaux et chaque partie devrait pouvoir être modifiée individuellement.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2017
    Messages : 11
    Par défaut
    Merci de ta réponse.
    Donc pour être sûr d'avoir compris ta réponse:
    je garde les classes définie en 1 et j'ajoute juste 2 methodes a la classe Message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Message {
     ...
     
     int setValFromSQliteDB(sqlite3);
     
     int setValFromPgDB(PGconn);
     
    };

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    main {
     
    // ouverture de ma connexion
     
    // boucle sur les messages contenus dans mon fichier
        // appel de la bonne methode selon le type de connexion pour modifier mon message
     
    }
    C'est bien ça ?
    Merci !

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Mieux, tu fais une fonction complètement extérieure, qui charge la connexion, obtient les valeurs, et retourne le "fichier" correspondant.

    Ainsi, tu n'encombre pas ta classe fonctionnelle, à savoir, le message, avec du code de chargement.

    Ta classe représente ton message.
    Elle n'a pas a connaitre le fonctionnement de ta base de données.

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Pour répondre de façon ultra théorique à la question

    Tu vas avoir le "Domain Model" (<- lien wiki anglais) qui va contenir toute ta logique métier.

    Dedans/ À côté, tu vas avoir des DTO (<- lien wiki français), une classe sans comportement, que des données membre) et des "repositories" (<- lien Martin Fowler anglais).

    Dans ton exemple, ta classe Message est un DTO et ta classe Category est un "repository" (<- mais sans la partie requête)


    Ensuite pour la partie "model"/ données du MVC, tu vas avoir une interface ultra générique (donc une classe virtuelle pure en C++)
    Par exemple dans ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class App_Model {
    // Lifetime Management, only the main object calls them
    public:
     
        virtual void init(char* /*pathname*/);
     
        virtual void clear();
     
     
    // Model
    public:
     
        virtual void get_metadata(Message&) const = 0;
     
        virtual void set_metadata(Message&) const = 0;
     
    // ....
    }
    Et tu vas avoir 2 classes concrètes qui vont hériter de cette interface : class Database : public App_Model {}; et class File : public App_Model {};.


    Et pour faire ton code , c'est à dire que tes objets DO ("domain object") communiquent avec ton modèle, tu peux par exemple, faire des singletons pour les 2 modèles (donc global) et faire un proxy pour les utiliser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    // model_functions.h
     
    inline void DATA_GET_METADATA(Message& message) {
    	( (IHM_G_Space::g_model.database.get_metadata) (message) );
    }
     
    inline void DATA_SET_METADATA(Message& message) {
    	( (IHM_G_Space::g_model.database.set_metadata) (message) );
    }
     
    inline void FILE_GET_METADATA(Message& message) {
    	( (IHM_G_Space::g_model.file.get_metadata) (message) );
    }
     
    inline void FILE_SET_METADATA(Message& message) {
    	( (IHM_G_Space::g_model.file.set_metadata) (message) );
    }

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2017
    Messages : 11
    Par défaut
    Merci à tous de vos conseils,
    la dernière réponse est effectivement très théorique, je me pencherai dessus la cervelle plus reposée !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Eval d'une propriété d'une classe dans une classe
    Par bizet dans le forum ASP.NET
    Réponses: 4
    Dernier message: 28/10/2008, 09h43
  2. [POO] Utilisation d'une classe dans une classe !
    Par Okinou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 14h34
  3. Une classe dans une classe...
    Par Baquardie dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/09/2005, 19h36
  4. Réponses: 2
    Dernier message: 31/08/2005, 16h12
  5. Réponses: 4
    Dernier message: 17/03/2004, 17h24

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