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 :

Conception et optimisation de code


Sujet :

C++

  1. #1
    Membre confirm�
    Homme Profil pro
    Technicien r�seaux et t�l�coms
    Inscrit en
    Avril 2007
    Messages
    87
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activit� : Technicien r�seaux et t�l�coms
    Secteur : High Tech - Produits et services t�l�com et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 87
    Par d�faut Conception et optimisation de code
    Bonjour,

    Je viens de terminer un projet, il fonctionne, mais je sais qu'il y a probablement beaucoup d'am�liorations possibles au niveau de la conception du code.

    Le programme sert � calculer le temps n�cessaire pour arriver sur un village ennemi dans un jeu. Il est possible d'ajouter des mondes et d'ajouter des villages. Il est �galement possible d'exporter cela pour copier le BBCode sur le forum du jeu.

    Le code est � cette adresse : http://www.fatal-destiny.com/tribaltime.zip

    Auriez-vous quelques recommandations/conseils � me donner ?

    Merci d'avance !

  2. #2
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Salut,

    J'ai survol� et je crois qu'il y a d'abord la conception � remanier.

    ConfigMonde et Village peuvent se r�duire � des structures. Leur constructeur par d�faut ne sert � rien.

    TribalTime a trop de responsabilit� => � refactoriser pour bien s�parer les diff�rentes responsabilit�s. J'ai l'impression qu'elle regroupe � la fois les responsabilit�s d'affichage, de contr�le et de mod�le (cf Mod�le/Vue/Contr�leur par exemple)

    Pourquoi utiliser des float ?

    Tu utilises � plusieurs reprises des int pour g�rer du 1/0 => bool.

    J'aime pas (et ce n'est pas MISRA par exemple) les d�finitions multiples sur la m�me ligne :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
            float vitMonde = ui->vitesseMondeAjout->text().toFloat(),
                vitUnite = ui->vitesseUniteAjout->text().toFloat();
    =>
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
            float vitMonde = ui->vitesseMondeAjout->text().toFloat();
                float vitUnite = ui->vitesseUniteAjout->text().toFloat();
    Il y a des constantes 'magiques' : exportation->setGeometry(20, 20, 360, 160); par exemple. Pourquoi 20,20,360,160 ? Ca repr�sente quoi ? Il y a-t-il un rapport entre elles ?

    Je n'aime pas les tests � rallonge. Exemples :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    if(ui->xVillageCible->text().toInt() > 0 && ui->yVillageCible->text().toInt() > 0 && ui->xVillagePersonnel->text().toInt() > 0 && ui->yVillagePersonnel->text().toInt() > 0)
    if(numMonde > 0 && vitMonde > 0 && vitUnite > 0)
    if(nomVillage.length() > 0 && xVillage > 0 && xVillage <= 1000 && yVillage > 0 && yVillage <= 1000 && (groupeVillage == 0 || groupeVillage == 1))
    On ne sait pas dire quel est l'objectif du test.


    Je me m�fie des constructions : while(std::getline(listeMondes, ligneFichier) && stop == 0). En g�n�ral la seconde condition de sorties est soit parce que le parcours ne devait pas �tre complet soit une gestion cach�e d'erreur. Voir break (ou return si la responsabilit� a �t� isol�e dans une fonction d�di�e) dans le premier cas, et ne pas avoir peur des exceptions.

    Ou quelque chose m'�chappe, ou :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
                    for(my_tok::const_iterator i = tok.begin(); i != tok.end(); ++i)
                    {
                        if(a == 0)
                            element = QString::fromStdString(*i).toInt();
     
                        a++;
                    }
    doit pouvoir se r�duire plus clairement �
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
                    my_tok::const_iterator i = tok.begin()
                    if(i != tok.end())
                    {
                            element = QString::fromStdString(*i).toInt();
                    }
    Je pense qu'en construisant un it�rateur sur la lecture des enregistrements du fichier permettrait d'�crire une partie des fonctions � l'aide des algos de la STL de fa�on plus expressives (tout les while(std::getline(listeVillages, ligneFichier) && stop == 0))

    Tu dois pouvoir utiliser des tuples pour �viter les boucles avec la variable a sur les cha�nes d�coup�es en token.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    QDateTime heureArrivee = heureDepart.addSecs(-(ceil(60*(tempsUnites[ui->selectionUniteLente->currentIndex()]/(this->vitesseMonde*this->vitesseUnite))*nbCases)+delais));
    ... Une expression comme �a, je ne sais pas dire si la formule est valide, si les variables utilis�es dans la formule sont les bonnes, si les types sont bons.

    ui devrait �tre g�r� dans un unique_ptr.

    unites et tempsUnites sont des donn�es statiques, connues � la compilation et reconstruites � chaque fois. C'est dommage.

    Tu n'as pas besoin de this-> pour acc�der aux variables membres.

    Voil� pour une premi�re vol�e de remarques. Je pense qu'il y en a encore d'autres.

    Sinon, les noms semblent bien appropri�s. Ca facilite grandement la lecture et �a aide � comprendre l'objectif de la variable/fonction/classe/etc..

  3. #3
    Membre confirm�
    Homme Profil pro
    Technicien r�seaux et t�l�coms
    Inscrit en
    Avril 2007
    Messages
    87
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activit� : Technicien r�seaux et t�l�coms
    Secteur : High Tech - Produits et services t�l�com et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 87
    Par d�faut
    Merci beaucoup pour tes explications !

    J'ai quelques questions cependant :

    - Pourquoi mettre des double � la place des float ? Un float ne prend-t-il pas moins de m�moire qu'un double ? Je sais qu'ils sont moins pr�cis, mais je ne sais pas � quel point ?

    -
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    std::vector<int> tempsUnites; //temps par unité en secondes
        tempsUnites.push_back(35); //noble
    Il faudrait que je d�clare le vecteur dans tribalTime.h, mais est-ce que je peux le remplir �galement dans ce fichier ? Au passage, n'est-il pas possible de remplir mon vecteur en une fois au lieu d'utiliser � chaque fois push_back() ?

    - Pour ce qui est de l'unique_ptr je ne comprends pas trop. Si j'ai bien compris, c'est un peu comme auto_ptr ou shared_ptr, et le but serait de lib�rer correctement la m�moire. Je ne sais pas si c'est correct ?

    -
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    my_tok::const_iterator i = tok.begin();
      if(i != tok.end())
      {
          element = QString::fromStdString(*i).toInt();
      }
    Dans la mesure o� je suis certain d'avoir toujours au moins une valeur pour i, la condition est-elle utile ?

    - Pour ce qui est des tuples, je suppose que tu parles de ceux de Boost.

    - Pour ce qui est du MVC, je devrais, par exemple, regrouper les fonctions comme "ajouterMonde, etc." dans une classe mod�le, "exporter, aPropos, etc." dans une classe vue, et pour le contr�leur je ne vois pas de trop.

    Encore merci !

  4. #4
    Membre exp�riment�

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Par d�faut
    Citation Envoy� par Portus Voir le message
    Merci beaucoup pour tes explications !

    J'ai quelques questions cependant :

    - Pourquoi mettre des double � la place des float ? Un float ne prend-t-il pas moins de m�moire qu'un double ? Je sais qu'ils sont moins pr�cis, mais je ne sais pas � quel point ?
    Double est le type par d�faut pour les calculs flottants. Float ne devrait �tre utilis� que pour des cas tr�s particuliers (comme le stockage de nombreuses donn�es).

    -
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    std::vector<int> tempsUnites; //temps par unité en secondes
        tempsUnites.push_back(35); //noble
    Il faudrait que je d�clare le vecteur dans tribalTime.h, mais est-ce que je peux le remplir �galement dans ce fichier ? Au passage, n'est-il pas possible de remplir mon vecteur en une fois au lieu d'utiliser � chaque fois push_back() ?
    Tu ne devrais pas mettre de code dans les headers, seulement des d�clarations de types et de fonctions, autrement, tu va ex�cuter le code � chaque fois que ton header sera inclu par un autre fichier, ce qui est beurk.

    - Pour ce qui est de l'unique_ptr je ne comprends pas trop. Si j'ai bien compris, c'est un peu comme auto_ptr ou shared_ptr, et le but serait de lib�rer correctement la m�moire. Je ne sais pas si c'est correct ?
    unique_ptr est une nouveaut� de C++11. C'est en gros un boot::scoped_ptr qui peut �tre d�plac� (il poss�de un constructeur de copie et un op�rateur d'affectation qui prennent en param�tre une rvalue reference). Il est � pr�f�rer � shared_ptr quand une ressource a un seul propri�taire.
    <mode jedi>Du dois oublier auto_ptr, il n'a jamais exist�. D'ailleurs, ce ne sont pas ces droides que tu recherches *mouvement de la main*.</mode jedi>

    - Pour ce qui est des tuples, je suppose que tu parles de ceux de Boost.
    Ou de ceux de c++11...

  5. #5
    Membre confirm�
    Homme Profil pro
    Technicien r�seaux et t�l�coms
    Inscrit en
    Avril 2007
    Messages
    87
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activit� : Technicien r�seaux et t�l�coms
    Secteur : High Tech - Produits et services t�l�com et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 87
    Par d�faut
    Ok, merci !

    Tu ne devrais pas mettre de code dans les headers, seulement des d�clarations de types et de fonctions, autrement, tu va ex�cuter le code � chaque fois que ton header sera inclu par un autre fichier, ce qui est beurk.
    Donc, je d�clare mon vecteur dans le .h et je fais les push_back() dans le constructeur par exemple ?

    Pour ce qui est des tuple, et tout ce qui touche � c++11, il faut que je change la version de gcc avec laquelle QtCreator compile apparemment :s

  6. #6
    Membre exp�riment�

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Par d�faut
    Pour QtCreator et C++11, tu peux rajouter la ligne

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    QMAKE_CXXFLAGS += -std=c++0x
    � ton fichier pro pour passer en mode C++11 (test� avec GCC 4.6 et QtCreator 2.4.1).

    Pour ton vector, il faut faire des push_back dans le constructeur ou utiliser une liste d'initialisation si tu es en C++11.

  7. #7
    Membre confirm�
    Homme Profil pro
    Technicien r�seaux et t�l�coms
    Inscrit en
    Avril 2007
    Messages
    87
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activit� : Technicien r�seaux et t�l�coms
    Secteur : High Tech - Produits et services t�l�com et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 87
    Par d�faut
    C'est ce que je cherchais, merci !

    Oui, je viens de voir pour les listes d'initialisation, vraiment pratique.

  8. #8
    Membre confirm�
    Homme Profil pro
    Technicien r�seaux et t�l�coms
    Inscrit en
    Avril 2007
    Messages
    87
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activit� : Technicien r�seaux et t�l�coms
    Secteur : High Tech - Produits et services t�l�com et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 87
    Par d�faut
    Etant donn� que j'utilise directement les donn�es (dans le code suivant, de la fonction getListeMondes()), j'ai choisi une autre solution que les tuples (voir ci-dessous).

    J'esp�re qu'elle est aussi valable.

    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
     
    for(my_tok::const_iterator i = tok.begin(); i != tok.end(); ++i)
    {
        if(a == 0)
        {
            QString element;
            element = QString::fromStdString(*i);
            ui->listeMondes->addItem(element);
        }
        if(a == 1)
        {
            double element;
            element = QString::fromStdString(*i).toDouble();
            vitessesMonde.push_back(element);
        }
        if(a == 2)
        {
            double element;
            element = QString::fromStdString(*i).toDouble();
            vitessesUnite.push_back(element);
        }
        a++;
    }
    Code que j'ai remplac� par :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    my_tok::const_iterator i = tok.begin();
    ui->listeMondes->addItem(QString::fromStdString(*(i++)));
    vitessesMonde.push_back(QString::fromStdString(*(i++)).toDouble());
    vitessesUnite.push_back(QString::fromStdString(*(i++)).toDouble());
    Merci !

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    R�ponses: 1
    Dernier message: 15/07/2005, 08h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    R�ponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    R�ponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    R�ponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    R�ponses: 2
    Dernier message: 23/01/2004, 10h59

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