1
00:00:01,250 --> 00:00:03,460
Dans cette vidéo,
j'aimerais vous montrer que Nautilus

2
00:00:03,870 --> 00:00:06,710
propose des refactorings. Donc
qu'est-ce que c'est qu'un refactoring?

3
00:00:07,050 --> 00:00:11,560
C'est une opération qui
va transformer du code en

4
00:00:11,727 --> 00:00:13,000
préservant son comportement.

5
00:00:13,320 --> 00:00:15,850
Il faut voir que,
historiquement, les refactorings ont

6
00:00:16,017 --> 00:00:18,700
été implémentés pour la
première fois dans l'ancêtre de

7
00:00:18,867 --> 00:00:21,840
Pharo, et après ont été dans
tous les langages comme Java.

8
00:00:22,170 --> 00:00:26,470
Donc dès 95, Smalltalk
avait un outil de refactoring et

9
00:00:26,637 --> 00:00:27,890
celui de Pharo est
inspiré de celui-là.

10
00:00:28,540 --> 00:00:31,070
Donc ouvrons Nautilus pour
regarder un petit peu les

11
00:00:31,237 --> 00:00:32,020
refactorings qui sont proposés.

12
00:00:33,320 --> 00:00:36,440
Ce qu'on va faire, on va
travailler sur notre classe.

13
00:00:38,000 --> 00:00:39,800
Donc vous avez des
refactorings à plusieurs niveaux.

14
00:00:39,967 --> 00:00:41,790
Il y a des refactorings
au niveau classe, au niveau

15
00:00:41,957 --> 00:00:45,330
méthode et au niveau code.
Donc au niveau classe, on a

16
00:00:48,710 --> 00:00:49,343
tous ces refactorings-là.

17
00:00:51,270 --> 00:00:53,120
On va pouvoir avoir des
refactorings au niveau des

18
00:00:53,287 --> 00:00:56,020
variables d'instance et au
niveau des variables de classe.

19
00:00:57,550 --> 00:01:00,580
Quand un refactoring est
très utile en fait, il a été mis

20
00:01:01,490 --> 00:01:05,320
au niveau le plus haut des
menus, de façon à ce que vous

21
00:01:05,487 --> 00:01:07,490
alliez plus vite, vous
n'avez pas besoin de faire classe,

22
00:01:07,960 --> 00:01:09,210
refactoring, Rename il est ici.

23
00:01:10,140 --> 00:01:14,690
De la même manière,
pour les méthodes, les

24
00:01:14,857 --> 00:01:17,310
refactorings on va avoir
toutes ces méthodes-là, avec

25
00:01:19,850 --> 00:01:22,470
renommage aussi, comme
c'est un refactoring qui est

26
00:01:22,637 --> 00:01:25,310
important à ce niveau-là.
Maintenant si je prends un

27
00:01:25,477 --> 00:01:28,750
autre morceau de code, ils
ne sont pas très compliqués

28
00:01:28,917 --> 00:01:33,820
dans cette classe, on va
avoir les refactorings suivants

29
00:01:35,350 --> 00:01:38,040
qui vont travailler au
niveau du code de la méthode.

30
00:01:41,300 --> 00:01:45,450
Si je renomme, si je fais un
Rename de la Class Counter,

31
00:01:45,617 --> 00:01:50,020
je vais l'appeler la Class
Counter 2, le système me dit ok.

32
00:01:50,187 --> 00:01:51,300
Je fais un Rename, très bien.

33
00:01:55,130 --> 00:01:56,710
Il me donne du retour, je
ne sais pas trop ce que c'est

34
00:01:56,877 --> 00:01:57,960
mais ce n'est pas grave, je l'ignore.

35
00:01:58,870 --> 00:02:00,750
Et là ce que je vais voir,
c'est que mes endroits où

36
00:02:04,510 --> 00:02:08,710
la Class Counter était invoquée,
maintenant j'ai bien Counter 2 à la place.

37
00:02:10,000 --> 00:02:14,780
Donc ça, c'est typiquement
un refactoring de renommage de

38
00:02:14,947 --> 00:02:15,580
 classe.

39
00:02:16,490 --> 00:02:18,830
Donc maintenant, si je veux
renommer, et c'est un très

40
00:02:19,000 --> 00:02:23,480
bon exemple, imaginons que je
veuille renommer la méthode incrémente.

41
00:02:24,450 --> 00:02:27,230
Je vais faire Rename, et comme
je suis en manque d'inspiration,

42
00:02:27,397 --> 00:02:28,520
je vais aussi l'appeler Increment2.

43
00:02:31,480 --> 00:02:33,670
Là ce que le système me
dit, il me dit: attention.

44
00:02:33,837 --> 00:02:35,550
Et là je fais attention.

45
00:02:36,350 --> 00:02:40,520
Attention, tu vas renommer

46
00:02:41,740 --> 00:02:44,630
plusieurs, il y a une
dizaine d'implémenteurs dans le

47
00:02:44,797 --> 00:02:48,750
système, tu vas tous les
renommer, est-ce que tu veux faire ça?

48
00:02:48,917 --> 00:02:50,600
Premièrement, je ne veux pas
le faire et deuxièmement je

49
00:02:50,767 --> 00:02:52,730
n'ai pas envie non plus de
sélectionner ou de désélectionner.

50
00:02:53,470 --> 00:02:56,580
Donc on pourrait le faire,
ça permet de montrer que le

51
00:02:56,747 --> 00:02:58,700
 programmeur est quand
même en charge, à la fin, de

52
00:02:58,867 --> 00:03:00,490
choisir, mais moi je
ne veux pas le faire.

53
00:03:01,000 --> 00:03:03,700
Par contre ce que je peux
faire, c'est dire: moi je suis

