Garder en mémoire les options d'un programme - C++ - Programmation
Marsh Posté le 25-05-2003 à 15:45:23
haazheel a écrit : Salut, |
je dirai que ca depend de tes variables. Si tu as 50 entiers comme options, un tableau d'entier semble etre une bonne solution mais si tu as 1 entier, une chaine de char et une structure, ben met tout ca dans des variables normales.
Marsh Posté le 25-05-2003 à 16:20:37
ouais, ça ok, merci
Mais ce que je voulais savoir, c'est s'il vaut mieux stocker les options dès le début du programme et y accéder en mémoire, ou bien à chaque fois aller chercher l'option dans le fichier...
Marsh Posté le 25-05-2003 à 16:25:32
haazheel a écrit : ouais, ça ok, merci |
ca depend du nombre d'acces
bcp d'acces , tu stokes sinon tu vas lire
Marsh Posté le 25-05-2003 à 16:27:06
Dans le cas du ini, j'ai une structure en mémoire que je lis depuis le ini au démarrage et que je vais écrire à la fermeture.
Dans le cas du xml, soit je fais comme le ini, soit je lis le fichier au démarrage puis j'accède au DOM directement (enfin, avec une classe qui sert d'intermédiaire pour ne pas devoir taper les noms des tags partout dans le soft ).
Marsh Posté le 25-05-2003 à 16:51:21
antp a écrit : Dans le cas du xml, soit je fais comme le ini, soit je lis le fichier au démarrage puis j'accède au DOM directement (enfin, avec une classe qui sert d'intermédiaire pour ne pas devoir taper les noms des tags partout dans le soft ). |
Et comment tu fais ça?
Ca m'interresse pas mal cette idée... Surtout cette classe intermédiaire: j'utilise beaucoup les XML et si ça peut me faciliter la vie!
Marsh Posté le 25-05-2003 à 17:11:11
Personnellement, une classe singleton appele Configuration comprenant comme attrribut la configuration du logiciel dans ses differents attributs. Lorsque l'on l'intancie, elle commence par valuer tous ses paramètres avec les valeurs par defaut, puis elle va lire la configuration (peu importe que ce soit dans un ini, un XML ou autre chose). Avec cette configuration, elle modifie ses atrtributs avec les elements lus dans le fichiers.
Lorsque je veux un parametre de configuration, je fait :
Code :
|
Et hop \o/ (on peut également ajouter une operation save pour refaire le ficheier de conf en quittant pour la garder).
Enfin, je suis assez conjtre le fait de relire la configuration sur le disque a chaque acces, plus pour une méfiance vis a vis d'un fichier risquant d'etre modifié par des evenements externes que pour des raisons de performances.
Marsh Posté le 25-05-2003 à 17:15:15
haazheel a écrit : |
En fait j'avais pas fait attention au fait que c'est un topic C/C++
Je programme en Delphi, je le fais avec des propriétés "indexées" qui redirigent toutes vers une même fonction. J'ai un tableau de chaînes contenant les tags, et des tableaux de chaînes, entier et booléens pour les valeurs par défaut. Selon l'index je sais quel tag lire. Le fait que ce soit une chaîne, un entier ou un booléen est déterminé par le type de la propriété
ex:
Code :
|
Code :
|
Normalement y a moyen de faire tout ça en C++Builder je pense... mais évidemment c'est pas portable du tout.
Marsh Posté le 25-05-2003 à 18:09:39
kadreg a écrit : Personnellement, une classe singleton appele Configuration comprenant comme attrribut la configuration du logiciel dans ses differents attributs. Lorsque l'on l'intancie, elle commence par valuer tous ses paramètres avec les valeurs par defaut, puis elle va lire la configuration (peu importe que ce soit dans un ini, un XML ou autre chose). Avec cette configuration, elle modifie ses atrtributs avec les elements lus dans le fichiers.
|
Je pense à un truc en lisant ton post.
Pour chaque variable que ta classe doit retourner, tu fais un GetMonParam()...
Or moi, à chaque fois que je veux accèder à une variable d'une autre classe, je mets cette variable en public et je fais AutreClasse->MaVariable
C'est pas une erreur de faire comme ça?
Marsh Posté le 25-05-2003 à 18:19:55
haazheel a écrit : |
C'est pas top.
En objet, il y a un principe qui s'apelle le principe d'accès uniforme. On accède toujours aux membres d'une classe sans réellement savoir ce qui se cache derrière afin que si l'implémentation change, les clients de cette classe ne soient pas impactés. En précablant comme cela, si un attribut, un jour, doit passé en calculé (ou encore être validé avant d'être réellement affecté à la classe (genre on v"rifie qu'un age soit pas négatif), il faudrat modifier tous les clients de la classe.
Marsh Posté le 25-05-2003 à 18:27:54
kadreg a écrit : |
OK, mais si on doit accéder à beaucoup de variables d'une autre classe, c'est pas un peu lourdingue de se taper à chaque fois des GetParam()?
D'autant plus que si ces variables doivent être modifiées, il faut autant de SetParam()!
C'est pourquoi je trouvais plus pratique de passer directement par MaClasse->MonParam...
Sinon dans l'exemple que tu as donné:
Code :
|
A quoi correspond la fonction getInstance? A la récupération des données du fichier?
Marsh Posté le 25-05-2003 à 18:38:47
haazheel a écrit : |
On trouve ça pratique jusqu'a ce que le projet pête dans les doigts. Sur un projet d'école, on s'en rends pas compte, mais sur un gros projet, qui existe depuis plusieurs années et qui continue à évoluer, ce genre de chose peut couter très cher.
Marsh Posté le 25-05-2003 à 19:09:19
bon, ben je vais devoir taper quelques pavés de modification alors...
Sinon pour
Code :
|
, elle sert à quoi GetInstance()?
Marsh Posté le 25-05-2003 à 19:17:52
++Taz a écrit : ben c'est pour le singleton |
Ah, ok...
Donc le problème vient du fait que je ne sais pas ce que c'est qu'un singleton...
Marsh Posté le 25-05-2003 à 19:20:41
Il existe une technique en programmation objet : les designs patterns. Un pattern est une solution formalisée face à un problème de programmation courant. Ici le problème est : "comment faire pour n'avoir qu'une instance de classe". Le but est d'avoir la configuration accessible d'un seul endroit, mais que l'on puisse avoir cet endroit facilement accessible de n'importe où dans le programme. La réponse est un design pattern simple (et l'un des plus connu) : le singleton.
Exemple en java ici : http://smeric.developpez.com/java/uml/singleton/
Marsh Posté le 25-05-2003 à 19:23:12
y a Thinking in pattern qui est pas trop mal
http://64.78.49.204/TIPatterns-0.9.zip
et celui là aussi
http://www.patterndepot.com/put/8/JavaPatterns.htm
Marsh Posté le 25-05-2003 à 19:41:34
En fait c'est un peu comme une variable globale pointant vers l'objet qui gère la config
Marsh Posté le 25-05-2003 à 19:45:04
antp a écrit : |
Mais en plus propre
Marsh Posté le 25-05-2003 à 22:28:09
J'ai regardé les différents liens, j'ai essayé de faire quelque chose, mais non, ça marche pas... Voici où j'en suis:
Ma classe:
Code :
|
Et ma fonction getInstance():
Code :
|
Alors dans les liens, ils conseillent de mettre getInstance() en static, mais à la compilation, ya une erreur me disant que la classe de stockage static n'est pas admise ici.
Si je l'enlève, l'erreur disparaît(heureusement ), mais par contre il y a une erreur sur
Code :
|
en me disant Utiliser . ou -> pour appeller Configuration::getInstance().
Si je mets un . ou -> nouvelle erreur: Utilisation impropre de typedef 'Configuration'
J'ai fait quoi comme connerie?
Marsh Posté le 25-05-2003 à 22:31:24
euh t'es sur de ton coup avec le void
static void Configuration::getInstance()
{
Configuration *instance;
if (!InstanceExiste)
{
InstanceExiste = true;
instance = new Configuration();
}
}
et faut retrouner quelque chose à chaque fois. passe aussi tes constructeurs en private
Marsh Posté le 25-05-2003 à 22:58:06
++Taz a écrit : euh t'es sur de ton coup avec le void
|
Le void, c'était pour tester, j'ai oublié de l'enlever pour copier le code...
J'en suis là:
Code :
|
et il me met une erreur à la compil' sur
Code :
|
Impossible de convertir Configuration* en int
Ah oui, et quels constructeurs en private?
Marsh Posté le 25-05-2003 à 23:05:34
haazheel a écrit :
|
En fait, il faut déclarer instance comme un pointeur de Configuration. En effet, tu le crées avec new !
Ensuite, ta fonction GetInstance doit renvoyer un Configuration * (grillé là dessus)
Edit: Dans ton GetInstance, n'oublie pas non plus le else qui renvoie ta variable membre statique instance.
Marsh Posté le 25-05-2003 à 23:16:58
Alors ça doit ressembler à ça?
Code :
|
Et
Code :
|
C'est ça?
SI c'est pas ça, vous pourriez pas m'écrire le bon code s'il vous plait? Parce que là je galère pas mal quand même
Merci!!
Marsh Posté le 25-05-2003 à 23:31:54
haazheel a écrit :
|
J'ai un doute avec la fonction getInstance. A mon avis tu crées deux fois un pointeur static instance, une fois dans la classe, un autre fois dans la fonction. Une seule variable suffit et j'aurais tendance à garder celle de la classe.
De même, je ne connais pas bien le template Singleton, mais il doit y avoir un moyen de détruire ton objet une fois que tu n'en as plus besoin. J'aurais tendance à utiliser une fonction Release() et un compteur du nombre d'instance de la classe. Quand le compteur arrive à 0, tu fais un delete.
Marsh Posté le 25-05-2003 à 23:44:12
Bon, exemple de singleton qui marche (normalement, j'ai pas testé), bien sur à adapter suivant l'utilisation :
Code :
|
Marsh Posté le 25-05-2003 à 23:48:27
ReplyMarsh Posté le 26-05-2003 à 00:12:58
kadreg a écrit : Bon, exemple de singleton qui marche (normalement, j'ai pas testé), bien sur à adapter suivant l'utilisation : ... |
J'ai un doute sur ta fonction Release. En effet, tu fais un delete de ton objet sans vérifier qu'il ne soit pas utilisé par quelqu'un d'autre ! J'aurais tendance à utiliser un compteur pour ça (influence de COM ?). Par contre, il est vrai que ça marche bien si tu ne fais ton Release qu'à la toute fin de ton programme. A voir selon la situation...
Marsh Posté le 26-05-2003 à 02:41:56
Bon, impeccable, merci à tous, ça fonctionne très bien...
Mais j'aimerais revenir sur cette histoire de fonction GetParam().
Prenons le cas d'une classe Options contenant toutes les options d'un programme. Admettons que le programme propose 100 options différentes.
Est-ce qu'il faut alors créer 100 fonctions Getxxxx() différentes?
Il n'y aurait pas moyen de créer une fonction retournant n'importe uniquement un type, mais pour n'importe quelle variable?
Je m'explique: sur ces 100 options, on a 40 valeurs numériques.
On peut pas faire un GetParamInt(int MonParam) qui retournerait return MonParam, et ce quel que soit MonParam, tant qu'il est du type int?
Marsh Posté le 26-05-2003 à 07:25:01
gatorette a écrit : |
Mon pointeur est privé, dans une classe dont j'ai la garantie que je n'aurais qu'une seule instance, donc aucun risque (par contre, effectivement, je sais plus le résultat de delete NULL, ça peut faire des surprises si je double release.
Marsh Posté le 26-05-2003 à 11:15:34
kadreg a écrit : |
Je crois qu'un delete d'un pointeur NULL ne pose pas de problèmes, par contre je pensais plutôt à quelque chose dans le genre :
Code :
|
Evidemment, quand on connait l'implémentation, on se rend bien compte qu'il ne faut pas faire de Release à chaque fois. Mais cela me semble plus naturel de faire un Release pour chaque getInstance.
haazheel a écrit : |
Pas forcemment, tu peux faire un truc dans le genre:
Code :
|
Je n'ai pas testé mais l'idée y est.
Marsh Posté le 25-05-2003 à 15:33:40
Salut,
alors là je fais appel à ceux qui ont déjà codé un logiciel...
Je me demandais quelle méthode vous aviez choisi pour accéder aux options de votre programme quand ce dernier est lancé...
Je m'explique: en général les options sont enregistrées dans un fichier. (INI ou XML généralement)
Mais quand le programme est lancé et qu'il vous faut récupérer des options, à chaque fois vous faites un appel au fichier, ou bien au lancement du programme vous enregistrez toutes vos options en mémoire (et dans ce cas, sous quelle forme en mémoire: tableau, une variable par option?) ?
Voilà tout...
Merci d'avance
---------------
Another .Net Blog