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 :

détecteur de redondances et zones de refactoring prioritaires


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Par défaut détecteur de redondances et zones de refactoring prioritaires
    Hello!

    Je suis sur ma première opération de refactoring d'un code pas-à-moi! C'est super intéressant, mais je ne suis pas certain d'utiliser les bons outils.

    Par exemple, le codeur (un physicien) a largement copié collé et dupliqué son code sur des millier et des milliers de lignes. Ca donne des choses comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
                              MPI_Send(&save_x_i2cg_INRTL[ii][eee][ispan_constellation], 1, MPI_DOUBLE, ccc, iProc, MPI_COMM_WORLD);
                              MPI_Send(&save_y_i2cg_INRTL[ii][eee][ispan_constellation], 1, MPI_DOUBLE, ccc, iProc, MPI_COMM_WORLD);
                              MPI_Send(&save_z_i2cg_INRTL[ii][eee][ispan_constellation], 1, MPI_DOUBLE, ccc, iProc, MPI_COMM_WORLD);
     
                              MPI_Send(&save_vx_i2cg_INRTL[ii][eee][ispan_constellation], 1, MPI_DOUBLE, ccc, iProc, MPI_COMM_WORLD);
                              MPI_Send(&save_vy_i2cg_INRTL[ii][eee][ispan_constellation], 1, MPI_DOUBLE, ccc, iProc, MPI_COMM_WORLD);
                              MPI_Send(&save_vz_i2cg_INRTL[ii][eee][ispan_constellation], 1, MPI_DOUBLE, ccc, iProc, MPI_COMM_WORLD);
     
                              MPI_Send(&save_ax_i2cg_INRTL[ii][eee][ispan_constellation], 1, MPI_DOUBLE, ccc, iProc, MPI_COMM_WORLD);
                              MPI_Send(&save_ay_i2cg_INRTL[ii][eee][ispan_constellation], 1, MPI_DOUBLE, ccc, iProc, MPI_COMM_WORLD);
                              MPI_Send(&save_az_i2cg_INRTL[ii][eee][ispan_constellation], 1, MPI_DOUBLE, ccc, iProc, MPI_COMM_WORLD);
    Souvent il y a des comportements entiers (sur plusieurs dizaines de lignes) qui au lieu d'avoir été extraits en méthodes, ont été copié collé dans la même fonction en changeant le nom d'une variable.
    Du coup j'essaie d'identifier les portions de code qui ont la plus forte priorité en terme de refactoring, c'est à dire trouver les redondances qui maximisent la longueur du pattern répété et le nombre de répétitions.
    Existe-t-il un outil qui fait ça ou bien je dois scroller à travers tout le code manuellement ?

    Merci !

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 489
    Par défaut
    Je trouve votre métrique d’efficacité assez spéciale.
    En général, le but d'un refactoring est de combler une dette technique et d'améliorer la maintenance et l'évolutivité.
    C'est donc une chose qu'on doit faire de manière "globale" et non simplement réduire le nombre de ligne "redondante".

    Pour votre exemple, le code n'utilise pas le bon niveau d'abstraction et il faut juste concevoir un module intermédiaire qui simplifie l'utilisation de "MPI_Send" de manière cohérente.
    Donc, je conçois un module cohérent avec un modèle d'usage, qui n'a que peu de lien avec l'utilisation actuelle de "MPI_Send" car il doit simplifier le "vieux" code mais surtout être facile d'usage aussi pour les besoins futurs.

    Une fois ce module bien conçu et implémenté, vous coupez la possibilité au vieux code d'utiliser l'API de bas niveau ( ici "MPI_Send") et vous corrigez les erreurs en utilisant le nouveau module qui fera son oeuvre : simplification des codes utilisateurs existant et facilitation de l'évolution de ce nouveau code.

    Le bon paramètre, c'est pas la longueur en caractère du remplacement mais la "douleur" (en nombre de bugs qui ont été corrigés dans un module dû à une dette technique par exemple) ou en surcoût sur des nouveaux développement par manque de ce module supplémentaire/restructurant.

    Un code "sale", long, mais qui ne génère pas de bugs ni de problème avec de évolution ne devrait pas être prioritaire.

  3. #3
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 527
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 527
    Par défaut
    Citation Envoyé par Seabirds Voir le message
    Hello!
    Existe-t-il un outil qui fait ça ou bien je dois scroller à travers tout le code manuellement ?
    Merci !
    dans visual studio cliquer sur la fonction que l'on veut,par exemple save_vx_i2cg_INRTL, clic droit et "chercher toutes les références" après il y a une liste qui sort
    Sinon avec un simple éditeur de texte comme Notepad++ qui surligne les mots se répétant

  4. #4
    Membre éclairé Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Par défaut
    Merci à vous deux pour vos réponses!

    Bacelar, je comprends ce que tu veux dire. Mon problème est qu'il y a tellement à faire et si peu de temps que je voulais prioriser la modification qui aurait le maximum d'impact positif (et la concrètement pour ce projet, c'est diminuer le nombre de lignes - tout est "très très douloureux"!).

    J'imagine que je vais juste devoir choisir un entry point et commencer par là ... :/

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    J'arrive un peu tard, mais un profiler peut donner ce type d'informations. Notamment le nombre d'appel de chaque fonction

  6. #6
    Membre éclairé Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Par défaut
    ternel!

    Ok je note cette jolie fonctionalité du profiler! Mais le problème c'est que ... il n'y a pas de fonctions Enfin si, mais elles font 5000 ou 6000+ lignes et ne sont appelées qu'une fois.
    Bon en vrai j'ai fait ce que j'ai pu en 1 mois de refactoring, et puis voilà. C'est sauvage le refactoring. A la machette qu'on y va!

    Bref pour ce que ça vaut, je quitte enfin l'académique et pars dans le videogame industrie de Seattle!

    Arno

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 29/01/2024, 15h32
  2. Afficher la zone de données du BIOS
    Par foussa dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 20/01/2003, 16h47
  3. Passer de la zone d'édition vers une instruction sql
    Par tripper.dim dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/11/2002, 14h44
  4. [VB6] Zone de liste modifiable basée sur un champ
    Par pepper dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 27/11/2002, 13h41
  5. Réponses: 17
    Dernier message: 17/10/2002, 20h06

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