54
00:03:03,867 --> 00:03:06,630
en train de travailler
vraiment sur que le package mon

55
00:03:06,797 --> 00:03:09,450
Counter et modifier le reste
du système, je n'ai pas trop

56
00:03:09,617 --> 00:03:11,020
envie que ça se
fasse automatiquement.

57
00:03:11,310 --> 00:03:13,680
Donc ce que je vais faire, je
dis à Nautilus: moi j'aimerais

58
00:03:13,847 --> 00:03:17,280
que tu m'ouvres un browser
que sur mon package et que

59
00:03:17,447 --> 00:03:20,380
toutes les opérations fassent
référence qu'à cette sélection.

60
00:03:20,890 --> 00:03:23,770
Donc c'est ce que je vais
faire avec browse scoped.

61
00:03:26,530 --> 00:03:28,710
C'est ce que vous pouvez
obtenir aussi quand vous pressez

62
00:03:28,877 --> 00:03:30,180
le bouton Scoped,
c'est la même chose.

63
00:03:30,570 --> 00:03:32,940
C'est tellement intéressant
comme fonctionnalité qu'on l'a

64
00:03:33,107 --> 00:03:36,240
mise comme bouton. Donc la
différence entre ces 2 mondes,

65
00:03:36,407 --> 00:03:40,780
si vous regardez, c'est
qu’ici j'ai tous mes packages et

66
00:03:40,947 --> 00:03:41,890
là je n'ai qu'un seul package.

67
00:03:42,057 --> 00:03:45,310
Je pourrais en avoir plusieurs, je
n'ai qu'une sélection de ces packages.

68
00:03:45,477 --> 00:03:47,120
Et maintenant, ce que je
vais pouvoir faire, c'est que si

69
00:03:47,287 --> 00:03:52,200
je veux modifier
Increment, je vais lui dire: “Rename”

70
00:03:52,460 --> 00:03:57,180
en incremente 2,
et il va ne le faire que

71
00:03:57,500 --> 00:04:01,510
localement au package ou à la
sélection qui est dans le browser Scoped.

72
00:04:03,380 --> 00:04:05,590
Donc je fais OK, et
maintenant on va regarder les tests.

73
00:04:05,757 --> 00:04:08,150
Donc déjà mes tests fonctionnent
toujours, ils sont toujours verts.

74
00:04:08,480 --> 00:04:11,890
Et ce que je vois, c'est
que maintenant tous mes

75
00:04:12,057 --> 00:04:13,790
Increment ont été
renommés en Increment2.

76
00:04:16,800 --> 00:04:18,890
Donc là, ce qu'on a vu dans
cette vidéo, c'est que Pharo

77
00:04:19,057 --> 00:04:21,610
va vous permettre tout
un panel d'opérations, de

78
00:04:21,777 --> 00:04:25,080
sélections et de
manipulations de codes, avec en plus la

79
00:04:25,247 --> 00:04:27,960
notion de restrictions à
un sous-ensemble de packages

80
00:04:28,200 --> 00:04:30,630
pour contrôler où vont être
appliqués les changements.

81
00:04:31,110 --> 00:04:32,870
Donc ce que vous avez aussi
dans Pharo, vous avez aussi

82
00:04:33,037 --> 00:04:35,240
un outil qui va vous
permettre de faire de la réécriture

83
00:04:35,407 --> 00:04:38,060
de code automatique, je ne
vais pas m'étendre, ça si vous

84
00:04:38,227 --> 00:04:40,650
en avez vraiment besoin il
faut demander, il y a un outil

85
00:04:40,817 --> 00:04:42,310
spécifique pour
faire ce genre de choses.

86
00:04:43,160 --> 00:04:45,480
Maintenant, le dernier point
que je voulais vous montrer,

87
00:04:45,647 --> 00:04:50,410
c'est que souvent vous avez
des opérations qui vous sont

88
00:04:50,577 --> 00:04:51,210
proposées, qui sont générées.

89
00:04:51,470 --> 00:04:54,900
Vous allez les appliquer, le
système vous propose de les

90
00:04:55,067 --> 00:04:57,330
faire mais ce n'est pas dit que ça
fonctionne, que ça soit vraiment adapté.

91
00:04:57,890 --> 00:05:00,810
Ce que Pharo propose,
c'est aussi ce que Nautilus

92
00:05:01,000 --> 00:05:03,460
propose, c'est aussi ce qu'on
appelle les Smart Suggestions.

93
00:05:03,627 --> 00:05:08,090
Donc les Smart Suggestions,
c'est un outil qui va savoir

94
00:05:08,520 --> 00:05:12,530
et vous proposer des opérations
basées sur la sélection courante.

95
00:05:14,120 --> 00:05:18,590
Donc par exemple, là il
peut me proposer de faire un

96
00:05:18,757 --> 00:05:22,510
Extract method, ce n'est
pas très intéressant dans ce

97
00:05:22,677 --> 00:05:25,900
cas-là, ou un Inline method.
Mais ça veut dire que si je

98
00:05:26,067 --> 00:05:29,230
sélectionne par exemple
l'affectation, je ne vais pas du

99
00:05:29,397 --> 00:05:32,490
tout avoir les mêmes
opérations à ma disposition.

100
00:05:33,400 --> 00:05:36,110
Donc si je suis sur une
 classe, il va me demander de

101
00:05:36,277 --> 00:05:37,710
browser les références,
de renommer la classe.

102
00:05:37,877 --> 00:05:41,000
Et vous voyez que, suivant
l'endroit où est le curseur,

103
00:05:41,710 --> 00:05:43,000
je n'ai pas les mêmes opérations.

