Bonjour,
Suite a 2 jours de discutions sur le Chat je viens ici pour essayer de mettre au clair certains problèmes de conception et de réalisation.
Donc, déjà je pose le cadre de mon projet.
Pour stocker la mémoire j'ai décomposer la structure d'une base de donnée comme suit :Je travail sur la rétroprojection d'une base de donnée, La base d'origine ne dispose pas des moyens d’accès standard (ODBC) ni même de driver spécifique. Par contre la structure et les donnée sont facilement récupérable en format binaire.
J'ai déjà développer la partie lecteur du parseur, et je travail sur le stockage en mémoire (avant la restitution dans une base cible, PostgreSQL dans mon cas).
Mon implémentation actuelle :Une table contient plusieurs lignes d'enregistrement (std::vector<lineRec>)
Une ligne d'enregistrement contiens plusieurs cellule (std::vector<Field>)
Une cellule contiens une donnée, une longueur (besoin spécifique a mon projet détachée de toute notion de longueur de champ existant en bdd) et un type.
- 7 type (f_chaine, f_date, f_monnaie, f_clé, ...) chacun hérite de Field et contient une donnée typée et un méthode pour récupérer cette donnée (getter dans sa forme la plus simple)
- 1 type abstrait Field qui contient l'attribut de longueur, des méthodes virtuelle pur (read, clone, display), des méthode (getter, constructeur)
- 1 type ligneRec qui contiens un vecteur de pointeur (std::vector<std:unique_ptr<Field>>)vers les Field + un taille de ligne, et des méthode (constructeur, outils de paramétrage depuis un fichier, 2 getter)
- 1 type table qui contient un vecteur de ligneRec.
Algo d'execution :
Jusqu'ici tout fonctionne. Tout ce qui est écrit au dessus marche en l'état (avec les bon constructeur par copie, type etc ....)
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 Table.BuildFromFile() : /* Ici en plus de générer un model (inutile dans la suite de l'exemple) je * crée une ligne model, ce model contient les longueur et type de chaque * colonne (attribut longueur + instance de f_***. */ modelDeLigne = initStructFromCSV(uriCSVFile); loadDataFromBinary(uriBinFile); ------------------------------------- Table.loadDataFromBinary(uriBinFile) : Ouvrir (uriBinFile); Tant que ( != fin de fichier) vecLigne.push_back(lineRec.readLine(modelDeLigne)); FTQ ------------------------------------- LineRec.readLine(modelDeLigne) : Nouvelle ligne de type lineRec Tant que (!= fin de ligne model) /* Ici la méthode Read est surchargé dans les f_*** ce qui fait que le * traitement d'un ligne n'est connu qu'a lexécution, par composition de * traitement de champs */ line.add(Field.read()) FTQ retourner line
Ma question maintenant c'est que je souhaite récupérer mes données, Or Field n'as pas de méthode getData() puisque le type de retour dépend de l'instance appeler (f_chaine renverra un string, f_date la structure tm, f_monnaie un double , ...)
Et c'est précisément sur ce point que je suis bloqué. J'aimerait définit une méthode virtuelle ou le type de retour n'est définit que dans les niveau inférieur.
Sur le chat on m'as tout de suite énoncer un problème de conception. Mais comme toute personne borné que je suis, je ne voit pas comment faire autrement. Cette construction est issue d'un point clé auquel je tienspeut-être a tordqui est que le traitement d'une ligne n'est pas définit à la compilation mais à l’exécution (vecteur de Field sur lequel j'appelle la méthode délégué read).
En tout cas, merci d'avance (et oui, c'est pas tout clair dans ma tête ^^)
Partager