﻿1
00:00:00,760 --> 00:00:04,120
こんにちは。このセッションでは
クラスメソッドについてお話します。

2
00:00:05,320 --> 00:00:07,960
Pharo では、全てのものはオブジェクトで

3
00:00:08,120 --> 00:00:10,400
オブジェクトにメッセージを送ることができます。

4
00:00:11,120 --> 00:00:14,320
つまり、これら2つの情報を基にすれば

5
00:00:14,480 --> 00:00:16,160
クラスもオブジェクトであり

6
00:00:16,320 --> 00:00:19,880
したがってクラスに情報
つまりメッセージを送ることができます。

7
00:00:21,120 --> 00:00:22,800
例題を2つ示します。

8
00:00:22,960 --> 00:00:27,480
Time now では、Time クラスという
オブジェクトに now メッセージを送ります。

9
00:00:27,640 --> 00:00:29,800
そして今の時刻が返ってきます。

10
00:00:31,160 --> 00:00:32,680
つまり、now メッセージを

11
00:00:33,680 --> 00:00:37,320
クラスである Time オブジェクトに送ります。

12
00:00:38,360 --> 00:00:40,320
すると今の時刻が送り返されます。

13
00:00:40,480 --> 00:00:45,440
同じように、クラスである Date オブジェクトに
todayメッセージを送ると

14
00:00:45,600 --> 00:00:47,400
日付が返ってきます。

15
00:00:47,560 --> 00:00:49,480
もう3つ例があります。

16
00:00:50,200 --> 00:00:54,440
FileLocator クラスに
workingDirectory メッセージを送ると

17
00:00:54,600 --> 00:00:58,040
現在のパスが返ってきます。

18
00:00:58,200 --> 00:01:02,520
つまり実行されているファイルのディレクトリパスです。

19
00:01:03,720 --> 00:01:05,080
2つ目の例は

20
00:01:05,240 --> 00:01:08,760
ZnEasy オブジェクトに
getPng: メッセージを送ります。


21
00:01:08,920 --> 00:01:13,000
引数として png ファイルの URL を付けて。

22
00:01:13,160 --> 00:01:17,160
すると、ダウンロードされた png ファイルを
返します。

23
00:01:18,600 --> 00:01:19,920
3つ目の例は

24
00:01:20,080 --> 00:01:24,000
これまたクラスである ZnServer に
startDefaultOn: メッセージを

25
00:01:24,160 --> 00:01:25,800
ポート番号を引数にして送ります。

26
00:01:27,160 --> 00:01:30,280
これは HTTP サーバを立ち上げます。

27
00:01:31,480 --> 00:01:35,360
これら3つのケースでは
1つのクラスに1つのメッセージを送ります。

28
00:01:36,320 --> 00:01:40,200
どうやってクラスメソッドを実装するのでしょう？

29
00:01:41,000 --> 00:01:42,560
クラスを選択して

30
00:01:43,960 --> 00:01:47,880
class ボタンを押すことで
インスタンス側ではなくクラス側に

31
00:01:48,040 --> 00:01:50,960
メソッドを実装したいということを示します。

32
00:01:51,120 --> 00:01:53,920
あとはいつも通りにメソッドを実装します。

33
00:01:54,800 --> 00:01:58,880
つまり today メソッドは
Date クラスの

34
00:01:59,040 --> 00:02:00,880
クラス側に実装されています。

35
00:02:03,440 --> 00:02:07,080
クラス側のメソッドで
ありがちな間違いというものがあります。

36
00:02:07,240 --> 00:02:12,760
ここでは withValue: メッセージを

37
00:02:12,920 --> 00:02:14,920
Counter クラスに送ることで

38
00:02:15,080 --> 00:02:19,040
引数の値がセットされた
新しいカウンターを得たいのです。

39
00:02:19,200 --> 00:02:20,800
つまり

40
00:02:22,520 --> 00:02:26,840
Counter withValue: 10 は
値が10で始まるカウンターを返します。

41
00:02:28,280 --> 00:02:32,560
もしこの表現式を評価したら
Counter という値が得られます。

42
00:02:32,720 --> 00:02:34,240
新しいカウンターではなく。

43
00:02:34,400 --> 00:02:38,240
つまり、このクラスのインスタンスではなく
そのクラス自身が得られます。

44
00:02:38,400 --> 00:02:41,320
なぜこんな間違いが起こるのでしょう？
何が問題なのでしょう？

45
00:02:41,480 --> 00:02:46,320
問題は、メソッドはデフォルトでは
self を返すということです。

46
00:02:47,280 --> 00:02:51,560
つまり、もし返り値を明示しなければ
メソッドは self を返します。

47
00:02:51,720 --> 00:02:56,160
したがって、この上のほうのコードは
下のほうのコードと等価です。

48
00:02:56,320 --> 00:02:59,320
この場合、self は Counter クラスです。

49
00:03:00,640 --> 00:03:05,640
したがってメソッドはそのクラス自身を返します。
今まさに作ったばかりのインスタンスではなく。

50
00:03:05,800 --> 00:03:07,640
この問題を直すには

51
00:03:07,800 --> 00:03:11,680
単にキャレット（ ^ ）を

52
00:03:11,840 --> 00:03:13,320
self new の前に付けるだけです。

53
00:03:14,240 --> 00:03:16,880
まとめると
クラスはオブジェクトです。

54
00:03:17,040 --> 00:03:21,560
あらゆるオブジェクトにメッセージを送ることができるので
あらゆるクラスにもメッセージを投げることができます。

55
00:03:21,720 --> 00:03:24,360
それらのメッセージに対応するメソッドを実装するには

56
00:03:24,520 --> 00:03:29,000
クラスを選択して
class ボタンを押す必要があります。

57
00:03:30,000 --> 00:03:33,160
大部分のクラスメソッドは
新しいインスタンスを作りますが

58
00:03:33,320 --> 00:03:36,000
それだけでなく、他のこともします。

59
00:03:36,160 --> 00:03:40,480
クラスメソッドの他の利用法が
Pharo の中にたくさん見つかります。

60
00:03:40,640 --> 00:03:44,800
クラスメソッドは他のメソッドと同じで

61
00:03:44,960 --> 00:03:46,800
特別なルールはありません。

62
00:03:46,960 --> 00:03:49,960
メソッド探索は全く同じ方法で行われます。

63
00:03:50,120 --> 00:03:52,160
次週にそれを学びます。