WEBVTT

00:00:00.520 --> 00:00:05.760 align:middle
こんにちは。継承とメソッド探索の
第 4 講へようこそ。

00:00:06.360 --> 00:00:11.360 align:middle
アルゴリズムがメソッドを見つけられなかった
場合に何が起こるのかを学びます。

00:00:11.800 --> 00:00:13.120 align:middle
この講義で

00:00:14.360 --> 00:00:18.440 align:middle
メソッドが見つからず

00:00:18.920 --> 00:00:23.000 align:middle
メッセージを理解できなかった
という事実を扱う処理を

00:00:23.160 --> 00:00:24.920 align:middle
クラスのコードで追加する方法が
わかるようになります。

00:00:25.600 --> 00:00:28.680 align:middle
メッセージ送信を簡単に復習しましょう。

00:00:29.520 --> 00:00:33.400 align:middle
area メッセージが ColoredRectangle に
送られます。

00:00:33.760 --> 00:00:38.800 align:middle
まず、アルゴリズムは
メッセージにマッチするメソッドを探します。

00:00:39.160 --> 00:00:43.360 align:middle
レシーバーのクラスからメソッドを探し始めます

00:00:43.800 --> 00:00:47.400 align:middle
area が ColoredRectangle で見つかったら
それを実行します。

00:00:47.720 --> 00:00:51.760 align:middle
しかし area が見つからなければ
アルゴリズムはスーパークラスを探します。

00:00:52.120 --> 00:00:54.520 align:middle
Rectangle で area が見つかります。

00:00:55.640 --> 00:00:58.680 align:middle
そのメソッドが
レシーバーの上で実行されます。

00:01:00.680 --> 00:01:04.120 align:middle
area メソッドが全く存在していない場合には
何が起こるでしょうか？

00:01:04.440 --> 00:01:07.120 align:middle
探索が失敗したらどうなるのでしょうか？

00:01:08.040 --> 00:01:13.160 align:middle
ここに例題があります。 coucou: メッセージが
オブジェクト node 1 に送られます。

00:01:13.800 --> 00:01:16.640 align:middle
coucou: は階層の中にありません。

00:01:16.960 --> 00:01:20.280 align:middle
coucou: メッセージが node 1 に送られます。

00:01:20.600 --> 00:01:24.360 align:middle
アルゴリズムは Node で coucou: を
見つけることに失敗します。

00:01:24.720 --> 00:01:27.960 align:middle
次に、Object を探します。
coucou: はありません。

00:01:28.120 --> 00:01:29.440 align:middle
この時点で

00:01:29.840 --> 00:01:34.880 align:middle
Pharo のバーチャルマシンが
doesNotUnderstand: メッセージを

00:01:35.320 --> 00:01:38.520 align:middle
レシーバーの node 1 に送ります。

00:01:40.360 --> 00:01:43.320 align:middle
DNU とは Does Not Understand です。

00:01:43.880 --> 00:01:47.600 align:middle
バーチャルマシンはメッセージを
引数に変換します。

00:01:48.480 --> 00:01:50.520 align:middle
これがその引数です。
「coucou: stef」

00:01:50.840 --> 00:01:53.800 align:middle
もう一度、ステップを追っていきます。

00:01:54.240 --> 00:01:57.880 align:middle
coucou: が node 1 に送られます。
そのクラスでマッチが試みられて

00:01:59.080 --> 00:02:01.040 align:middle
そしてスーパークラスで試みられます。

00:02:01.200 --> 00:02:05.920 align:middle
coucou: は見つかりません。
そこでメッセージ doesNotUnderstand: が

00:02:06.160 --> 00:02:08.200 align:middle
オブジェクト node 1 に再送されます。

00:02:09.000 --> 00:02:12.640 align:middle
アルゴリズムは
doesNotUnderstand: メソッドを

00:02:12.880 --> 00:02:14.200 align:middle
node 1 のクラスで探します。

00:02:14.800 --> 00:02:19.960 align:middle
見つかりません。
アルゴリズムはそのスーパークラスから探します。

00:02:20.600 --> 00:02:22.680 align:middle
ここにあります。

00:02:22.840 --> 00:02:27.080 align:middle
doesNotUnderstand: メソッドが
Object で見つかり、実行されます。

00:02:27.440 --> 00:02:29.480 align:middle
つまり

00:02:29.960 --> 00:02:32.000 align:middle
Object のあらゆるサブクラスで

00:02:32.360 --> 00:02:34.800 align:middle
doesNotUnderstand: を実装して

00:02:34.960 --> 00:02:38.360 align:middle
メッセージを理解できなかった場合の
特殊な振る舞いを

00:02:39.200 --> 00:02:43.640 align:middle
起こすことができます。

00:02:44.480 --> 00:02:46.880 align:middle
このスライドにその詳細を

00:02:47.200 --> 00:02:50.680 align:middle
ステップ毎に示しています。

00:02:51.400 --> 00:02:54.280 align:middle
doesNotUnderstand: は他のメッセージと同様に
メッセージです。

00:02:54.560 --> 00:02:58.960 align:middle
したがって、
DoesNotUnderstand: メソッドを実装して

