WEBVTT

00:00:00.400 --> 00:00:01.600 align:middle
こんにちは、みなさん。

00:00:01.760 --> 00:00:05.840 align:middle
この講義ではクラスメソッドに注目します。

00:00:06.320 --> 00:00:08.320 align:middle
前に見た通り

00:00:08.520 --> 00:00:12.840 align:middle
クラスメソッドは
他のメソッド同様の通常のメソッドです。

00:00:13.520 --> 00:00:17.440 align:middle
一般に、新しいインスタンスを作るために
使いますが

00:00:17.760 --> 00:00:19.760 align:middle
他のことにも使われます。

00:00:20.200 --> 00:00:24.080 align:middle
クラスメソッドの使い方について
2つの例を見ましょう。

00:00:24.720 --> 00:00:28.280 align:middle
仮に、コンピュータプログラムで

00:00:28.440 --> 00:00:30.840 align:middle
これらの行をパースしたいとします。

00:00:32.120 --> 00:00:34.800 align:middle
これらの行は構造を作っています。

00:00:36.000 --> 00:00:39.720 align:middle
感嘆符（!）で始まる行は

00:00:40.120 --> 00:00:42.040 align:middle
タイトルとして読み込まれます。

00:00:42.480 --> 00:00:47.720 align:middle
ダッシュ（-）で始まる行は
リストのアイテムです。

00:00:49.240 --> 00:00:51.920 align:middle
1つより多くのダッシュで始まる行は

00:00:52.120 --> 00:00:54.760 align:middle
リストのサブアイテムです。

00:00:55.680 --> 00:00:58.000 align:middle
他の場合は、段落です。

00:00:58.800 --> 00:01:01.560 align:middle
これらを入力とするプログラムで

00:01:03.080 --> 00:01:05.640 align:middle
DocumentItem のサブクラスの

00:01:05.800 --> 00:01:07.960 align:middle
インスタンスを作ります。

00:01:10.080 --> 00:01:13.080 align:middle
また、このプログラムの設計として

00:01:13.280 --> 00:01:16.600 align:middle
DocumentItem の各サブクラスが

00:01:16.760 --> 00:01:17.880 align:middle
行をパースする責任を持っていて

00:01:18.040 --> 00:01:21.640 align:middle
与えられた行について
canParse: を決めることにします。

00:01:21.800 --> 00:01:26.680 align:middle
ここの canParse: メソッドでは
1行のテキストを渡します。

00:01:27.000 --> 00:01:30.440 align:middle
その行が感嘆符で始まっていたら

00:01:30.600 --> 00:01:32.920 align:middle
canParse: メソッドは true を返します。

00:01:33.080 --> 00:01:35.840 align:middle
その行は、SectionTitle クラス に属します。

00:01:36.440 --> 00:01:37.920 align:middle
LiteItem クラスでは

00:01:38.640 --> 00:01:43.920 align:middle
canParse: メソッドはダッシュで始まる行に
true を返します。

00:01:44.760 --> 00:01:48.400 align:middle
そして、この canParse: は常に true を返します。

00:01:49.240 --> 00:01:54.320 align:middle
考え方としては、クラスを1つ1つ見ていって

00:01:54.920 --> 00:01:58.120 align:middle
与えられた行をパースできるクラスを見つけ次第

00:01:58.840 --> 00:02:03.480 align:middle
そのクラスを使って、その行をパースした
新しいインスタンスを作る、ということです。

00:02:04.600 --> 00:02:06.840 align:middle
それが canParse: メソッドのゴールです。

00:02:07.000 --> 00:02:11.840 align:middle
newFromLine: メソッドは
1 行のテキストを引数として取って

00:02:12.960 --> 00:02:17.560 align:middle
その行を表すインスタンスを返します。

00:02:17.920 --> 00:02:22.920 align:middle
newFromLine: メッセージが
SectionTitle クラスに送られて

00:02:23.200 --> 00:02:27.120 align:middle
感嘆符で始まる一連の文字が渡されたら

00:02:27.520 --> 00:02:31.880 align:middle
newFromLine: メソッドは
SectionTitle クラスのインスタンスを返します。

00:02:32.360 --> 00:02:33.760 align:middle
こんな風に動くようにします。

00:02:34.080 --> 00:02:36.880 align:middle
Parser クラスがすることは

00:02:37.040 --> 00:02:39.680 align:middle
DocumentItem のサブクラスの中から

00:02:40.000 --> 00:02:42.160 align:middle
与えられた行を担当するものを探します。

00:02:42.520 --> 00:02:46.360 align:middle
Parser は documentClasses という
メソッドを持っています。

00:02:47.320 --> 00:02:51.720 align:middle
そのメソッドは DocumentItem の

00:02:52.160 --> 00:02:53.520 align:middle
サブクラスのリストを返します。

00:02:53.840 --> 00:02:58.040 align:middle
これらのクラスを含む
コレクションを返します。

00:02:58.640 --> 00:03:02.320 align:middle
DocumentItem に
allSubclasses メッセージを送ります。

00:03:02.480 --> 00:03:05.800 align:middle
allSubclasses メソッドは Pharo システムに
既に存在しています。

00:03:05.960 --> 00:03:09.160 align:middle
与えられたクラスの
サブクラスのリストを返します。

00:03:09.640 --> 00:03:13.000 align:middle
このメッセージの結果

