Kata de refactoring N°1

Pour me préparer aux sélections de code story et pouvoir coder pendant 2 jours une application devant des centaines de développeurs à Devoxx, je me suis entrainé à refactorer une méthode en m’enregistrant.

Le bénéfice que j’attendais de l’exercice était de :

  • M’entendre parler pour détecter mes défauts d’expressions et les corriger, car le jour J il faudra expliquer ce qu’on fait et pourquoi, le tout en codant ! Pas facile…
  • Maîtriser au maximum mon IDE pour être rapide à coder, rien de plus ennuyeux que de regarder un développeur coder trop lentement !

Pour la petite histoire, je suis partie d’une classe que je venais de refactorer chez un client, il s’agit donc d’un exemple réel. J’ai fait environ 15 essais avant les sélections pour finalement me faire éliminer ! Je suis bon perdant, et je me suis dit que les quelques techniques simples que j’explique pouvaient être intéressantes et que c’était dommage de  garder le screencast pour moi. Du coup j’ai refait 5 essais et voici le résultat :

Ce n’est pas parfait ! J’ai même fait une grossière erreur en cassant le comportement de la méthode. Le premier qui trouve où gagne une bière (la date du commentaire faisant foi) ! Si vous trouvez d’autres boulettes ça marche aussi, à l’exclusion de l’utilisation de framework ou de l’API java, Boolean.compareTo par exemple, car ce n’est pas le propos de l’exercice. D’ailleurs s’il y a une chose que je retiens c’est qu’on peut toujours faire mieux !

Pour ceux qui voudrait faire pareil :

  • Achetez un bon casque / micro ! (le mien clic! de temps en temps, il faut que j’en rachète un !)
  • Sous linux j’utilise Kazam pour l’enregistrement et key-mon pour montrer ce que j’écris.
  • Limitez vous à un exercice de moins de 10minutes, on décroche si c’est trop long.
  • N’ayez pas honte !

Bon code à tous !

14 Responses to “Kata de refactoring N°1”

  1. François dit :

    Bonjour Jean-Baptiste,

    Super ta vidéo ! J’adore les katas, tu peux continuer 😀

    Allez je me risque, pour moi dans ton second appel à atLeastOneNull dans compareName tu ne passes plus les Name en attribut de la méthode mais les objets.

    François.

  2. Samuel dit :

    A tout hazard, atLeastOneNull qui compare epp1 et epp2 au lieu de epp1.getName() et epp2.getName() 😉

    Comme quoi c’est vrai, les TU ca sert.

  3. Jean-Baptiste dit :

    Bien vu ! Je te dois une bière :)

  4. Loïc dit :

    Kata bien intéressant, merci, hâte de voir la suite.

  5. ugo dit :

    Super kata !
    Ca me donne plein d’idée pour en faire moi même pour plein d’autre demo que le refactoring.
    Vraiment Bravo très inspirant.

  6. fsznajderman dit :

    Très interessant! Merci

  7. Xavier Hanin dit :

    Très sympa ce kata et source d’inspiration!

    Juste un petit truc vers 5’40 j’aurais utilisé le refactor inline plutôt que de le faire à la main.

  8. KantiTheFou dit :

    Tu peux créer une nouvelle méthode :

    int compareInt(int a, int b)
    {
    return (a == 0 ? a : b);
    }

    et ensuite refactorer la méthode compare de la manière suivante :
    public int compare(EssentialPackProduct epp1, EssentialPackProduct epp2)
    {
    return (atLeastOneNull(epp1,epp2) ? 0 : compareInt(compareInt(compareBoolean(epp1.isHospital(), epp2.isHostipal()), compareBoolean(isEppAvailable(epp2), isEppAvailable(epp1))), compareName(epp1, epp2)));
    }

  9. David Gageot dit :

    Merci Jean-Baptiste pour cette vidéo. J’ai appris le raccourcis pour décaler tout un bloc. nice !

    Ne penses-tu pas que tu aurais pu aller encore plus loin dans le refactoring en simplifiant les méthodes extraites ?

    Aussi, le méthode atLeastOneNull n’a pas besoin d’etre générifiée. Elle peut fonctionner sur de simples Object. C’est plus lisible a mon avis.

    Sinon, comme le dit Xavier, tu peux utiliser le refactor inline.

  10. Jean-Baptiste dit :

    !!! J’ai appris un truc a David Gageot !!!

    @david : On peut toujours faire mieux :) Sinon je me suis arretté là pour le screencast, car j’ai présenté ce que je voulais présenter : les trucs de bases.

    @Xavier : Merci pour le tip inline, je n’ai pas l’habitude de l’utiliser. J’ai essayé après coup et bizarrement ça n’a pas fonctionné, il ne me prend que la premiere variable. Je suis sous IntelliJ 10. Il faut que j’essaye avec la 11, c’est peut être un bug.

    @Kanti bonne idée mais il faut réussir à le formatter pour que ce soit lisible…

  11. Xavier Hanin dit :

    Je suis sous la 10 aussi et en général ça marche très bien. Il faut se mettre sur la variable à inliner, puis cmd+alt+n sous mac. C’est un refactor tres pratique, l’exact opposé du « extract local variable » (cmd+alt+v sous mac), je passe souvent de l’un à l’autre en fonction de la lisibilité souhaitée.

  12. Jean-Baptiste dit :

    @xavier Ha ok, je sélectionnais le bloc de code entier…

  13. bartavelle dit :

    @David Gageot : Le fait d’utiliser une méthode générique permet de garantir que l’on compare deux choses de même type.

  14. thierryler dit :

    Heu… Comment on fait des jolies vidéos comme ça ?

Leave a Reply