Dans cette vidéo, j'aimerais vous montrer que Nautilus
propose des refactorings. Donc qu'est-ce que c'est qu'un refactoring?
C'est une opération qui va transformer du code en
préservant son comportement.
Il faut voir que, historiquement, les refactorings ont
été implémentés pour la première fois dans l'ancêtre de
Pharo, et après ont été dans tous les langages comme Java.
Donc dès 95, Smalltalk avait un outil de refactoring et
celui de Pharo est inspiré de celui-là.
Donc ouvrons Nautilus pour regarder un petit peu les
refactorings qui sont proposés.
Ce qu'on va faire, on va travailler sur notre classe.
Donc vous avez des refactorings à plusieurs niveaux.
Il y a des refactorings au niveau classe, au niveau
méthode et au niveau code. Donc au niveau classe, on a
tous ces refactorings-là.
On va pouvoir avoir des refactorings au niveau des
variables d'instance et au niveau des variables de classe.
Quand un refactoring est très utile en fait, il a été mis
au niveau le plus haut des menus, de façon à ce que vous
alliez plus vite, vous n'avez pas besoin de faire classe,
refactoring, Rename il est ici.
De la même manière, pour les méthodes, les
refactorings on va avoir toutes ces méthodes-là, avec
renommage aussi, comme c'est un refactoring qui est
important à ce niveau-là. Maintenant si je prends un
autre morceau de code, ils ne sont pas très compliqués
dans cette classe, on va avoir les refactorings suivants
qui vont travailler au niveau du code de la méthode.
Si je renomme, si je fais un Rename de la Class Counter,
je vais l'appeler la Class Counter 2, le système me dit ok.
Je fais un Rename, très bien.
Il me donne du retour, je ne sais pas trop ce que c'est
mais ce n'est pas grave, je l'ignore.
Et là ce que je vais voir, c'est que mes endroits où
la Class Counter était invoquée, maintenant j'ai bien Counter 2 à la place.
Donc ça, c'est typiquement un refactoring de renommage de
classe.
Donc maintenant, si je veux renommer, et c'est un très
bon exemple, imaginons que je veuille renommer la méthode incrémente.
Je vais faire Rename, et comme je suis en manque d'inspiration,
je vais aussi l'appeler Increment2.
Là ce que le système me dit, il me dit: attention.
Et là je fais attention.
Attention, tu vas renommer
plusieurs, il y a une dizaine d'implémenteurs dans le
système, tu vas tous les renommer, est-ce que tu veux faire ça?
Premièrement, je ne veux pas le faire et deuxièmement je
n'ai pas envie non plus de sélectionner ou de désélectionner.
Donc on pourrait le faire, ça permet de montrer que le
programmeur est quand même en charge, à la fin, de
choisir, mais moi je ne veux pas le faire.
Par contre ce que je peux faire, c'est dire: moi je suis
en train de travailler vraiment sur que le package mon
Counter et modifier le reste du système, je n'ai pas trop
envie que ça se fasse automatiquement.
Donc ce que je vais faire, je dis à Nautilus: moi j'aimerais
que tu m'ouvres un browser que sur mon package et que
toutes les opérations fassent référence qu'à cette sélection.
Donc c'est ce que je vais faire avec browse scoped.
C'est ce que vous pouvez obtenir aussi quand vous pressez
le bouton Scoped, c'est la même chose.
C'est tellement intéressant comme fonctionnalité qu'on l'a
mise comme bouton. Donc la différence entre ces 2 mondes,
si vous regardez, c'est qu’ici j'ai tous mes packages et
là je n'ai qu'un seul package.
Je pourrais en avoir plusieurs, je n'ai qu'une sélection de ces packages.
Et maintenant, ce que je vais pouvoir faire, c'est que si
je veux modifier Increment, je vais lui dire: “Rename”
en incremente 2, et il va ne le faire que
localement au package ou à la sélection qui est dans le browser Scoped.
Donc je fais OK, et maintenant on va regarder les tests.
Donc déjà mes tests fonctionnent toujours, ils sont toujours verts.
Et ce que je vois, c'est que maintenant tous mes
Increment ont été renommés en Increment2.
Donc là, ce qu'on a vu dans cette vidéo, c'est que Pharo
va vous permettre tout un panel d'opérations, de
sélections et de manipulations de codes, avec en plus la
notion de restrictions à un sous-ensemble de packages
pour contrôler où vont être appliqués les changements.
Donc ce que vous avez aussi dans Pharo, vous avez aussi
un outil qui va vous permettre de faire de la réécriture
de code automatique, je ne vais pas m'étendre, ça si vous
en avez vraiment besoin il faut demander, il y a un outil
spécifique pour faire ce genre de choses.
Maintenant, le dernier point que je voulais vous montrer,
c'est que souvent vous avez des opérations qui vous sont
proposées, qui sont générées.
Vous allez les appliquer, le système vous propose de les
faire mais ce n'est pas dit que ça fonctionne, que ça soit vraiment adapté.
Ce que Pharo propose, c'est aussi ce que Nautilus
propose, c'est aussi ce qu'on appelle les Smart Suggestions.
Donc les Smart Suggestions, c'est un outil qui va savoir
et vous proposer des opérations basées sur la sélection courante.
Donc par exemple, là il peut me proposer de faire un
Extract method, ce n'est pas très intéressant dans ce
cas-là, ou un Inline method. Mais ça veut dire que si je
sélectionne par exemple l'affectation, je ne vais pas du
tout avoir les mêmes opérations à ma disposition.
Donc si je suis sur une classe, il va me demander de
browser les références, de renommer la classe.
Et vous voyez que, suivant l'endroit où est le curseur,
je n'ai pas les mêmes opérations.