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 !
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.
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.
Bien vu ! Je te dois une bière
Kata bien intéressant, merci, hâte de voir la suite.
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.
Très interessant! Merci
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.
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)));
}
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.
!!! 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…
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.
@xavier Ha ok, je sélectionnais le bloc de code entier…
@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.
Heu… Comment on fait des jolies vidéos comme ça ?