このビデオでは Nautilus が提供する
リファクタリングをお見せします。 リファクタリングとは何でしょう？
リファクタリングはソースコードに対して その振る舞いを保ちながら
変形する操作です。
リファクタリングは歴史的には
Pharo の先祖で最初に実装された ということを覚えておいてください。
そしてその後になって Java のような 言語でも実装されるようになりました。
95年には既に Smalltalk には リファクタリングツールがあり
Pharo のリファクタリングツールは そこからインスパイアされたものです。
では、Nautilus を開いて
どんな種類のリファクタリングが 提供されているかを見てみましょう。
このクラスで試してみます。
Refactoring には幾つかのレベルがあります。
クラスレベルのリファクタリングがあり
メソッドレベルやコードレベルがあり
色々なレベルのリファクタリングがあります。
インスタンス変数レベルの リファクタリングがあり
クラス変数レベルのものもあります。
リファクタリングを適用できる時には
メニューの一番上のレベルに現れて
素早く行うことができます。 クラスを選んで
refactoring、rename、ここにあります。
同じように、メソッドの
リファクタリングでは ここのメソッドに対して
Renameがあります。このレベルでは
重要なリファクタリングです。 さて、ここでコードを選択すると
このクラスではさほど複雑ではありませんが
以下のようなリファクタリングが
メソッドコードレベルで実行できます。
rename をすると、Counter クラスの 名前を変えます。
Counter2 クラスとします。 システムは OK と言います。
これで Rename できます。はい。
フィードバックが得られます。 意味がよくわかりませんが
いずれにせよ無視します。
そしてここで、Counter クラスが
参照されていた箇所で 今は Counter2 となっています。
これが典型的な
クラス名の rename のリファクタリングです。
さて、それでは、名前を付け替えたい
例として、increment メソッドの 名前を変えたいとします。
Rename をします。 あまりインスピレーションが湧いてこないので
とりあえず increment2 としましょう。
ここでシステムが警告してきます。 「気を付けてください」
気を付けます。
「気を付けてください。 あなたは今、沢山の名前を変えようとしています。
（システム中に increment の実装が 10個ぐらいあります）
それらの名前を変えようとしているわけですが 本当にそれでいいですか？」
まず第一に、そんなことはしたくありません。 第二に、対象を選択したり
選択解除したりしたくもありません。
そうすることもできます。
最終的にはプログラマが選択する 責任者です。
私はそれをしたくはありません。
そうではなくて、私が言いたいのは
「私が作業しているのは MyCounter パッケージであって
システム中のそれ以外の部分を
自動的に変更して欲しくはない。」 ということです。
なので、Nautilus に
「ブラウザで私のパッケージだけを開いて
全ての操作はその部分だけにするように」 と言います。
そこで Browse scoped を使います。
同じことが
Scoped ボタンでもできます。
とても有用な機能なのでボタンになっています。
これら 2 つの世界の違いは
見た目では、こちらでは全てのパッケージがあり
こちらではパッケージが 1 つだけです。
複数個を選ぶこともできますが ここでは 1 つだけ選んでいます。
さあここで increment を変更します。
Rename で
increment2 に変更すると そのパッケージの中だけ、つまり
スコープ付きブラウザで選ばれたパッケージ内のみで 変更されます。
OK をクリックして、ここでテストを見てみます。
テストはまだ動いています。 全てグリーンです。
そして、increment とあったものが
increment2 に変えられています。
このビデオでは
Pharo が色々な種類の操作を提供すること
選択やコードの操作や
パッケージにスコープを制限して
変更が適用される範囲を コントロールできることです。
Pharo では
コードを自動的に書き換えるツールがありますが
それを掘り下げることはしません。 本当にそれが必要であれば
探してみてください。その種の操作専用の
ツールがあります。
最後にお見せしたいのは
操作を提案されることがよくあります。
それの提案は生成されたものです。
システムは提案する操作は それが正しい操作だということではありませんが
その提案は状況に適応されたものです。
Pharo が提案すること Nautilus が提案することは
スマートサジェスチョンと呼ばれるものです。
スマートサジェスチョンは 現在の選択に応じて
操作を提案するツールです。
例えば、ここではメソッドの抽出を 提案してきます。
この場合ではメソッドの抽出や インラインメソッドは
さほど有効ではありません。 しかしブラウザ上の選択を
例えば allocation にすると
同じ操作は提案されません。
クラスを選択していると
参照の一覧やクラスの名前変更を提案します。
そして選択した場所が違えば
同じ操作は提案されません。