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
同じ操作は提案されません。
