Citation:
Envoyé par
Teaniel
:aie::aie::calim2: ouille, ça fait mal!!! :aie::aie:
Je suis bien obligé de l'avouer c'était moi... :aie:
Mais au moins, ca te fait réagir :D
Et tu te rendras compte, une fois la "blessure d'amour propre" guérie, que "j'ai pas tord" :D
Citation:
Bon, Circonstances atténuantes Votre Honneur!, en 1997, il n'y avait que la POO, le peu de template que j'utilisais faisait planter mon compilateur (je blague pas : crash error 13, sinon erreur interne du compilateur dès que je mettais deux paramètres dans mon modèle), et la STL en était également à ses débuts. Sans compter que je ne pouvais compter sur personne d'autre que moi-même et les bouquins que j'avais achetés (pas de web pour moi à l'époque).
Oh, mais, tu n'as aucune raison de te justifier ;)
On apprend plus de ses erreurs que de ce que l'on fait correctement ;)
Ce qui importe ici, c'est que, quand tu dis dans ton analyse fonctionnelle (ou dans ce qui en tient lieu) -- c'est à dire "hors de tout contexte" -- que
Citation:
Un champs est représenté par une donnée (une valeur) qui peut être une date OU un entier OU une heure OU un texte OU ...
il va bien falloir finir par "contextualiser" cet aspect.
Car, tôt ou tard, tu vas vouloir mettre en place la notion de "table", dont le principe est simple vu qu'il s'agit de permettre le regroupement d'enregistrements de même type.
Bien sur, cela nous amène à la notion d'enregistrement dont la définition correspond à
Citation:
Une donnée "complexe", composée de un ou plusieurs champs
et qui nous amène donc à fournir une définition correcte à la notion de champs et qui correspond à
Citation:
un champs est une information nommée utilisée pour fournir tout ou partie des informations requises pour la représentation d'un enregistrement
Et cela nous amène à un problème de taille, car
Citation:
nommer, c'est créer
Chaque champs est donc clairement défini par le nom que l'on va lui donner. Ce nom a véritablement "quelque chose de magique": c'est lui qui te permet de te faire une idée précise de l'usage auquel tu destine la variable. Si tu le nommes "date_de_naissance", tu sauras qu'il sera utilisé pour "un autre usage" que si tu le nommes "quantité" ou "durée" :aie:
Mieux encore : quand tu choisi le nom de ton champs, on en arrive forcément à ... obliger le champs à prendre un type particulier. En effet, si tu nomme ton champs "quantité", tu te doutes bien qu'une donnée de type "date" ou de type "texte" n'aura absolument aucun sens, vu qu'on ne va pas manipuler les dates, les textes et les entiers de la même manière :aie:
Et cela nous emmène à deux constatations supplémentaires:
1- Si tu décides de changer le type d'un champs, tu es presque obligé de changer le nom du champs pour qu'il continue à correspondre à l'usage auquel on le destine
2- Toutes tes tables ayant été -- à un moment remplies -- remplies par différents enregistrements, si tu décides de changer le type d'un champs bien particulier (en le renommant ... ou non), il faut t'assurer que tu seras en mesure de convertir toutes les données de maniière à pouvoir les représenter sous leur "nouvelle forme".
C'est très bien, ca... Mais dis moi: comment on fait pour convertir une quantité en date:question:
Au final, le terme que l'on aurait peut-être du utiliser dans l'analyse fonctionnelle (ou dans ce qui en tient lieu) au lieu du OU aurait sans doute été SOIT:
Citation:
Un champs est représenté par une donnée (une valeur) qui peut être SOIT une date SOIT un entier SOIT une heure SOIT un texte SOIT ...
Avec comme sous-entendu que l'on peut choisir n'importe lequel de ces types, mais qu'il y aura jamais qu'un, une fois que le choix a été fait, il est ... absolument irrévocable.
Citation:
De DBA il n'y en a pas car c'est enregistré dans un fichier (objet de notre discussion en raison des différentes versions qui en ont été émises).
Disons donc que tu as "fait office de",
Citation:
C'est un choix que j'ai fait en raison de mon manque de maitrise dans les API de l'époque concernant les BDD, et aussi un peu par conviction... Mais ça c'est un sujet qui n'a rien à voir ici.
De plus la dimension des fichiers ne le justifie pas (tout tient facilement en mémoire).
Bah, tu sais ce qu'on dit :
Citation:
peu importe le vin tant qu'on a l'ivresse :D
Pour moi, ce qui importe, c'est que tu as mis au point un système qui te permet de sauvegarder différentes informations, de créer des relations entre elles, et de pouvoir les récupérer par la suite.
Peu importe le nombre de données qui sont ainsi sauvegardées. Peu importe que ce système se base sur des fichiers plats ou sur un système plus lourd et / ou plus complexe : Voilà exactement le genre de services que l'on s'attend de la part d'une "base de données relationnelle". Si bien que ton système -- quel qu'il soit -- entre de facto dans cette catégorie ;)
Et c'est d'autant plus vrai que tu as pris soin d'organiser les informations que tu voulais enregistrer de manière "cohérente" (ou, à tout le moins, tu as fait tout ton possible pour y arriver :D ) ;)
Citation:
Et enfin, je voulais (et je veux toujours) un programme mono-fichier sans installation : l'application ne doit pas être composée d'autre chose que d'un unique exécutable, de son fichier de données et éventuellement d'un fichier de conf.
As-tu déjà entendu parler de Sqlite :question:
Pour faire simple, c'est une bibliothèque qui fourni un moteur SQL complet (ou presque) self contained.
Autrement dit, tout ce dont tu as besoin, c'est un fichier contenant les données de Sqlite, car le moteur qui permet "d'attaquer" la base de données est directement intégré dans l'exécutable.
C'est le moteur qui est --entre autres -- utilisé par thunderbird et par firefox lorsqu'il s'agit de sauvegarder des données et de permettre leur accès rapide ;)
Quitte à refaire une bonne partie, pourquoi n'envisagerais-tu pas de migrer sur un système similaire :question:
De plus, je présumes que tu envisages -- à termes -- d'ajouter une interface graphique à tout le bastringue... Pour ce faire, je te recommanderais l'usage de la bibliothèque Qt qui -- la vie est quand même bien faite, non :question: -- fournit justement un moteur SQL qui sait manipuler ce type de base de données ;)
Citation:
L'objectif étant la transportabilité et l'absence totale d'installation. Tout sur une clé usb (au début c'était une disquette).
Et je te comprends parfaitement.
Mais le fait est que tu as essayé de recréer la roue, et que le résultat actuel est une roue ... relativement carre :aie:
Il se peut que tu aies beaucoup plus facile à arrondir ta roue en décidant de faire "table rase du passé" et en décidant de partir avec "les bons outils" ;)
Citation:
Ah... Ben là j'ai un vrai problème parce que je suis toujours dans ce cas. En effet, le type des données de cette classe n'est pas prévisible, car au moins en partie décidée par l'utilisateur.
C'est là que tu te plantes : quand tu es au niveau du fichier, le type de donnée a été défini depuis longtemps, et l'utilisateur (du fichier) n'a pas d'autre choix que de manipuler les données que le fichier lui fourni dans un type bien particulier ;)
Dis toi bien que, une fois que tu "contextualise" la notion de table (ou d'enregistrement ou de champs), les dés sont jetés:
Des le moment où tu te dis
Citation:
je veux sauvegarder la liste des <vas savoir quoi> pour pouvoir y accéder par la suite
tu te trouves face à l'obligation de définir une notion concrète:
Si tu remplace <va savoir quoi> par "participants" -- par exemple -- cette notion va obligatoirement impliquer la présence
- d'un champs "nom" (de type TEXTE)
- d'un champs "prenom" (de type TEXTE)
- (éventuellement) d'un champs "date de naissance" (de type ... DATE)
- Peut-être d'un champs "numéro d'enregistrement" à la fédération (d'un type... adapté à la représentation de ce numéro)
- sans doute de plein d'autres champs auxquels je ne pense pas forcément
Parce que cela représente ... les données dont tu as besoin pour pouvoir manipuler ta notion de "participants".
Si tu remplaces <va savoir quoi> par "match" pour pouvoir maintenir les scores de deux participants qui se sont affrontés, les données porteront des noms différents et... seront de type différents.
Et, au final, pour chaque table que tu pourras envisager de sauvegarder, tu te retrouveras à créer... une notion bien particulière qui regroupera un "certain nombre" de champs, dont le nom indique clairement l'usage qui en est fait et dont le type correspond forcément à l'usage et aux manipulations que tu envisage pour chaque champs particulier.
Citation:
grosso modo et vite dit, nous avons donc des compétitions auxquelles participent des licenciés, et qui sont composées d'épreuves.
Hé bien, chaque épreuve devrait avoir sa propre table, permettant de sauvegarder les résultats de chaque licencié y ayant participé, et, surtout, de relier ces résultats au licencié en question ;)
Citation:
Ces épreuves se basent sur des règlements qui définissent les différentes étapes que franchissent les concurrents, qui elles-même induisent des saisies dépendantes (en type et en nombre) de ces règlements.
Et c'est justement pour cela que chaque épreuve devrait être sauvegardée dans une table spécifique: pour permettre à chaque épreuve de définir sa propre "notion d'épreuve" qui lui est bien spécifique, et donc le nombre et le type de chaque champs dont elle a besoin pour créer un enregistrement ;)
Citation:
Les règlements sont donc des données du programme. Et le type d'une saisie donnée induite par ces règlements également.
Non!!! le règlement, il est défini ... ailleurs... Tu ne fais que fournir "une certaine vue", une "certaine manière de représenter" ce règlement au travers de ton fichier. Mais tout ce que cela peut comporter a déjà été défini!!! Tout ce que tu veux, c'est... pouvoir le récupérer de manière cohérente ;)
Citation:
Pour être complet, cela induit également un système de calcul qui manipule ces saisies, qui doit pouvoir être défini par l'utilisateur (arbre syntaxique soit saisi dans des formulaires récursifs (actuel), soit compilé par un analyseur à partir d'une formule textuelle(à venir))
Mais ca, c'est un autre problème... qui ne nous concernera qu'une fois que l'on aura la certitude que les données peuvent être récupérées :D
Citation:
Dans ce contexte, tu me diras sans doute le contraire, mais je trouve que la manière dont je l'ai implémentée à l'époque n'est pas si mauvaise que cela... Et en tous cas pas illogique.
Bien sur que je dis le contraire, car il suffit de te poser une question: comment veux tu faire pour déterminer l'usage auquel tu destine une information dont le type peu varier, et qui n'est pas nommée :question:
Comme je te l'ai dit et répété : un type permet de savoir quelles manipulations sont possibles alors qu'un nom permet de savoir à quel usage la donnée est destinée.
Tu peux "assez facilement" déduire l'un quand tu connaît l'autre, sans courrir "trop de risques" de te tromper. Mais, si tu n'a ni l'un ni l'autre, tu es purement et simplement bloqué...
Le seul espoir qu'il te reste passe par ... la force brute: tu dresses la liste exhaustive des types que tu es susceptible d'obtenir et tu extrait la donnée sous une forme "générique" (une chaine de caractères), et tu vérifies le format de cette chaîne de caractères pour en déterminer le type effectif (en espérant que chaque type puisse être défini par un format spécifique).
Sauf que cette approche va rapidement tourner au cauchemard :aie:
Citation:
D'autant qu'elle a donné lieu à un programme qui a fonctionné et évolué pendant 10 ans (avant que je ne perde ses sources actuels :aie:), et ensuite fonctionné sans mise à jour encore pendant 10 ans, jusqu'à aujourd'hui... Aujourd'hui il y a des machines sur lesquelles il ne démarre plus (cause ancien win32).
Les vraies difficultés je les ai "parce que" je change de paradigme dans la conception, et cela me donne du mal.
Pourquoi crois tu que j'insiste pour que tu revoie l'ensemble de la conception :question: :D
Citation:
Pardonne moi, mais là il me semble que tu rentres dans le "ça ne se fait pas". Et encore une fois, je n'ai pas d’œil au beurre noir, donc elle ne m'a pas sauté à la figure :aie: <je sors>.
Dépêche toi, avant de recevoir mon 41 fillette dans les fesses :D
Citation:
Je sais, je suis lourd, mais pour moi cette structure a fonctionné jusqu'à présent.
J'aurai plutôt tendance à dire qu'elle n'a pas explosé si fort que cela... mais ce n'est qu'une question de point de vue ;)
Citation:
Cela ne signifie pas que je ne la remettrai pas en cause, mais qu'il y a au moins un cas pour lequel elle a fonctionné, et donc qu'elle risque au moins un peu de pouvoir rendre service (je vais explorer std::any que je ne connaissais pas jusque là, ce qui me permettra peut-être de répondre à ton injonction).
Mais le fait est que any ne te donne qu'un moyen relativement correct et "facile" de partir sur la force brute.
Autrement dit, ce n'est jamais qu'un pis aller te permettant de contourner un problème dont la source doit impérativement être tarie, dont la racine doit être impérativement supprimée.
Car, si tu prend la décision de partir sur de la force brute, tu mets tout en place pour qu'il y ait un maximum de problèmes qui surgissent dans les mois qui viennent et qui t'oblige à faire des détours de plus en plus important pour arriver à les contourner.