WEBVTT

00:00:00.360 --> 00:00:01.800 align:middle
こんにちは。この講義では

00:00:01.960 --> 00:00:06.440 align:middle
クラスメソッドを本当に理解するための
時間を設けます。

00:00:06.600 --> 00:00:08.960 align:middle
既にカウンターの演習をしましたが

00:00:09.120 --> 00:00:12.520 align:middle
クラスメソッドを使ったはずです。
上手くいきましたね。

00:00:12.680 --> 00:00:16.440 align:middle
今回はじっくり見ていって
一から十まで理解してください。

00:00:17.400 --> 00:00:20.800 align:middle
この講義では、Pharo では
クラスメソッドとインスタンスメソッドには

00:00:20.960 --> 00:00:24.240 align:middle
メソッド探索のレベルでは違いはない
ということを学びます。

00:00:24.400 --> 00:00:27.320 align:middle
探索アルゴリズムは 1 つしかありません。

00:00:27.480 --> 00:00:32.400 align:middle
仮想機械（VM）で定義されています。

00:00:32.560 --> 00:00:37.240 align:middle
そしてクラスメソッドは一見すると
静的（static）メソッドに似ていますが

00:00:37.400 --> 00:00:40.320 align:middle
実際には違うということが解るでしょう。

00:00:40.480 --> 00:00:43.200 align:middle
実際、クラスメソッドは動的結合されます。

00:00:43.360 --> 00:00:45.600 align:middle
クラスメソッドは実行時に探索されます。

00:00:45.760 --> 00:00:50.080 align:middle
一方、Java では静的メソッドは
動的に探索されません。

00:00:50.240 --> 00:00:51.720 align:middle
では、どうなっているのか見てみましょう。

00:00:51.880 --> 00:00:54.680 align:middle
実際、今までに探索アルゴリズムは

00:00:54.840 --> 00:00:59.600 align:middle
レシーバーのクラスから開始する
ということは、わかっていますね。

00:00:59.760 --> 00:01:02.600 align:middle
もし該当するメソッドがあれば

00:01:02.760 --> 00:01:06.000 align:middle
それが返され、なければ
スーパークラスを辿っていきます。

00:01:06.160 --> 00:01:08.560 align:middle
図で見てみると

00:01:08.720 --> 00:01:11.720 align:middle
Counter クラスの例では

00:01:11.880 --> 00:01:14.880 align:middle
increment メッセージを送ると
何が起こるでしょう？

00:01:15.040 --> 00:01:20.160 align:middle
まずはCounter クラスを見て

00:01:20.320 --> 00:01:22.040 align:middle
increment がここで定義されてるか
見てみます。

00:01:22.200 --> 00:01:26.120 align:middle
階層のより上位で定義されたメソッドなら

00:01:26.280 --> 00:01:28.120 align:middle
上位へ辿っていきます。

00:01:28.280 --> 00:01:31.760 align:middle
このメカニズムが 実際に Pharo で
使われているもので、他には探索はありません。

00:01:31.920 --> 00:01:35.280 align:middle
インスタンス側でもクラス側でも
これが使われています。

00:01:36.680 --> 00:01:41.640 align:middle
Counter クラスの演習では
withValue: メッセージを

00:01:41.840 --> 00:01:44.320 align:middle
Counter クラスに送って

00:01:44.480 --> 00:01:46.480 align:middle
インスタンスを作りました。
何が起こっているのでしょう？

00:01:46.640 --> 00:01:50.960 align:middle
Counter クラスは Counter class
と呼ばれるクラスのインスタンスです。

00:01:51.120 --> 00:01:55.400 align:middle
そして探索します。
今までと同じ方法で探索します。

00:01:55.560 --> 00:01:58.600 align:middle
レシーバーのクラスを見ます。
レシーバーは Counter なので

00:01:58.760 --> 00:02:02.920 align:middle
Counter class を見ます。
するとwithValue: メソッドが見つかります。

00:02:03.080 --> 00:02:05.960 align:middle
それをレシーバーに適用して

00:02:06.120 --> 00:02:08.680 align:middle
新しいインスタンスを返します。

00:02:08.840 --> 00:02:14.760 align:middle
つまり、Counter クラスのインスタンスに
メッセージを送るのと

00:02:14.920 --> 00:02:16.960 align:middle
全く同じプロセスを辿ります。

00:02:18.080 --> 00:02:22.560 align:middle
では、Pharo ではクラスとは何なのでしょう？
クラスはインスタンスです。

00:02:22.760 --> 00:02:26.480 align:middle
クラスは他と同じようなオブジェクトです。
Pharo にはオブジェクトしかありません。

00:02:26.640 --> 00:02:30.040 align:middle
クラスはメタクラスと呼ばれる
別のクラスのインスタンスです。

00:02:30.200 --> 00:02:34.000 align:middle
単に区別すれば良いだけです。
メタクラスは単にクラスです。

00:02:34.160 --> 00:02:36.080 align:middle
そのインスタンスがクラスというだけで。

