Si vous améliorez la qualité du code tout en travaillant sur une branche de fonctionnalité

11

J'aime vraiment cet article sur le fait de laisser le code / camping dans un état plus agréable que vous ne l'avez trouvé - cela semble être une approche pratique dans le monde réel pour rester au top de la propreté du code.

J'aime aussi beaucoup les branches de fonctionnalités comme moyen de développer des fonctionnalités isolément, de sorte que si vous ne l'aimez pas, vous ne pouvez pas facilement les fusionner, etc.

Cependant, si je travaille sur une branche de fonctionnalité et que je repère du code laid, dois-je le réparer?

Il semble qu'il y ait plusieurs inconvénients à le réparer:

  • Lorsque je fusionne la branche, le diff sera désordonné, encombré de noms de variables ou d'extraction de fonctions
  • Si la fonctionnalité est abandonnée, vous devez soit choisir la validation de nettoyage (qui peut ou non fonctionner selon la façon dont le code à proximité a changé, ce qui rend la fusion désordonnée), la refaire ou simplement l'abandonner.

D'un autre côté, si je ne le fais pas pendant que je suis dans le fichier, alors j'oublierai clairement de le faire dans quelques jours lorsque je fusionnerai la branche.

J'ai été averti que c'était basé sur une opinion (je pense juste que le titre comprend should), mais j'ai l'impression qu'il y a une réponse (certainement les gens utilisent ces deux approches donc ils doivent avoir une réponse). De plus, les questions development methodologiessont sur le sujet et je pense qu'elles nécessitent un certain degré d'opinion.

T. Kiley
la source
@gnat Une lecture utile, merci. Je ne pense pas que ce soit tout à fait une dupe, car il s'agit de branches qui ont un long temps de rotation. Je demande spécifiquement comment réconcilier la bonne approche de camper pour la refactorisation avec le développement de la branche de fonctionnalité.
T. Kiley
Cela dépend du stade de développement du projet. Si le projet a subi pas mal de tests et est mis en service, je pense qu'il est très risqué de changer tout ce qui ne fait pas partie de ce qui devait être corrigé. Beaucoup de gens ont inséré des bugs qui changent des choses qui n'auraient rien dû affecter. Si le projet est au stade de développement, plus le code est propre, mieux il démarre, alors je nettoierais probablement tout le fichier si nécessaire.
Dunk

Réponses:

8

Vous ne devez «corriger» le code dans une branche de fonctionnalité que si vous modifiez de toute façon ce morceau de code dans le cadre de la fonctionnalité.

Par exemple. Je travaille sur la fonction "imprimer des lapins" et je trouve le code de l'imprimante

Public class Printer(string type)
{
    If(type=="bunnies")
    {
        //print a bunny
    }
.....
}

Je le change en:

Public class Printer(string type)
{
     PrintFunctionDictionary[type].Print();
}

Pourquoi:

  • Je travaille sur le code,
  • Je dois le changer pour ajouter des fonctionnalités,
  • la fonctionnalité ajoutée suggère une façon refondue de résoudre le problème.

Je ne frappe pas au hasard une autre partie de la base de code et «l'améliore» comme cela:

  • Affrontez des personnes travaillant sur d'autres fonctionnalités.
  • Utilisez le temps qui devrait être alloué au développement de la fonctionnalité.
  • Ajoutez du code arbitraire à une branche qui, si la fonctionnalité n'est pas terminée, ne peut pas être fusionnée dans le produit principal. De même, si je rétrograde la fonctionnalité, je perdrai ma refactorisation.
Ewan
la source
1
Je suis d'accord que c'est une bonne chose à essayer, et dans un monde idéal, cela fonctionnerait toujours. Cependant, dans le code du monde réel, les situations sont souvent plus complexes - lorsque vous travaillez sur une fonctionnalité, on peut généralement trouver des parties du code qui pourraient valoir la peine d'être refactorisées indépendamment de la fonctionnalité. Ce code peut interférer avec l'implémentation de la fonctionnalité, mais ne doit pas être limité aux méthodes ou classes en relation directe avec la fonctionnalité. Et un changement ne dérange pas nécessairement les autres.
Doc Brown
1
vous pouvez toujours faire une branche de refactorisation séparée. Comme je le vois bien que les branches de fonctionnalité soient principalement une chose de gestion de projet qui vous permet d'aller "la fonctionnalité X n'était pas terminée mais nous pouvons la libérer avec toutes les autres" et "la fonctionnalité X est libérée" donc nous ne nous attendons pas à ce que la fonctionnalité Y change. En ajoutant le refactoring à une fonctionnalité, vous pourriez potentiellement rompre ces avantages
Ewan
5

