Bonjour,
Je travaille actuellement sur un projet dans lequel je souhaite faire le point sur de nombreux points de conception.
Dans ce projet, j'ai un grand nombre de classes qui ont en commun d'avoir un identifiant numérique unique. L'identifiant n'est pas toujours du même type.
Au départ, cet identifiant représente la clef de la table SQL que la classe représente. Je reviendrais plus tard sur l'aspect base de données.
Pour représenter ce caractère commun mais variable en type, j'ai crée une classe template :
J'utilise Qt4/VS2005 pour ce projet.
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 #ifndef __TableTrait_h__ #define __TableTrait_h__ #include <QtCore/QString> #include <QtCore/QStringList> #include <QtCore/QList> #include <QtCore/QMap> template<typename KeyType> class QTableTrait { // Construction Destruction public: QTableTrait( void ); ~QTableTrait( void ); // Types membres publics public: typedef KeyType QKeyType; typedef QList<ClassName*> QRowList; typedef QMap<QKeyType,ClassName*> QRowMap; // Fonctions membres publiques public: //! Retourne la valeur de la clef dans la table pur cette instance QKeyType key ( void ) const; //! Modifie la valeur de la clef dans la table pur cette instance void setKey ( const QKeyType &p_oKey ); protected: //! Valeur de la clef dans la table pour cette instance QKeyType m_oKey; }; #include "TableTrait.cpp"
Jusqu'ici pas de problème. L'utilisation se fait facilement.
Là ou cela se corse pour moi, c'est que les classes qui utilisent cette template ont besoin d'initialiser leurs variables membres lors de l'instanciation. (elles sont initialisées une fois seulement lors de l'instanciation)
Chaque classe a bien sûr des membres différents et certaines sont composées d'autres classes qui héritent aussi de QTableTrait.
Ce que je veux faire c'est définir une structure de classes qui permette de
- rendre commun l'interface de lecture des données pour toutes les classes (sachant que pour lire une base de données il faut quelques paramètres)
- séparer la lecture des données de la classe de "stockage"
- permettre facilement de changer de mode de lecture des données (passer d'une lecture SQL à une lecture d'un fichier XML par exemple)
- prenne en compte qu'une classe peut etre composée d'autres classes du type QTableTrait et donc que ces sous classes doivent aussi etre initialisées
Pour cela j'ai pensé utiliser le pattern "stratégie". Mais je ne vois pas comment le mettre en oeuvre dans mon cas....
J'ai actuellement une architecture qui fonctionne mais qui n'est pas du tout adaptée a ce que je cherche à faire. Elle est basée sur une version modifiée de la template ci dessus, mais le code est un peu long. Si vous voulez y voir plus clair je peux le poster ici.
Merci d'avance !
Partager