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 :

Optimisation de code, mode console


Sujet :

C++

  1. #1
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut Optimisation de code, mode console
    Bonjour,

    Voici un programme en mode console pour trier, calculer ses jours et horaires de travail. (J'y ai joins un save.txt pour un aperçu rapide de son fonctionnement)

    Je le poste ici et non dans "sources c++" car ce programme est loin de répondre aux critères de la responsabilité unique et de la loi Demeter.

    (Pourtant bien expliqué par Koala01 ici mais j'ai bien du mal... :S
    Suite à ce sujet, j'ai tout reconstruit mais reste bloqué sur l'implémentation de mes "pools".
    J'ai du mal à le mettre en place mais je suis "conscients" des bénéfices. C'était bien pire avant ^^)

    Donc si des gens veulent; le reprendre, modifier, distribuer, voir donner quelques conseils et dire ce qui ne va pas, je vous en pris !

    Explication rapide
    Summary -> classe de base, y sont implémentés :
    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
    class ConsoleSet //raccourcis pour imprimer des éléments
    class ConsoleGet ://Reccuperer des valeurs prédéfinies (+transformation string to int)
     
    class Menu //les menus "simples" du programme avec retour du choix
    class Liste //Affichage des listes
     
    class Memory //Charger / Enregistrer un fichier save.txt
     
    int   empChoice;
    int   jobChoice;
    int   dayChoice; //Tous cela me permet de creer le chemin pour accèder aux valeurs de mes vecteurs (Il aurait sans doute fallut avoir une fonction pour chacune de ces valeurs)
     
    class Pool //(Tous ce qui suit est contenu dans cette classe, la partie qui ne respecte pas l'orientation objet)
       vecteur PoolEmp
       class PoolEmp
           vecteur PoolJob
              class PoolJob
                 vecteur PoolDay
                    class PoolDay
                       int time
                       int date
    Je compte rajouter une estimation du salaire(ANPE :S) et aussi la lecture par mois, ou par année.

    J’espère avoir été clair, merci pour votre attention !
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par PilloBuenaGente Voir le message
    Bonjour,

    Voici un programme en mode console pour trier, calculer ses jours et horaires de travail. (J'y ai joins un save.txt pour un aperçu rapide de son fonctionnement)

    Je le poste ici et non dans "sources c++" car ce programme est loin de répondre aux critères de la responsabilité unique et de la loi Demeter.

    (Pourtant bien expliqué par Koala01 ici mais j'ai bien du mal... :S
    Suite à ce sujet, j'ai tout reconstruit mais reste bloqué sur l'implémentation de mes "pools".
    J'ai du mal à le mettre en place mais je suis "conscients" des bénéfices. C'était bien pire avant ^^)

    Donc si des gens veulent; le reprendre, modifier, distribuer, voir donner quelques conseils et dire ce qui ne va pas, je vous en pris !

    Explication rapide
    Summary -> classe de base, y sont implémentés :
    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
    class ConsoleSet //raccourcis pour imprimer des éléments
    class ConsoleGet ://Reccuperer des valeurs prédéfinies (+transformation string to int)
     
    class Menu //les menus "simples" du programme avec retour du choix
    class Liste //Affichage des listes
     
    class Memory //Charger / Enregistrer un fichier save.txt
     
    int   empChoice;
    int   jobChoice;
    int   dayChoice; //Tous cela me permet de creer le chemin pour accèder aux valeurs de mes vecteurs (Il aurait sans doute fallut avoir une fonction pour chacune de ces valeurs)
     
    class Pool //(Tous ce qui suit est contenu dans cette classe, la partie qui ne respecte pas l'orientation objet)
       vecteur PoolEmp
       class PoolEmp
           vecteur PoolJob
              class PoolJob
                 vecteur PoolDay
                    class PoolDay
                       int time
                       int date
    Je compte rajouter une estimation du salaire(ANPE :S) et aussi la lecture par mois, ou par année.

    J’espère avoir été clair, merci pour votre attention !
    Je me hasarde à une supposition : emp/Emp veut dire "employé", n'est-ce pas ? (ou la version anglaise, employee).

    J'ai du mal à comprendre le workflow du programme en lisant le code, j'y reviendrais donc (peut-être) plus tard. Quelques remarques sur le style :

    * le nommage des classes est hasardeux : Memory ? List ? Summary ? Les noms ne sont pas très explicite, ce qui nuit à la compréhension de l'ensemble. Pour ma part, j'aurais choisi des noms comme PersistentDataStore, ... - bref, des noms qui décrivent l'objet et sa fonction première.

    A ce titre, je pense sincèrement que la moitié, si ce n'est les 3/4 du travail d'un architecte consiste à nommer les choses. Une fois les choses correctement nommées, l'abstraction représentée en découle, et son implémentation aussi.

    Dans le cas de Memory+List / PersistentDataStore, le nom implique que toutes les données y sont stockées, et que ces données sont persistantes (donc récupérée et/ou stockées à un moment donnée depuis/vers un système quelconque tel qu'un fichier, une base de données,... (un PersistenceDriver ?)).

    * Summary : quoi ? qui donc ? ou-est-ce ? Le corps complet du programme est contenu dans le constructeur d'une classe ? Ca, c'est une très, très, très mauvaise idée. Comme son nom l'indique, un constructeur construit une instance d'objet. Il n'a pas pour fonction de lancer un traitement.

    Si tu estimes que la classe ne fait rien, alors peut-être n'est pas une classe ? (et dans ton cas, ce n'est pas une classe ; une classe n'ayant qu'une seule méthode publique et ne prenant aucun paramètre ne peut en aucun cas être une classe - c'est une fonction ; et puisque main() est vide, c'est même dans ton cas la fonction main()).

    Donc, à faire : supprimer la classe Summary, et réinjecter les données membres en tant que variables automatiques (cad placée sur la pile) dans main().

    * Les Pools, kesako ? Je ne comprends pas trop bien leur fonction. Visiblement, toi non plus d'ailleurs (sinon, tu n'aurais pas Pool, PoolDay, PoolEmp, PoolJob qui manipulent toutes des employés, des jours et de jobs). C'est très confus, tout ça

    Est-ce que tu pourrais expliquer quelle était ton intention première, cad quelle est leur fonction ? (sans utiliser le mot pool ni le verbe gérer (ou un mot apparenté)).

    * TodayDate ? Est-ce qu'aujourd'hui est un moment spécial par rapport à hier ? Je demande ça parce que je ne vois pas de YesterdayDate

    Plus sérieusement, cette classe est inutile (elle peut être remplacée par une fonction, ou par une classe plus générale (Date) offrant un membre statique Today() qui crée le Date correspondant). En plus d'être inutile, elle est très spéciale. C'est quoi ce 372 ? C'est pour les cas où on aurait une année de plus de 371 jours dans les mois qui viennent ? Pourquoi est-ce que Date() ne renvoie pas tout simplement un time_t ? (qui est une valeur qui ne revient que très, très, très rarement en arrière - et peut donc être utilisée pour ordonner les dates, tout aussi bien que ce const int étrange).

    Le fait que la classe Date n'existe pas te force d'ailleurs à exporter la date sous la forme de ce const int licencieux, et tu perds du même coup le sens de la donnée. Après tout, je peux faire (date *= 2) si date est un int ; c'est plus compliqué si date est un Date

    * En parlant de gestion du temps : c'est quoi, la taille du temps ? (TimeSize)

    * ConsoleGet, ConsoleSet ? C'est un peu exagéré. Ok, le standard C++ sépare les flux in et out (via std::cin et std::cout), mais les raisons ne sont pas là ou on croit qu'elles sont. Il ne s'agit pas de séparer les responsabilités, mais de coller à la façon dont on accède à la console au niveau système (via les descripteurs de fichier 0 (stdin), 1 (stdout) et 2 (stderr)).

    En Java et en C", on accède à la console via une classe statique nommée Console. Cette classe fournit les services de lecture et d'écriture sur la console (l'abstraction utilisée n'est pas la même : en C#, la classe Console utilise les fonctions Win32 d'accès au sous-système console, ce qui permet en outre d'obtenir des infos supplémentaires sur la console (taille en X, taille en Y, nombre de lignes dans le buffer...), de contrôler la position des caractères, etc). Je te propose de mettre en place une interface similaire plutôt que d'utiliser 2 classes.

    Ce qui ne veux pas dire que dans l'absolu, tu n'ai pas raison. Ceci dit, vu le cas d'utilisation, c'est grandement exagéré. Si, plus tard, tu as besoin de séparer les interfaces, alors tu pourras créer deux classes ConsoleReader et ConsoleWriter, et faire dériver Console de ces deux classes (héritage multiple ! vive le C++ !).

    Globalement, je vois bien qu'il y a une volonté de bien structurer le programme. Dans l'ensemble, c'est un bon début - mais ce n'est qu'un début, et il y a encore fort à faire pour rendre le code présentable
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Merci de d'y être interessé !

    Emp c'est employer, c'est en fait les agences interims.
    Qui auront différents travails.(ce mot existe)
    Qui auront elles même de multiple dates et horaires.

    Memory ? List ? Summary ? Les noms ne sont pas très explicite
    Je pensait ne pas faire plus explicite... :O
    Koala01 : "tu sembles plus réfléchir à tes classes sur base des données qu'elles manipulent plutôt que sur base des services que tu en attends
    Je pense que là est mon problème..
    (Le pauvre, je me rends compte qu'il va s'arracher les cheveux si il voit le monstre que j'ai créé..)
    j'aurais choisi des noms comme PersistentDataStore
    ? Désolé si je m'embourbe mais alors j'aurais des classes du type :

    PersistentDataStore -> stockage (charge, contient et enregistre les intérims, travails, dates et horaires)
    ConsoleFlow -> Affiche mes différents menus et récupère les réponses
    DataSort -> fait la relation entre consoleFlow et PersistentDataStore

    C'est l'idée ?

    Summary : quoi ? qui donc ? ou-est-ce ? Le corps complet du programme est contenu dans le constructeur d'une classe ?
    C'est vrai que ça c'est impardonnable... (je l'avais modifié plusieurs fois et c'est resté comme ça..)

    * Les Pools, kesako ? Je ne comprends pas trop bien leur fonction. Visiblement, toi non plus d'ailleurs (sinon, tu n'aurais pas Pool, PoolDay, PoolEmp, PoolJob qui manipulent toutes des employés, des jours et de jobs). C'est très confus, tout ça

    Est-ce que tu pourrais expliquer quelle était ton intention première, cad quelle est leur fonction ? (sans utiliser le mot pool ni le verbe gérer (ou un mot apparenté)).
    Mais pourtant la meilleur définition que j'aurais de "PersistentDataStore" c'est qu'elle <gère> la base de donné ?! (elle charge et enregistre les données)

    Le nom Pool*** était à la base pour m'y retrouver dans mes headers et sources... Pas bonne idée..

    La fonction de PoolDay > elle stocke et renvoie le temps travaillé pour tel travail, tel interim et tel jour
    PoolJob > elle stocke et renvoie les jours travaillé pour tel travail et tel interim
    PoolEmp > stocke et renvoie les travails pour tel interim
    Pool > stocke et renvoie l'ensemble (mouai, pas convincu..)
    La classe Pool contient un vecteur de classe PoolEmp qui en contient un de classe PoolJob qui en contient un de classe PoolDay(Poupées Russe)

    (on va faire de la pub)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /*      adecco
              /\
         safen  kiabi
         /  | \    | \
    27/02/13|  \   25/03/13
    3h00    |   \  10h30
        28/02/13 \
        5h00      29/02/13
                  5h00
    */
    J'avais essayé de séparer chacune d'elles mais les étapes pour y accèder étaient bien plus alambiquées...

    * TodayDate ? Est-ce qu'aujourd'hui est un moment spécial par rapport à hier ? Je demande ça parce que je ne vois pas de YesterdayDate

    Plus sérieusement, cette classe est inutile (elle peut être remplacée par une fonction, ou par une classe plus générale (Date) offrant un membre statique Today() qui crée le Date correspondant). En plus d'être inutile, elle est très spéciale. C'est quoi ce 372 ? C'est pour les cas où on aurait une année de plus de 371 jours dans les mois qui viennent ? Pourquoi est-ce que Date() ne renvoie pas tout simplement un time_t ? (qui est une valeur qui ne revient que très, très, très rarement en arrière - et peut donc être utilisée pour ordonner les dates, tout aussi bien que ce const int étrange).
    : DDD

    Je l'ai faite séparément du fait qu'elle inclue dans son .cpp la bibliothèque <time.h>. Ce qui aurait provoqué son appel à chaque fois ?!

    Qu'entends-tu par time_t ? Un entier ?

    Le fait que la classe Date n'existe pas te force d'ailleurs à exporter la date sous la forme de ce const int licencieux, et tu perds du même coup le sens de la donnée. Après tout, je peux faire (date *= 2) si date est un int ; c'est plus compliqué si date est un Date
    Je pourrais donc créer une classe Date qui aurait comme membre 3 entiers -> jour, mois, année ?
    (J'ai depuis peut aussi saisi l'importance des opérateurs)

    En parlant de gestion du temps : c'est quoi, la taille du temps ? (TimeSize)
    Vue que je stocke mes jours mois et années dans un seul int, 2013 * 371, ça faisait un très grand chiffre à stocker dans mon save.txt.
    Du coup j'ai fixé une date de début et date de fin. (Recherche de date plus rapide (bien que j'aurais pu stocker la date mini et la date maxi créée...))

    ConsoleGet, ConsoleSet ? C'est un peu exagéré
    Du coup je mets les deux dans "ConsoleFlow" ?!

    En Java et en C", on accède à la console via une classe statique nommée Console. Cette classe fournit les services de lecture et d'écriture sur la console (l'abstraction utilisée n'est pas la même : en C#, la classe Console utilise les fonctions Win32 d'accès au sous-système console, ce qui permet en outre d'obtenir des infos supplémentaires sur la console (taille en X, taille en Y, nombre de lignes dans le buffer...), de contrôler la position des caractères, etc). Je te propose de mettre en place une interface similaire plutôt que d'utiliser 2 classes.
    J'ai en effet été confronté au problème lorsque j'ai voulu transvasé mon code sur Qt..

    Globalement, je vois bien qu'il y a une volonté de bien structurer le programme. Dans l'ensemble, c'est un bon début - mais ce n'est qu'un début, et il y a encore fort à faire pour rendre le code présentable
    Je cacherais donc le fait que ça fait quelque mois que je suis dessus
    En tout cas merci beaucoup ! On m'a vraiment aidé à mieux m'en sortir et j’espère bien un jour devenir irréprochable ^^

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

Discussions similaires

  1. Des couleurs en mode console
    Par davcha dans le forum MFC
    Réponses: 3
    Dernier message: 08/05/2004, 14h37
  2. Mode console par défaut
    Par sekiryou dans le forum Administration système
    Réponses: 5
    Dernier message: 05/03/2004, 06h38
  3. Mode console et MFC ??
    Par G3G3 dans le forum MFC
    Réponses: 7
    Dernier message: 20/02/2004, 17h49
  4. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59
  5. Editeur en mode console
    Par logramme dans le forum C
    Réponses: 5
    Dernier message: 11/06/2002, 13h23

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