Dans cette vidéo, je voudrais vous montrer les analyses
un peu plus poussées qu'on peut faire sur du code avec Nautilus.
Donc ouvrons Nautilus, on va prendre par exemple une
classe simple, NumberParser.
Donc maintenant ce qu'on va regarder, c'est ce qu'on
appelle les Senders et les Implementor.
Souvent, on sait quand quelqu'un est fluide dans Pharo s'il
a compris comment utiliser les Senders et Implementors
pour trouver de l'information. Donc regardons: quand je
prends une méthode, j'aimerais savoir qui est-ce qui
appelle cette méthode, qu'est-ce que je vais faire?
Je vais utiliser Senders Of.
Donc Senders Of, qu'est-ce que ça va me donner?
Ça va me donner ici, ah bah tiens, il n'y a qu'une seule
méthode qui appelle Senders Of, cette méthode s'appelle
ReadExponent et il appelle ExponentLetters.
Donc c'est une information intéressante.
Maintenant imaginons que je vais dans le protocole
public, je prends NextInteger. Si je demande les Senders,
je vais obtenir cette
liste de Senders potentiels.
En fait, ce sont tous les endroits qui envoient le message NextInteger.
Donc là ce que je vois c'est que je suis dans la classe
NumberParser, et que je fais un appel à Self.
Donc j'utilise Self pour faire un appel donc ça sera
forcément la méthode que j'ai ici.
Maintenant, sur les packages ou sur la classe XML, ce n'est
pas dit parce que je ne sais pas forcément, vu que Pharo
est un langage non typé, je ne sais pas exactement à coup
sûr si c'est la méthode en question.
En fait, ce que le système me montre, ce sont qu'un
message de même nom est envoyé.
Donc pour vérifier ça, ce que je peux faire par exemple,
je peux me dire, ah mais moi ce que j'aimerais savoir c'est
quels sont les implémenteurs, donc combien de fois cette
méthode est implémentée dans le système.
Donc pour ça, ce que je vais faire, je vais faire Implementors Of.
Donc Implementors Of, ah bah tiens, alors que tout à l'heure
dans l'autre cas, je n'avais qu'une seule méthode donc c'était
forcément celle-là qui était appelée, là, j'en ai plusieurs.
Donc cette méthode, la méthode NextInteger elle est
définie sur NumberParser, mais elle est aussi définie sur XMLInteger.
Donc là, XMLInteger est défini même sur deux classes
différentes, donc ce que je vois c'est que ces
méthodes-là, ces appels-là, ce sont des appels d'envoi de
messages et qu'ils vont sûrement se résoudre sur ces méthodes-là.
Donc ce que vous voyez, c'est que Sender et Implementor c'est
vraiment important. Implementor ça va vous permettre de
voir toutes les classes du système qui implémentent une
méthode, et Sender ça va vous montrer tous les appels à une méthode.
Alors les Senders, c'est vraiment très important parce
que ça va vous permettre de regarder des exemples, de
dire, ah oui, tiens, cette méthode, mais comment elle est invoquée?
Donc là, je vous ai pris une méthode qui n'avait pas d'argument
mais si j'avais pris une méthode qui avait un argument,
par exemple si je prends Number, NextNumberBase et que je
fais Sender, qu'est-ce que ça va me
montrer? J'ai un argument et je vois, ah oui
tiens c'est la base.
Donc là, bon, il se trouve que ce n'est pas un argument,
c'est juste un appel qui passe un argument mais voilà,
par exemple dans ce test-là, ce que je vois, je vois que
j'instancie NumberParser sur une Stream,
et qu'après je vais lui envoyer le message NextNumberBase
et que je dois passer 10.
Donc ça me permet de comprendre, ah oui c'est comme ça
que je dois utiliser l'API.
Alors c'est tellement utilisé qu'en fait vous avez des raccourcis clavier.
Alors Nautilus a été conçu à la base pour qu'on puisse
complètement faire toutes ces opérations sans toucher à la souris.
Donc là, ce qu'il faut voir c'est que B ça veut dire browse.
Donc on va faire, Browse Sender, le N c'est pour le N de Sender.
Browse Implementor, le M c'est pour Implementor.
Donc si je sélectionne juste "NextNumber" par exemple,
et que je fais Browse N, je vais obtenir
les Senders de NextNumber.
De la même manière si je sélectionne, voilà, je les obtiens.
Maintenant, si je veux obtenir les Implementors Browse M,
j'obtiens les Implementors.
Donc de la même manière sur les classes, j'aimerais
savoir quelles sont les autres classes du système qui
utilisent NumberParser. Pour ce faire, ce que je vais
faire, je vais donc Analyze et j'ai Class
references. Donc Class references, j'obtiens toutes les
classes. Donc on va regarder, j'obtiens toutes les méthodes qui utilisent.
Donc là, je vois que c'est essentiellement des tests.
Ah tiens dans la ClassInteger, je fais appel
au Parser.
Alors là, l'astuce pour comprendre, se rappeler
du raccourci clavier, c'est de se dire que là c'est
Browse shift N, c'est
une lettre capitale parce qu'on pense finalement que c'est
comme invoquer une méthode, à part que là on veut
invoquer une classe, et qu'une classe c'est plus gros qu'une
méthode donc on a une capitale.