2010-11-18 6 views
5

Je vais créer la table de comparaison des outils de refactoring C++ automatisés existants et explorer une capacité de création d'un tel outil, gratuit et open-source.Quels refactorings C++ utilisez-vous en pratique?

Ma question est: quels refactorings utilisez-vous vraiment dans votre travail quotidien? Il y a des choses évidentes comme renommer variable/classe/méthode, mais y a-t-il quelque chose de spécifique pour C++, comme traiter les templates, STL, les constructeurs de copie, les initialiseurs, etc., etc? Je suis intéressé par la construction d'une image réaliste de tous les petits problèmes auxquels le développeur C++ est confronté chaque jour dans son codage et qui pourrait être automatisé au moins en théorie. Je parle à mes collègues, mais ce n'est probablement pas suffisant.

Merci d'avance.

+3

Bonne chance dans la création d'un analyseur C++ décent pour faire fonctionner un tel outil. –

+0

Lorsque je développais en C++, je n'utilisais pas beaucoup le support de refactoring de l'EDI. Il n'y en avait tout simplement aucun que je trouvais vraiment utile. Mon conseil serait d'apprendre vos modèles de conception, lire Effective C++ de Meyer, puis 101 normes de codage. Apprenez à le faire plus ou moins dès le début. –

+0

@Daniel: Le refactoring est l'outil principal d'un développeur, quel que soit le programme. En accord avec le principe KISS, vous ne plongez pas dans des modèles juste pour le plaisir, mais seulement les utiliser au coup par coup pour ce dont vous avez besoin en ce moment ... car vous n'êtes pas un oracle. –

Répondre

1

Comme vous avez dit il y a des choses évidentes:

  • changement de nom est une
  • modifie une signature de fonction est une autre (d'autant plus que la fonction est presque nécessairement dupliqué: déclaration dans l'en-tête et la mise en œuvre dans la source)
  • renommer/déplacer un fichier (mise à jour des directives Include)

Notez que bien qu'il soit de base, il est rarement bien traitée. Ma plainte principale étant que les commentaires ne sont généralement pas mis à jour (je ne parle donc pas de désordre inutile généré par doxygen). Donc, si je décrivais l'utilisation de la classe dans un en-tête, ou la justification de l'utilisation de cette classe dans un autre fichier source, le commentaire est désormais obsolète car en renommant la classe, personne ne saura à quoi il se réfère ...

Il y a des cas cependant beaucoup plus intéressantes:

  • Lors de la modification d'une signature de la fonction, vous devez mettre à jour tous les sites d'appel, le développeur aura besoin d'aide pour les localisant
  • Avec l'héritage, la capacité d'agir sur toutes les classes d'une hiérarchie: modification (encore une fois) d'une signature de fonction ou ajout/suppression d'une substitution virtuelle. Avec le template: la proposition Concept ayant été supprimée, il serait bon de pouvoir synthétiser les exigences sur le type passé (méthodes/types internes nécessaires) de sorte qu'en modifiant ces exigences (en modifiant la définition du template) on soit notifié de la liste des classes qui sont utilisées par ce modèle et ne s'y conforment plus (et doivent être mises à jour). Notez que dans le cas où il s'agit juste de renommer le type/la méthode, vous pouvez vouloir propager automatiquement la modification, tant qu'elle ne casse rien d'autre.

Bonne chance ...

+0

Le simple changement de nom est difficile. Imaginons de renommer I en J ... où il y a un J dans une portée entre la déclaration de I et l'utilisation de I ("ombrage"). Cela inclut les portées intermédiaires avec héritage multiple; J peut même ne pas apparaître explicitement dans la déclaration de portée réelle. Prendre plaisir. –

1

Voici un modèle de conception C++ que j'ai inventé hier: Héritage de fossé en faveur des politiques.

+1

La première fois que j'ai lu que je suis venu avec * héritier Fossé en faveur de ** politique **. * –

+0

Alexandrescu ne l'a pas fait avant vous ou avez-vous juste réalisé comment de bonnes politiques où? –

+2

Les stratégies utilisent l'héritage. – StackedCrooked

1

Un refactoring que je souhaite a été pris en charge est en fait méthode inject. Plus ou moins le contraire de extrait méthode. Parce que peut-être je vois que je peux alors réorganiser le code résultant pour une meilleure clarté ou un effet; mais je ne suis pas au courant qu'il existe des outils pour cela.

2

Il est assez clair d'après les réponses que peu de programmeurs C++ ont déjà vu un véritable outil de refactoring. Oui, ils sont assez rares et très spécifiques à l'IDE que vous utilisez. C'est inévitable, il n'y a pas d'autre moyen de savoir quels fichiers de code source contribuent au code de l'exécutable final. Le préprocesseur rend le processus très compliqué, vous devez connaître les valeurs des macros. Un analyseur de code source est requis mais pas suffisant.

Visual Assist pour VS est un que je connais.

Questions connexes