Si vous souhaitez que vos refactorisations "vivent indépendamment" de votre branche de fonctionnalité actuelle, n'y apportez pas les modifications. Au lieu de cela, effectuez le refactoring sur la branche de développement principale (ou une "branche de refactoring", s'il est courant dans votre équipe de ne pas appliquer les modifications directement à la branche de développement). Ainsi, n'importe qui de votre équipe (y compris vous) peut fusionner les modifications dans les branches de fonctionnalités actives sur lesquelles il travaille. Cependant, veillez à ne pas appliquer de refactorisations globales dans "la moitié de la base de code" sans demander d'abord la permission à vos collègues - ils pourraient ne pas être si heureux si vos refactorings interfèrent trop avec leur travail actuel.

L'exception est ici lorsque les améliorations que vous apportez sont locales aux parties de la base de code que vous touchez exactement dans cette branche de fonctionnalité, et cela n'a aucun sens de leur donner un cycle de vie différent de votre "nouvelle fonctionnalité".

Doc Brown
la source
3

Le but des branchtypes est de fournir l' intention de les manipuler. Si vous suivez un style GitFlow de ramification, alors vous avez probablement des types comme feature, hotfix, release, etc .. Dans le cas d'une branche de fonction, son intention est d'encapsuler une fusion dans une autre branche (c. -à develop) qui montre le développeur responsable fusion, quelle est cette fonctionnalité. Si le code que vous nettoyez ne fait pas partie de cette fonctionnalité, ne le modifiez pas.

Au lieu de cela, recherchez la branche la plus basse possible dans laquelle le code laid se trouve (probablement develop) et branchez-vous à partir de là. Modifiez le code et proposez-le de le fusionner en tant que fonctionnalité. Si vous avez besoin de ce code dans ce sur quoi vous travaillez et que vous voulez surtout éviter les conflits de fusion, fusionnez cette branche dans VOTRE branche.

Voici une assez bonne explication des différentes stratégies: https://www.atlassian.com/git/tutorials/comparing-workflows/

TomSchober
la source
0

si je travaille sur une branche de fonctionnalité et que je repère du code laid, dois-je le réparer?

Il est probablement correct de corriger le «code laid» à vue, selon le tempo du projet, la «laideur» du code, etc., mais essayez de ne pas le faire sur la branche de fonctionnalité elle-même.

  • Si votre branche de fonctionnalité est entièrement locale, stockez ou validez les modifications non enregistrées, consultez la branche de développement, effectuez la modification, puis revenez à votre branche de fonctionnalité et rebasez le développement.
  • Si vous ne pouvez pas rebaser hors développement (par exemple, votre branche de fonctionnalité est sur un serveur public), vous pouvez toujours choisir le commit hors développement si vous en avez besoin ou si vous souhaitez éviter les conflits plus tard.
  • Si vous modifiez un fichier et que vous devez vraiment valider le correctif dans le code laid en ce moment et que vous ne pouvez vraiment pas passer au développement, vous pouvez le corriger, l'utiliser git add -ppour le corriger, valider cette modification uniquement et avant de fusionner / push (en effet, de préférence après votre prochain commit), utilisez un rebase interactif pour déplacer ce commit vers le point le plus tôt possible dans votre branche, ou peut-être même choisir le développement, en fonction de votre historique.

Je le ferais également avec tout autre élément qui «corrige» la branche de développement (où «correctifs» sont des modifications que vous ou tout autre développeur pouvez apporter à vue pour vous assurer que le code respecte les normes). CA aide...

  • pour conserver vos correctifs et votre fonctionnalité validée dans différents groupes afin que le journal soit plus lisible,
  • de maintenir le développement le plus près possible de la possibilité de diffusion à tout moment, et
  • pour éviter la duplication du travail (plusieurs personnes fixant le même problème de manière subtilement différente sur différentes branches).
user52889
la source