00:02:59.400 --> 00:03:03.200 align:middle
インスタンスがメッセージを理解できなかった時に
実行させることができます。

00:03:03.760 --> 00:03:05.160 align:middle
このメカニズムは

00:03:05.800 --> 00:03:09.760 align:middle
面倒な処理、たとえば

00:03:10.120 --> 00:03:12.880 align:middle
プロキシや自動移譲のような

00:03:13.560 --> 00:03:17.800 align:middle
あるオブジェクトが受け取ったメッセージを全て

52 align:middle
00:03:17,960 --> 00:03:19,680
他のオブジェクトに送りたい時に使います。

00:03:19.840 --> 00:03:23.200 align:middle
doesNotUnderstand 機構は
そんなことに使われます。

00:03:24.040 --> 00:03:27.400 align:middle
doesNotUnderstand:の
デフォルトの実装は

00:03:27.560 --> 00:03:28.640 align:middle
Object クラスにあります。

00:03:29.000 --> 00:03:32.200 align:middle
その実装では例外を上げます。

00:03:33.000 --> 00:03:34.240 align:middle
その例外は

00:03:35.080 --> 00:03:38.280 align:middle
MessageNotUnderstood と呼ばれます。

00:03:38.640 --> 00:03:41.760 align:middle
したがって、もしも Object クラスの
DoesNotUnderstand: メソッドが実行されたら

00:03:41.920 --> 00:03:44.680 align:middle
例外が上がります。

00:03:45.240 --> 00:03:49.600 align:middle
つまりコードの中でその例外をキャッチできます。

00:03:49.920 --> 00:03:52.640 align:middle
他の例外のキャッチと同じ方法で。

00:03:52.880 --> 00:03:57.520 align:middle
例外は、理解されなかったメッセージの
デバッガーを開きます。

00:03:58.040 --> 00:03:59.440 align:middle
この例では

00:04:00.080 --> 00:04:02.640 align:middle
また Node クラスに戻りますが

00:04:02.960 --> 00:04:07.120 align:middle
sayHello メソッドが Node にあって
coucou: メッセージを

00:04:07.600 --> 00:04:09.480 align:middle
レシーバーつまり self に送ります。

00:04:10.760 --> 00:04:12.760 align:middle
また、 welcome メソッドもあって

00:04:13.120 --> 00:04:16.280 align:middle
sayHello メッセージを
self に送ります。

00:04:16.680 --> 00:04:20.600 align:middle
welcome メソッドでは
理解されなかったメッセージのコンテキストで

00:04:21.360 --> 00:04:23.280 align:middle
特殊なハンドリングをします。

00:04:23.600 --> 00:04:28.600 align:middle
もしメッセージが理解されなければ
ハンドルされます。

00:04:28.760 --> 00:04:32.000 align:middle
ここで、 sayHello が
coucou: メッセージを self に送ります。

00:04:32.160 --> 00:04:34.280 align:middle
coucou: はまだ未実装です。

00:04:34.880 --> 00:04:37.640 align:middle
最終的に
doesNotUnderstand: メソッドが

00:04:38.000 --> 00:04:40.920 align:middle
実行されます。

00:04:41.560 --> 00:04:45.240 align:middle
MessageNotUnderstood 例外が
上げられます。

00:04:46.120 --> 00:04:48.280 align:middle
on:do: と続くこのコードが

00:04:48.680 --> 00:04:52.560 align:middle
例外をキャッチするのに使われます。
Java の try/catch に似ています。

00:04:52.960 --> 00:04:56.800 align:middle
このコースの続く講義で
これらの例外について学びます。

00:04:57.880 --> 00:05:00.800 align:middle
ここで重要なことは
このコードが

00:05:00.960 --> 00:05:05.720 align:middle
Java の catch と同じで
例外に対して実行されるということです。

00:05:06.640 --> 00:05:09.280 align:middle
さあ、メッセージ welcome を

00:05:10.440 --> 00:05:11.840 align:middle
node 1 に送ります。

00:05:12.000 --> 00:05:14.080 align:middle
coucou: が実装されていないことが
判明して

00:05:14.520 --> 00:05:18.520 align:middle
コンソールに「Something went wrong
with the message.」と表示されます。

00:05:19.440 --> 00:05:20.640 align:middle
これまででわかったことは

00:05:22.680 --> 00:05:27.240 align:middle
探索アルゴリズムがメッセージにマッチした
メソッドを見つけられなかった時には

00:05:27.560 --> 00:05:31.440 align:middle
doesNotUnderstand: メッセージが
元のレシーバーに送られて

00:05:31.600 --> 00:05:33.760 align:middle
元のメッセージが引数として渡されます。

00:05:34.360 --> 00:05:37.520 align:middle
どんなクラスでも
このメソッドを定義できます。

00:05:37.800 --> 00:05:41.840 align:middle
Object クラスでのデフォルトの実装が
実行されると

00:05:42.080 --> 00:05:45.200 align:middle
例外が上がります。

00:05:45.440 --> 00:05:47.400 align:middle
MessageNotUnderstood 例外です。

00:05:47.560 --> 00:05:50.560 align:middle
この例外をコードでキャッチすることも

00:05:50.720 --> 00:05:53.200 align:middle
デバッグすることもできます。