00:02:36.880 --> 00:02:40.680 align:middle
違いは、インスタンスが
末端のインスタンスなのかクラスなのかです。

00:02:40.840 --> 00:02:44.680 align:middle
次にのポイントは
Counter クラスは

00:02:44.840 --> 00:02:49.040 align:middle
Counter class クラスの
唯一のインスタンスです。

00:02:50.160 --> 00:02:54.640 align:middle
この Counter class は自動的に作られます。

00:02:54.800 --> 00:02:58.040 align:middle
Counter クラスを定義した時に
システムが自動的に

00:02:58.200 --> 00:03:01.960 align:middle
Counter class クラスを作ります。

00:03:02.120 --> 00:03:06.040 align:middle
クラスを 1 つ作ったつもりでしょうが
実際には 2 つ作っていたのです。

00:03:06.200 --> 00:03:09.640 align:middle
Pharo では XXX クラスのクラスは

00:03:09.800 --> 00:03:13.680 align:middle
XXX class と呼ばれることを
覚えておいてください。

00:03:13.840 --> 00:03:18.120 align:middle
ここに Counter がありますが
Counter のクラスは

00:03:18.280 --> 00:03:22.080 align:middle
Counter class です。
系統的ですね。

00:03:23.600 --> 00:03:26.680 align:middle
実際のところ

00:03:26.840 --> 00:03:30.920 align:middle
今まで説明なしでやっていたのですが

00:03:31.080 --> 00:03:33.800 align:middle
ブラウザで Counter クラスを見ている時は

00:03:33.960 --> 00:03:36.560 align:middle
ブラウザ上のコードは Counter classの

00:03:36.720 --> 00:03:40.240 align:middle
インスタンスで実行されます。

00:03:40.400 --> 00:03:42.000 align:middle
つまり increment は

00:03:42.160 --> 00:03:45.840 align:middle
Counter のインスタンス上で実行されますが

00:03:47.440 --> 00:03:52.280 align:middle
クラスボタンを押して
クラスメソッドを定義する時は

00:03:52.440 --> 00:03:56.800 align:middle
この Counter class のインスタンス上で
実行されるコードを表示します。

00:03:58.720 --> 00:04:03.000 align:middle
実際、見てみると
increment メッセージを

00:04:03.160 --> 00:04:07.680 align:middle
Counter のインスタンスに送ると
Counter クラスを見ます。

00:04:07.840 --> 00:04:10.240 align:middle
見てください。
このメソッドが実行されます。

00:04:10.400 --> 00:04:15.360 align:middle
Counter クラスに
withValue: メッセージを送ると

00:04:15.520 --> 00:04:18.800 align:middle
どこを見るでしょう？そのクラスです。
このリンクを辿って

00:04:18.960 --> 00:04:21.040 align:middle
メソッドがここにあります。

00:04:22.320 --> 00:04:24.000 align:middle
まとめると

00:04:24.240 --> 00:04:26.320 align:middle
Pharo では、クラスはオブジェクトです。

00:04:26.480 --> 00:04:27.960 align:middle
クラスはメッセージを
受け取ることができます。

00:04:28.120 --> 00:04:30.680 align:middle
構文を勉強した時に

00:04:30.840 --> 00:04:32.720 align:middle
Date today について説明しました。

00:04:32.880 --> 00:04:37.680 align:middle
どういうことかというと
それはクラスへ送るメッセージです。

00:04:37.840 --> 00:04:40.040 align:middle
構文的に異なる要素はありません。

00:04:40.200 --> 00:04:44.040 align:middle
インスタンスへのメッセージ送信と
構文は全く同じです。

00:04:44.200 --> 00:04:48.640 align:middle
さらに、この講義で、メソッド探索は
1 種類しかないことを説明しました。

00:04:48.800 --> 00:04:51.760 align:middle
クラスメソッドは
インスタンスメソッドと同様に

00:04:51.920 --> 00:04:54.520 align:middle
動的に探索されます。
どこを探索するかというと

00:04:54.680 --> 00:04:56.560 align:middle
レシーバーのクラスです。

00:04:56.720 --> 00:04:59.520 align:middle
インスタンスの場合には
そのクラスを探します。

00:04:59.680 --> 00:05:01.800 align:middle
クラスインスタンスの場合には
例えば Counter クラスの場合には

00:05:01.960 --> 00:05:05.880 align:middle
メタクラスを探します。
Counter class と呼ばれるクラスです。

00:05:06.040 --> 00:05:10.520 align:middle
つまりクラスは、メタクラスという
別のクラスのインスタンスです。

00:05:10.680 --> 00:05:13.560 align:middle
そして同じメソッド探索が行われます。

00:05:13.720 --> 00:05:17.480 align:middle
これについては最終週の講義

00:05:17.640 --> 00:05:20.640 align:middle
Understanding Metaclasses で
またやります。

00:05:20.800 --> 00:05:24.040 align:middle
Pharo の蓋を開けてみて

00:05:24.200 --> 00:05:27.080 align:middle
どうやって動いているのか
その完全に統一されたやり方を説明します。