00:03:13.160 --> 00:03:16.440 align:middle
SectionTitle と ListItem と Text
を含むコレクションが得られます。

00:03:17.960 --> 00:03:20.520 align:middle
このコレクションを優先順位によって
並べておきます。

00:03:20.680 --> 00:03:24.400 align:middle
そうすることで、Text クラスが最後に
なるようにします。

00:03:24.680 --> 00:03:27.960 align:middle
というのも、Text クラスの canParse: メソッドは
常に true を返すからです。

00:03:28.120 --> 00:03:31.640 align:middle
Text クラスはどんな行でも
パースできてしまいます。

00:03:32.960 --> 00:03:36.080 align:middle
他のクラスを試したあとで、
Text クラスを試します。

00:03:36.240 --> 00:03:39.520 align:middle
そのために優先順位という概念を使います。

00:03:41.160 --> 00:03:44.960 align:middle
見ての通り、多くのメソッドに
下線が引かれています。

00:03:45.240 --> 00:03:48.760 align:middle
メソッドに下線を引かれていると

00:03:49.160 --> 00:03:51.720 align:middle
それはクラスメソッドだということを
示しています。

00:03:52.040 --> 00:03:56.240 align:middle
これらのメソッドを実行するためには
メッセージをクラスに送らなければなりません。

00:03:56.480 --> 00:04:01.400 align:middle
canParse: メソッドを
SectionTitle クラスに送って

00:04:01.760 --> 00:04:05.840 align:middle
SectionTitle クラスが与えられた行を
パースできるかどうか見なければなりません。

00:04:08.240 --> 00:04:12.560 align:middle
Parser クラスの parse: メソッドは
行を引数として受け取ります。

00:04:12.960 --> 00:04:18.760 align:middle
DocumentItem の全てのサブクラスから
その行をパースできるクラスを探します。

00:04:19.040 --> 00:04:22.600 align:middle
見つかれば
そのクラスのインスタンスを作ります。

00:04:24.200 --> 00:04:28.600 align:middle
detect: をコレクションに送ることで

00:04:29.160 --> 00:04:33.520 align:middle
そのコレクションの要素の中から
述語を満たすものを得ます。

00:04:34.400 --> 00:04:38.920 align:middle
さて、クラスメソッドを使う
もう 1 つの例を見てみましょう。

00:04:39.320 --> 00:04:43.800 align:middle
コマンドラインの引数をどのように扱っているか
見てみましょう。

72 align:middle
00:04:44,480 --> 00:04:48,160
ここでは 引数を受け取って

00:04:49.040 --> 00:04:52.960 align:middle
処理を変える引数を見つける
プログラムを見ていきます。

00:04:53.360 --> 00:04:57.160 align:middle
最初の引数はアクションが実行されることを示しています。

00:04:57.680 --> 00:05:02.080 align:middle
プログラムの設計として アクションの種類ごとに
1つのクラスを持つようにします。

00:05:02.400 --> 00:05:06.000 align:middle
eval アクションは1つのクラスで表現されます。

00:05:06.360 --> 00:05:08.160 align:middle
EvaluateCommandLineHandler です。

00:05:09.920 --> 00:05:13.800 align:middle
eval が引数として現れた時に
どんなアクションが実行されるでしょうか？

00:05:14.440 --> 00:05:17.000 align:middle
実行するのは…

00:05:17.280 --> 00:05:21.120 align:middle
この一連の文字列が
Pharo のコードとして解釈されて

00:05:21.560 --> 00:05:24.040 align:middle
その表現式の結果が返されます。

00:05:24.680 --> 00:05:27.440 align:middle
3628800 が
10 factorial の結果です。

00:05:27.920 --> 00:05:29.440 align:middle
これは

00:05:30.360 --> 00:05:32.920 align:middle
CommandLineHandler クラス
を使って実装されています。

00:05:33.960 --> 00:05:36.440 align:middle
EvaluateCommandLineHandler は

00:05:36.920 --> 00:05:41.480 align:middle
eval の処理を担当するサブクラスです。

00:05:41.800 --> 00:05:45.560 align:middle
eval がコマンドラインの
最初の引数として送られたら

00:05:45.720 --> 00:05:47.560 align:middle
このクラスが処理しなければなりません。

00:05:48.680 --> 00:05:52.560 align:middle
isReponsibleFor: メソッドが
true を返すのは

00:05:53.200 --> 00:05:54.960 align:middle
サブクラスが

00:05:55.120 --> 00:05:59.920 align:middle
このコマンドラインを処理する能力が
ある場合です。

00:06:01.400 --> 00:06:02.760 align:middle
その背後には

00:06:03.240 --> 00:06:07.640 align:middle
前の例で見たのと同じメカニズムがあります。

00:06:08.080 --> 00:06:13.160 align:middle
もう1度言いますが、クラスメソッド
そしてクラスへのメッセージ送信は

00:06:14.400 --> 00:06:16.800 align:middle
インスタンスを作ること以外の仕事にも
使われます。

00:06:17.600 --> 00:06:21.480 align:middle
この講義ではクラスメソッドの
2つの利用例を見ました。

00:06:22.200 --> 00:06:26.360 align:middle
クラスメソッドは多くの場合
新しいインスタンスを作るために使われます。

00:06:26.680 --> 00:06:29.320 align:middle
しかし、他の使い方もあります。

