1 00:00:01,250 --> 00:00:03,460 このビデオでは Nautilus が提供する 2 00:00:03,870 --> 00:00:06,710 リファクタリングをお見せします。 リファクタリングとは何でしょう? 3 00:00:07,050 --> 00:00:11,560 リファクタリングはソースコードに対して その振る舞いを保ちながら 4 00:00:11,727 --> 00:00:13,000 変形する操作です。 5 00:00:13,320 --> 00:00:15,850 リファクタリングは歴史的には 6 00:00:16,017 --> 00:00:18,700 Pharo の先祖で最初に実装された ということを覚えておいてください。 7 00:00:18,867 --> 00:00:21,840 そしてその後になって Java のような 言語でも実装されるようになりました。 8 00:00:22,170 --> 00:00:26,470 95年には既に Smalltalk には リファクタリングツールがあり 9 00:00:26,637 --> 00:00:27,890 Pharo のリファクタリングツールは そこからインスパイアされたものです。 10 00:00:28,540 --> 00:00:31,070 では、Nautilus を開いて 11 00:00:31,237 --> 00:00:32,020 どんな種類のリファクタリングが 提供されているかを見てみましょう。 12 00:00:33,320 --> 00:00:36,440 このクラスで試してみます。 13 00:00:38,000 --> 00:00:39,800 Refactoring には幾つかのレベルがあります。 14 00:00:39,967 --> 00:00:41,790 クラスレベルのリファクタリングがあり 15 00:00:41,957 --> 00:00:45,330 メソッドレベルやコードレベルがあり 16 00:00:48,710 --> 00:00:49,343 色々なレベルのリファクタリングがあります。 17 00:00:51,270 --> 00:00:53,120 インスタンス変数レベルの リファクタリングがあり 18 00:00:53,287 --> 00:00:56,020 クラス変数レベルのものもあります。 19 00:00:57,550 --> 00:01:00,580 リファクタリングを適用できる時には 20 00:01:01,490 --> 00:01:05,320 メニューの一番上のレベルに現れて 21 00:01:05,487 --> 00:01:07,490 素早く行うことができます。 クラスを選んで 22 00:01:07,960 --> 00:01:09,210 refactoring、rename、ここにあります。 23 00:01:10,140 --> 00:01:14,690 同じように、メソッドの 24 00:01:14,857 --> 00:01:17,310 リファクタリングでは ここのメソッドに対して 25 00:01:19,850 --> 00:01:22,470 Renameがあります。このレベルでは 26 00:01:22,637 --> 00:01:25,310 重要なリファクタリングです。 さて、ここでコードを選択すると 27 00:01:25,477 --> 00:01:28,750 このクラスではさほど複雑ではありませんが 28 00:01:28,917 --> 00:01:33,820 以下のようなリファクタリングが 29 00:01:35,350 --> 00:01:38,040 メソッドコードレベルで実行できます。 30 00:01:41,300 --> 00:01:45,450 rename をすると、Counter クラスの 名前を変えます。 31 00:01:45,617 --> 00:01:50,020 Counter2 クラスとします。 システムは OK と言います。 32 00:01:50,187 --> 00:01:51,300 これで Rename できます。はい。 33 00:01:55,130 --> 00:01:56,710 フィードバックが得られます。 意味がよくわかりませんが 34 00:01:56,877 --> 00:01:57,960 いずれにせよ無視します。 35 00:01:58,870 --> 00:02:00,750 そしてここで、Counter クラスが 36 00:02:04,510 --> 00:02:08,710 参照されていた箇所で 今は Counter2 となっています。 37 00:02:10,000 --> 00:02:14,780 これが典型的な 38 00:02:14,947 --> 00:02:15,580 クラス名の rename のリファクタリングです。 39 00:02:16,490 --> 00:02:18,830 さて、それでは、名前を付け替えたい 40 00:02:19,000 --> 00:02:23,480 例として、increment メソッドの 名前を変えたいとします。 41 00:02:24,450 --> 00:02:27,230 Rename をします。 あまりインスピレーションが湧いてこないので 42 00:02:27,397 --> 00:02:28,520 とりあえず increment2 としましょう。 43 00:02:31,480 --> 00:02:33,670 ここでシステムが警告してきます。 「気を付けてください」 44 00:02:33,837 --> 00:02:35,550 気を付けます。 45 00:02:36,350 --> 00:02:40,520 「気を付けてください。 あなたは今、沢山の名前を変えようとしています。 46 00:02:41,740 --> 00:02:44,630 (システム中に increment の実装が 10個ぐらいあります) 47 00:02:44,797 --> 00:02:48,750 それらの名前を変えようとしているわけですが 本当にそれでいいですか?」 48 00:02:48,917 --> 00:02:50,600 まず第一に、そんなことはしたくありません。 第二に、対象を選択したり 49 00:02:50,767 --> 00:02:52,730 選択解除したりしたくもありません。 50 00:02:53,470 --> 00:02:56,580 そうすることもできます。 51 00:02:56,747 --> 00:02:58,700 最終的にはプログラマが選択する 責任者です。 52 00:02:58,867 --> 00:03:00,490 私はそれをしたくはありません。 53 00:03:01,000 --> 00:03:03,700 そうではなくて、私が言いたいのは 54 00:03:03,867 --> 00:03:06,630 「私が作業しているのは MyCounter パッケージであって 55 00:03:06,797 --> 00:03:09,450 システム中のそれ以外の部分を 56 00:03:09,617 --> 00:03:11,020 自動的に変更して欲しくはない。」 ということです。 57 00:03:11,310 --> 00:03:13,680 なので、Nautilus に 58 00:03:13,847 --> 00:03:17,280 「ブラウザで私のパッケージだけを開いて 59 00:03:17,447 --> 00:03:20,380 全ての操作はその部分だけにするように」 と言います。 60 00:03:20,890 --> 00:03:23,770 そこで Browse scoped を使います。 61 00:03:26,530 --> 00:03:28,710 同じことが 62 00:03:28,877 --> 00:03:30,180 Scoped ボタンでもできます。 63 00:03:30,570 --> 00:03:32,940 とても有用な機能なのでボタンになっています。 64 00:03:33,107 --> 00:03:36,240 これら 2 つの世界の違いは 65 00:03:36,407 --> 00:03:40,780 見た目では、こちらでは全てのパッケージがあり 66 00:03:40,947 --> 00:03:41,890 こちらではパッケージが 1 つだけです。 67 00:03:42,057 --> 00:03:45,310 複数個を選ぶこともできますが ここでは 1 つだけ選んでいます。 68 00:03:45,477 --> 00:03:47,120 さあここで increment を変更します。 69 00:03:47,287 --> 00:03:52,200 Rename で 70 00:03:52,460 --> 00:03:57,180 increment2 に変更すると そのパッケージの中だけ、つまり 71 00:03:57,500 --> 00:04:01,510 スコープ付きブラウザで選ばれたパッケージ内のみで 変更されます。 72 00:04:03,380 --> 00:04:05,590 OK をクリックして、ここでテストを見てみます。 73 00:04:05,757 --> 00:04:08,150 テストはまだ動いています。 全てグリーンです。 74 00:04:08,480 --> 00:04:11,890 そして、increment とあったものが 75 00:04:12,057 --> 00:04:13,790 increment2 に変えられています。 76 00:04:16,800 --> 00:04:18,890 このビデオでは 77 00:04:19,057 --> 00:04:21,610 Pharo が色々な種類の操作を提供すること 78 00:04:21,777 --> 00:04:25,080 選択やコードの操作や 79 00:04:25,247 --> 00:04:27,960 パッケージにスコープを制限して 80 00:04:28,200 --> 00:04:30,630 変更が適用される範囲を コントロールできることです。 81 00:04:31,110 --> 00:04:32,870 Pharo では 82 00:04:33,037 --> 00:04:35,240 コードを自動的に書き換えるツールがありますが 83 00:04:35,407 --> 00:04:38,060 それを掘り下げることはしません。 本当にそれが必要であれば 84 00:04:38,227 --> 00:04:40,650 探してみてください。その種の操作専用の 85 00:04:40,817 --> 00:04:42,310 ツールがあります。 86 00:04:43,160 --> 00:04:45,480 最後にお見せしたいのは 87 00:04:45,647 --> 00:04:50,410 操作を提案されることがよくあります。 88 00:04:50,577 --> 00:04:51,210 それの提案は生成されたものです。 89 00:04:51,470 --> 00:04:54,900 システムは提案する操作は それが正しい操作だということではありませんが 90 00:04:55,067 --> 00:04:57,330 その提案は状況に適応されたものです。 91 00:04:57,890 --> 00:05:00,810 Pharo が提案すること Nautilus が提案することは 92 00:05:01,000 --> 00:05:03,460 スマートサジェスチョンと呼ばれるものです。 93 00:05:03,627 --> 00:05:08,090 スマートサジェスチョンは 現在の選択に応じて 94 00:05:08,520 --> 00:05:12,530 操作を提案するツールです。 95 00:05:14,120 --> 00:05:18,590 例えば、ここではメソッドの抽出を 提案してきます。 96 00:05:18,757 --> 00:05:22,510 この場合ではメソッドの抽出や インラインメソッドは 97 00:05:22,677 --> 00:05:25,900 さほど有効ではありません。 しかしブラウザ上の選択を 98 00:05:26,067 --> 00:05:29,230 例えば allocation にすると 99 00:05:29,397 --> 00:05:32,490 同じ操作は提案されません。 100 00:05:33,400 --> 00:05:36,110 クラスを選択していると 101 00:05:36,277 --> 00:05:37,710 参照の一覧やクラスの名前変更を提案します。 102 00:05:37,877 --> 00:05:41,000 そして選択した場所が違えば 103 00:05:41,710 --> 00:05:43,000 同じ操作は提案されません。