このビデオでは Nautilus を使った
より先進的なコード分析を お見せします。
では Nautilus を開きましょう。 例として
単純なクラス NumberParser を見てみます。
センダー (Sender) と インプリメンター (Implementors)と呼ばれるものを
見てみましょう。
情報を得る時に センダーやインプリメンターを見る人がいたら
Pharo に熟達した人だとわかります。
では見てみましょう。
メソッドがあります。 このメソッドを呼んでいるものを
知りたい時 何をしたらいいでしょう？
Sender of を使います。
Senders of で何が得られるのでしょう？
この場合 1つだけ Sender of で出る
メソッドがあります。
readExponent です。 ExponentLetters を呼んでいます。
これは興味深い情報です。
さて、ここで想像してみましょう。 public プロトコルで
nextInteger を選んで センダー (Senders) してみます。
この潜在的なセンダーのリストが
得られます。
実際、nextInteger メッセージは そこら中で送られています。
NumberParser クラスで
self とあります。
self ということは
ここにあるメソッドのはずです。
XMLクラスでは
それはあまり明白ではありません。 呼ばれるのがこのメソッドなのかわかりません。
Pharo には型がないので
確実にはわかりません。
実際、システムは この名前のメッセージが送られたと
言っていて
これを確認するためには例えば
インプリメンター (implementors)が 知りたいと
システムに言うことができます。 このシステムでは
このメソッドが何個実装されているのか。
そのためには Implementors of を選びます。
Implementors of、と。 ほら
前回は1つしかメソッドがなかったので 呼ばれたメソッドを特定できましたが
今回は複数個あります。
この nextInteger メソッドは
NumberParser に定義されていますが XMLInteger にも定義されています。
それ以外にも定義されています。
ですから これらのメソッドは
メッセージが送られた時に
解決されて選ばれるメソッドです。
センダーとインプリメンターは
とても重要だとお判りでしょうか。 インプリメンターでは
あるメソッドを実装する システム中の全てのクラスを見ることができます。
センダーでは、あるメソッドへの 全ての呼び出しを見ることができます。
センダーは本当にとても重要です。
例題を見つけることができるからです。
どうやってメソッドが使われているかを 見ることができます。
ここでは引数のないメソッドを選びましたが
引数のあるメソッドを選択した場合には
例えば Number クラスの nextNumberBase: で
センダーをクリックすると
何が出るでしょう？
baseという引数があります。
これは単に
引数がそのまま引数として使われていますね。
しかしこのテストでは
NumberParser をストリーム上で生成して
nextNumberBase:メッセージを
10を引数として送っています。
こうやって
このAPIをどう使うべきかがわかります。
あまりにもよく使われるので キーボードショートカットになっています。
Nautilus は最初は マウスなしであらゆる操作ができるように
デザインされていました。
おわかりでしょうか、B はブラウズの意味です。
ブラウズセンダーができます。 N はセンダー (Senders) の N です。
ブラウズインプリメンターは Implementors の M です。
例えば 「nextNumber」だけを選択して
ブラウズ N とすると
nextNumber のセンダーが得られます。
同じように
インプリメンターを得たい場合には ブラウズ M
するとインプリメンターが得られます。
クラスについても同様に
NumberParserを使う 他のクラスを知りたい場合には
NumberParser
Analyze を選択すると
Class references があります。
このクラスを使う全てのメソッドが これで得られます。
見ての通り多くがテストです。
注目してください。 Integer クラスで
パーサーを使っています。
ここで
キーボードショートカットを覚えるコツを お教えします。
ブラウズ シフト N です。
N は大文字です。 n はセンダーと同様に
使っているメソッドを得るわけです。
ただし、クラスを使っているメソッドです。 クラスはメソッドよりも大きいので
大文字を使います。