WEBVTT

00:00:01.910 --> 00:00:04.410 align:middle
このビデオは本MOOCでの反復です。

00:00:04.577 --> 00:00:07.030 align:middle
ここでの反復というのは
自分でやってみることです。

00:00:07.520 --> 00:00:09.540 align:middle
ビデオを見て見たものを
1つ1つ実行することです。

00:00:10.060 --> 00:00:13.470 align:middle
我々がプログラムする方法を見ることを
お勧めする意味もあります。

00:00:13.720 --> 00:00:17.680 align:middle
台本通りに忠実には進まないかもしれませんが

00:00:17.847 --> 00:00:20.060 align:middle
できるだけ、そうしましょう。
しかしバグを見つけたり

00:00:20.227 --> 00:00:23.090 align:middle
そんなことがあったら
その都度対処しましょう。

00:00:24.870 --> 00:00:29.130 align:middle
このビデオでは
簡単な言語をプログラムします。

00:00:29.297 --> 00:00:32.040 align:middle
ロールプレイングゲームにあるような
感じの言語です。

00:00:32.207 --> 00:00:35.930 align:middle
ダンジョンズ＆ドラゴンズのような。
例えば

00:00:36.097 --> 00:00:38.800 align:middle
この記述を手にした人は

00:00:38.967 --> 00:00:40.010 align:middle
どういう風に読み取ったらいいのでしょう？

00:00:40.420 --> 00:00:45.380 align:middle
こういう意味です。
2つの20面ダイスと1つの4面ダイスを振りなさい。

00:00:45.547 --> 00:00:47.420 align:middle
これが Pharo の表現式になることが
おわかりでしょうか。

00:00:48.000 --> 00:00:52.490 align:middle
つまり、このビデオでは

00:00:52.657 --> 00:00:55.170 align:middle
ダイスを表現するクラスと

00:00:55.337 --> 00:00:57.420 align:middle
ダイスのハンドルを表現するクラスを
実装します。

00:00:58.660 --> 00:00:59.770 align:middle
では始めましょう。

00:01:00.870 --> 00:01:04.290 align:middle
始めに、パッケージを定義します。

00:01:05.710 --> 00:01:06.790 align:middle
Dice と呼ぶことにします。

00:01:06.957 --> 00:01:11.860 align:middle
他のものは見たくないので

00:01:12.027 --> 00:01:16.660 align:middle
このビデオでは

00:01:16.827 --> 00:01:19.450 align:middle
コードをデバッガーで書くやり方は
しないつもりです。

00:01:19.617 --> 00:01:22.210 align:middle
ほかのビデオでお見せした方法ですが

00:01:22.377 --> 00:01:24.410 align:middle
ケースバイケースで、そうすべき機会があれば
そうすることもあるでしょう。

00:01:25.490 --> 00:01:30.030 align:middle
ここで、Die クラスを定義します。

00:01:30.197 --> 00:01:31.370 align:middle
面の数 faces を持っています。

00:01:32.100 --> 00:01:35.630 align:middle
コンパイルします。
クラスコメントを追加します。

00:01:43.380 --> 00:01:45.890 align:middle
当面は大したことはありません。
とてもとても単純なものですから。

00:01:47.550 --> 00:01:52.360 align:middle
このオブジェクトの初期化を

00:01:52.527 --> 00:01:53.950 align:middle
作る作業を始めてみましょう。

00:02:00.450 --> 00:02:02.260 align:middle
こんな風にやります。

00:02:10.190 --> 00:02:13.560 align:middle
スーパークラスの初期化を呼んで

00:02:13.727 --> 00:02:18.140 align:middle
面の数のデフォルト値として6を代入します。

00:02:18.307 --> 00:02:19.140 align:middle
それが最も一般的なダイスなので。

00:02:19.820 --> 00:02:22.530 align:middle
ここでテストクラスを作り始めます。

00:02:22.697 --> 00:02:25.640 align:middle
一旦作ったものを

00:02:25.807 --> 00:02:26.900 align:middle
壊してしまわないようにするためです。

00:02:27.260 --> 00:02:30.450 align:middle
テストクラスは
TestCaseクラスのサブクラスです。

00:02:30.617 --> 00:02:34.100 align:middle
DieTest クラスとします。

00:02:34.370 --> 00:02:37.510 align:middle
これでテストクラスができました。

00:02:37.790 --> 00:02:40.220 align:middle
最初にやるべきテストの1つとして

00:02:40.387 --> 00:02:42.480 align:middle
いつもそうする必要はありませんが

00:02:42.647 --> 00:02:46.650 align:middle
ちゃんと動くテストから始めたいのです。

00:02:47.840 --> 00:02:52.120 align:middle
今の所、あまり多くのものはないので
初期化はOKだと言いたいです。

00:02:53.820 --> 00:02:56.160 align:middle
ここでお見せするのは

00:02:56.327 --> 00:02:59.770 align:middle
例外が出てくることを確認するテストや

00:02:59.937 --> 00:03:01.440 align:middle
例外が出ないことを確認するテストの
例にもなっています。

00:03:02.180 --> 00:03:04.590 align:middle
では書いてみます。

00:03:04.757 --> 00:03:06.460 align:middle
Die new は Error を投げてはいけない。

00:03:18.120 --> 00:03:19.170 align:middle
どういう意味でしょう？

00:03:19.337 --> 00:03:23.290 align:middle
「Die new というコードを実行した時に

00:03:23.457 --> 00:03:25.600 align:middle
エラーが発生してはいけない」
という意味です。

00:03:28.170 --> 00:03:32.560 align:middle
このテストを分類して実行します。

00:03:32.727 --> 00:03:35.550 align:middle
グリーンです。ばっちりです。

00:03:36.000 --> 00:03:40.020 align:middle
ではここで

00:03:40.187 --> 00:03:44.540 align:middle
ダイスを振るメソッドを定義します。

00:03:44.707 --> 00:03:48.610 align:middle
Pharo には 

00:03:48.777 --> 00:03:49.720 align:middle
atRandom というメソッドがあります。

00:03:49.887 --> 00:03:53.940 align:middle
atRandomは何をするのでしょうか？

00:03:54.480 --> 00:03:57.780 align:middle
そのメソッドの機能は…そうですね

00:03:58.310 --> 00:04:00.770 align:middle
実装を見て確認してみましょう。

00:04:00.937 --> 00:04:03.620 align:middle
atRandomは何をするのでしょう？

00:04:04.870 --> 00:04:09.070 align:middle
それは 1 から self までの
ランダムな整数を返します。ピッタリですね。

00:04:10.910 --> 00:04:13.910 align:middle
なので、新しいメソッドを

00:04:15.290 --> 00:04:19.220 align:middle
operationsに定義します。

00:04:21.160 --> 00:04:22.230 align:middle
何をしましょうか？

00:04:22.397 --> 00:04:26.640 align:middle
roll（転がす）です。

00:04:27.570 --> 00:04:28.203 align:middle
「ランダムな出目を返す」ということです。

00:04:35.750 --> 00:04:37.400 align:middle
そこでこのメソッドのテストを書きます。

00:04:40.490 --> 00:04:43.590 align:middle
testRolling
何をするのでしょう？

00:04:44.120 --> 00:04:49.040 align:middle
ダイスを作ります。

00:04:49.207 --> 00:04:49.840 align:middle
d:= Die new

00:04:51.210 --> 00:04:53.140 align:middle
そして
1000 timesRepeat:

00:04:54.420 --> 00:04:58.240 align:middle
何を？
d roll

00:05:03.620 --> 00:05:07.580 align:middle
そしてこれが
1 から 6 の間であってほしいのです。

77 align:middle
00:05:07,747 --> 00:05:12,640
between: and:
いいですね。

00:05:12.807 --> 00:05:15.560 align:middle
between: 1 and: 6

00:05:15.820 --> 00:05:18.510 align:middle
これはあまり良くないです。
というのも、ここでは

00:05:18.677 --> 00:05:22.470 align:middle
6面ダイスのテストしか書いていません。

00:05:22.637 --> 00:05:25.310 align:middle
ダイスの面の数に従って動くべきです。

00:05:25.640 --> 00:05:26.580 align:middle
それは後回しにしましょう。

00:05:26.830 --> 00:05:27.463 align:middle
なのでコンパイルします。

00:05:32.840 --> 00:05:35.620 align:middle
エラーになりました。こうです。

00:05:37.910 --> 00:05:39.170 align:middle
これでテストができました。

00:05:39.337 --> 00:05:41.460 align:middle
ここで保存しましょう。
Dice パッケージがあるので

00:05:41.627 --> 00:05:44.590 align:middle
ローカルに保存します。
Save です。

00:05:44.757 --> 00:05:49.000 align:middle
練習で他のものをいくつか作ったので

00:05:49.167 --> 00:05:51.710 align:middle
新しいものを作ります。
「新しいバージョン

00:05:56.530 --> 00:06:00.780 align:middle
ダイスを振るのとテスト」
これで良し、と。

00:06:01.030 --> 00:06:02.370 align:middle
はい、これで保存されました。

00:06:11.480 --> 00:06:14.610 align:middle
ここで、インスタンス生成の
インターフェイスを変えようと思います。

00:06:14.777 --> 00:06:18.890 align:middle
まずはカテゴリーを整理します。

00:06:19.810 --> 00:06:22.200 align:middle
インスタンス生成を少し変えたい。

00:06:22.367 --> 00:06:26.390 align:middle
ダイスを作るときに

00:06:26.557 --> 00:06:28.090 align:middle
面の数をつかいたい。

00:06:39.290 --> 00:06:42.610 align:middle
もう解ったはずですが
この式の中で

00:06:42.777 --> 00:06:46.030 align:middle
faces は Die クラスへ
送られたメッセージであって

00:06:46.197 --> 00:06:48.610 align:middle
Die クラスのインスタンスへの
メッセージでははありません。

00:06:49.090 --> 00:06:51.880 align:middle
インスタンスへのメッセージは今のところ
roll メソッドかまたは別のクラスのメソッドだけです。

00:06:52.047 --> 00:06:55.040 align:middle
これで理解してほしいのは

00:06:55.207 --> 00:06:58.900 align:middle
いつクラスレベルへ行くべきか、あるいは
行くべきでないか、ということです。

00:06:59.350 --> 00:07:00.710 align:middle
まずはテストを書きましょう。

00:07:03.050 --> 00:07:06.420 align:middle
betterInterface

00:07:08.790 --> 00:07:10.200 align:middle
同じロジックで続けると

00:07:12.230 --> 00:07:18.080 align:middle
testBetterCreationInterface

00:07:18.247 --> 00:07:20.950 align:middle
ここで例えばこんなことをしたいのです。

00:07:22.680 --> 00:07:23.640 align:middle
そしてこれは faces です。

00:07:30.620 --> 00:07:32.420 align:middle
ゆっくりやります。

00:07:32.950 --> 00:07:36.840 align:middle
ここに行ってinstance creation と入力して
faces: anInteger

00:07:46.560 --> 00:07:49.000 align:middle
短く書くこともできますが
ここでは

00:07:49.167 --> 00:07:50.530 align:middle
「穏やかな」やり方をします。

00:07:51.000 --> 00:07:52.940 align:middle
ダイスを作ります。

00:07:53.890 --> 00:07:57.740 align:middle
self new と書きます。
ここでの self は Die クラス自身です。

00:07:58.220 --> 00:08:00.410 align:middle
インスタンスを作る
と伝えます。

00:08:00.577 --> 00:08:03.620 align:middle
そして
このインスタンスに対して

00:08:03.787 --> 00:08:08.410 align:middle
アクセサーを使って
引数として渡された値を代入します。

00:08:08.577 --> 00:08:12.130 align:middle
当然、今まさに作ったダイスを返します。

00:08:13.860 --> 00:08:16.920 align:middle
このコードが実行して
ちゃんと動きません。

00:08:17.087 --> 00:08:19.950 align:middle
faces はまだ存在していないからです。
なので心配しなくていいです。

00:08:20.117 --> 00:08:22.760 align:middle
テストが OK ではないですが

00:08:22.927 --> 00:08:27.720 align:middle
正常なことです。これを実行すれば
execute this

00:08:27.887 --> 00:08:29.520 align:middle
例えば、デバッグして見てみれば

00:08:33.640 --> 00:08:38.360 align:middle
Over をクリックすると

00:08:38.527 --> 00:08:41.430 align:middle
faces というメッセージがわからない
と言ってきます。

00:08:41.910 --> 00:08:45.770 align:middle
ここでは「穏やかな」やり方でいくので
デバッガではやりません。

00:08:46.830 --> 00:08:49.600 align:middle
その通りで
アクセサーを追加する必要があります。

00:08:52.910 --> 00:08:57.390 align:middle
faces: anInteger
と書いて

00:08:57.557 --> 00:09:01.520 align:middle
faces := anInteger
と書きます。

00:09:05.020 --> 00:09:08.110 align:middle
ついでに読み出しのアクセサーを書きます。

00:09:09.330 --> 00:09:11.500 align:middle
これを返します。

00:09:13.250 --> 00:09:14.450 align:middle
これでテストはグリーンです。

00:09:15.240 --> 00:09:19.180 align:middle
なので保存します。
save

00:09:19.347 --> 00:09:22.250 align:middle
ダイスのより良い生成メソッドと
テスト

00:09:22.417 --> 00:09:23.050 align:middle
よしと。

00:09:31.610 --> 00:09:33.670 align:middle
これで

00:09:33.837 --> 00:09:37.650 align:middle
ダイスハンドルの定義を
始めることができます。

00:09:38.690 --> 00:09:42.050 align:middle
ダイスハンドルについて

00:09:42.217 --> 00:09:44.000 align:middle
どんな風に書きたいでしょうか？

00:09:44.167 --> 00:09:45.450 align:middle
DiceHandle new addDie:
みたいに書きたいと思います。

00:09:49.300 --> 00:09:53.290 align:middle
そして新しいダイスを作るわけです。
die faces: 6; addDie:

00:09:55.210 --> 00:09:59.680 align:middle
Die faces: 10

00:10:07.260 --> 00:10:12.040 align:middle
今回は

00:10:12.207 --> 00:10:13.580 align:middle
テストクラスから書き始めたいと思います。

00:10:15.250 --> 00:10:19.930 align:middle
なので TestCase から継承した新しいクラスです。

00:10:20.290 --> 00:10:22.330 align:middle
よし。
新しいテストクラスができました。

00:10:24.000 --> 00:10:26.730 align:middle
そしてテストを定義します。

00:10:30.220 --> 00:10:32.850 align:middle
ハンドルを作って

00:10:33.017 --> 00:10:35.140 align:middle
正しいダイスが入っているか
チェックします。

00:10:35.307 --> 00:10:39.380 align:middle
testAdding
コードを再利用します。

00:10:39.547 --> 00:10:43.730 align:middle
そうしない理由はないですよね。

00:10:45.530 --> 00:10:48.060 align:middle
なのでここで

00:10:54.310 --> 00:10:58.940 align:middle
handle　さらに yourself

00:10:59.107 --> 00:11:01.960 align:middle
メッセージレシーバーが欲しいので。
つまりハンドルであって

00:11:02.127 --> 00:11:03.690 align:middle
渡した引数ではなく。

00:11:04.500 --> 00:11:08.260 align:middle
さあ、何をしたらいいでしょう？

00:11:08.427 --> 00:11:12.520 align:middle
self assert: [h diceNumber

00:11:13.960 --> 00:11:14.593 align:middle
equals 2

00:11:20.700 --> 00:11:23.380 align:middle
コンパイルします。
明らかなことですが、システムが

00:11:23.547 --> 00:11:25.930 align:middle
変数 DiceHandle を知らないと言っています。

00:11:26.097 --> 00:11:26.730 align:middle
そういうクラスが欲しいのですか？と。

00:11:26.897 --> 00:11:27.960 align:middle
はい、クラスです。

00:11:28.560 --> 00:11:29.750 align:middle
これで定義されます。

00:11:29.917 --> 00:11:31.340 align:middle
いずれダイスを持たないといけないことは
もう分かっていることなので

00:11:31.507 --> 00:11:36.440 align:middle
ちょうどいい機会なので

00:11:36.870 --> 00:11:39.580 align:middle
ここでインスタンス変数を入れます。

00:11:39.747 --> 00:11:40.860 align:middle
これをコンパイルします。

00:11:41.790 --> 00:11:45.720 align:middle
これで（テストは）レッドです。
addDie: が定義されていないからです。

00:11:47.620 --> 00:11:48.570 align:middle
なので定義しましょう。

00:11:48.737 --> 00:11:51.620 align:middle
その前に
ハンドルを初期化しておいたほうがいいですね。

00:11:54.240 --> 00:11:56.660 align:middle
こんな風にします。

00:11:56.827 --> 00:11:57.890 align:middle
後々のバグを予防できます。

00:12:02.890 --> 00:12:04.560 align:middle
dice : = OrderedCollection new.

00:12:04.727 --> 00:12:05.360 align:middle
Recategorize（分類し直し）

00:12:21.880 --> 00:12:24.760 align:middle
そして、これでテストできるはずです。

00:12:24.927 --> 00:12:27.730 align:middle
で、クラッシュします。
はいはい、大丈夫です。

00:12:27.897 --> 00:12:30.200 align:middle
addDie: を作ります。

00:12:30.530 --> 00:12:31.163 align:middle
adding です。

00:12:35.330 --> 00:12:38.030 align:middle
このメソッドを実装しなければならない
と言ってきます。

00:12:38.197 --> 00:12:39.080 align:middle
まあその通りです。

00:12:39.247 --> 00:12:42.430 align:middle
dice add: aDie
と書きます。

00:12:43.590 --> 00:12:45.920 align:middle
はい、ばっちりです。
テストはまだ動きません。

00:12:46.087 --> 00:12:48.150 align:middle
diceNumberをまだ定義していないからです。

00:12:48.317 --> 00:12:52.120 align:middle
では定義しましょう。
はい、diceNumber です。

00:12:52.287 --> 00:12:56.780 align:middle
今回は accessing に定義します。

00:12:57.350 --> 00:12:58.800 align:middle
そして diceNumber ですが
何をしましょうか？

00:12:58.967 --> 00:13:00.330 align:middle
返さないといけないのは

00:13:06.290 --> 00:13:08.110 align:middle
ダイスの個数です。またコンパイルします。
テストを進めるとグリーンになるはずです。

00:13:09.940 --> 00:13:12.510 align:middle
テストはグリーンになったので

00:13:12.677 --> 00:13:14.860 align:middle
保存します。

00:13:17.250 --> 00:13:18.580 align:middle
addDie とテスト。

00:13:24.560 --> 00:13:28.090 align:middle
テストを改良することもできます。

00:13:28.257 --> 00:13:31.900 align:middle
ここでは 2つのダイスをくわえていますが

00:13:32.067 --> 00:13:35.180 align:middle
同じダイスを2回追加しても

00:13:35.347 --> 00:13:37.610 align:middle
大丈夫かチェックします。

00:13:38.280 --> 00:13:39.340 align:middle
testAddingTwiceTheSameDieIsOK と。

00:13:49.040 --> 00:13:50.290 align:middle
ここで何をしましょう？

00:13:50.457 --> 00:13:54.530 align:middle
6面ダイスと6面ダイスを足したら
ダイスは2つになるはずです。

00:13:57.030 --> 00:13:59.940 align:middle
これでテストを実行します。
グリーンです。素晴らしい。

00:14:01.230 --> 00:14:04.700 align:middle
さて、ここで

00:14:05.880 --> 00:14:08.960 align:middle
2 つのダイスを追加することを定義できたら

00:14:11.240 --> 00:14:14.900 align:middle
よいのですが、その前に
やっておくことがあります。

00:14:15.067 --> 00:14:17.210 align:middle
見てください。気に入らないのは

00:14:17.377 --> 00:14:19.030 align:middle
例えばこれをインスペクトすると

00:14:23.950 --> 00:14:28.740 align:middle
ダイスの中身がわかりません。

00:14:28.907 --> 00:14:31.530 align:middle
それでデバッグするのは実践的ではないですね。

00:14:31.697 --> 00:14:33.030 align:middle
デバッガーではこれが見えないのです。

00:14:33.370 --> 00:14:36.090 align:middle
なので、先に進める前に
これを改良しておきたいのです。

00:14:36.257 --> 00:14:38.370 align:middle
printing プロトコルに
メソッドを追加します。

00:14:38.660 --> 00:14:41.710 align:middle
printOn: メソッドです。

00:14:44.220 --> 00:14:46.840 align:middle
システムの全てのオブジェクトに
定義されているメソッドで

00:14:47.007 --> 00:14:50.380 align:middle
オブジェクトを

00:14:50.547 --> 00:14:53.490 align:middle
テキスト表現に変換して

00:14:55.380 --> 00:14:58.780 align:middle
ストリームに渡します。

00:14:58.947 --> 00:15:00.420 align:middle
今回は表現をより詳細にします。

00:15:01.890 --> 00:15:03.500 align:middle
こうすると何もしないのと同じです。

00:15:03.667 --> 00:15:07.630 align:middle
super printOn: をすると
前と何も変わりません。

00:15:07.797 --> 00:15:09.230 align:middle
そしてさらに

00:15:09.397 --> 00:15:13.220 align:middle
aStream nextPutAll:
で文字をストリームに入れていきます。
put characters in the 

00:15:13.387 --> 00:15:15.220 align:middle
まず何を入れましょう？

00:15:16.090 --> 00:15:18.330 align:middle
空白と括弧を書きます。

00:15:18.497 --> 00:15:19.880 align:middle
このほうが良い感じでしょう。

00:15:20.450 --> 00:15:23.550 align:middle
そして faces をどうするかですが

00:15:23.717 --> 00:15:27.780 align:middle
数値を文字列に変換して
全部を連結して

00:15:28.360 --> 00:15:30.760 align:middle
括弧を閉じます。

00:15:31.150 --> 00:15:34.930 align:middle
こうして、インスペクターを閉じて
もう一度開きます。

00:15:35.850 --> 00:15:38.630 align:middle
6面ダイスと

00:15:38.797 --> 00:15:40.480 align:middle
10面ダイスがあります。
much 

00:15:40.647 --> 00:15:44.140 align:middle
見ての通り、前よりも良いです。
バグが出てきた時に、きっと手助けになるでしょう。

00:15:44.850 --> 00:15:48.140 align:middle
大したことは何もしていないので
テストは動いています。

00:15:49.450 --> 00:15:53.340 align:middle
また保存します。大した手間ではありません。
表示、と。

00:15:55.220 --> 00:15:56.400 align:middle
Die の printOn: と。

00:16:03.030 --> 00:16:08.000 align:middle
これでよし。ではテストを作りましょう。

00:16:08.167 --> 00:16:09.580 align:middle
いや、テストを作るのではなく
直接やりましょう。

00:16:10.080 --> 00:16:12.490 align:middle
operations プロトコルで

00:16:13.600 --> 00:16:17.890 align:middle
さて

00:16:18.057 --> 00:16:22.530 align:middle
これを定義する方法はいくつかあります。

00:16:22.820 --> 00:16:25.040 align:middle
そのうち1つをお見せします。
一番良い方法というわけではありませんが

00:16:25.207 --> 00:16:27.160 align:middle
おそらく一番解りやすい方法です。

00:16:27.530 --> 00:16:29.130 align:middle
コンパクトに

00:16:29.297 --> 00:16:31.490 align:middle
1行で書くこともできますが

00:16:31.657 --> 00:16:33.150 align:middle
inject:into:のようなイテレーターを使います。
今回はループを使います。

00:16:33.550 --> 00:16:34.210 align:middle
では何をしましょうか？

00:16:34.377 --> 00:16:36.860 align:middle
0 で初期化された変数を使って

00:16:37.390 --> 00:16:42.320 align:middle
全てのダイスについてループして

00:16:42.487 --> 00:16:47.120 align:middle
ループのそれぞれの周回で
ダイスを取り出して

00:16:47.287 --> 00:16:47.920 align:middle
このダイスで何をしましょう？

00:16:48.120 --> 00:16:51.900 align:middle
ダイスを振って
結果を変数に

00:16:52.067 --> 00:16:53.440 align:middle
足していきます。

00:16:55.640 --> 00:17:00.310 align:middle
何も大したことのないですが
とても、とても明示的です。

00:17:02.000 --> 00:17:05.380 align:middle
ここでインスペクトして

00:17:05.547 --> 00:17:10.510 align:middle
roll します。5 です。
これだけでは動いている証明にはなりません。

00:17:11.210 --> 00:17:12.140 align:middle
もう一度やってみます。

00:17:12.307 --> 00:17:13.140 align:middle
11 です。いいでしょう、動いています。

00:17:13.950 --> 00:17:16.120 align:middle
テストを書いてみます。

00:17:16.287 --> 00:17:19.920 align:middle
そうしない理由はないので
テストします。

00:17:21.590 --> 00:17:22.940 align:middle
これを使って
ここは Rolling としましょう。

00:17:26.960 --> 00:17:30.940 align:middle
では、これをどうテストしましょうか？

00:17:31.107 --> 00:17:35.760 align:middle
1からダイスの最大値の間のはずです。
It has to be between one and
the maximum of the number of dice.

00:17:38.000 --> 00:17:42.100 align:middle
なので、こうしましょう。
So we will do this.

00:17:42.267 --> 00:17:42.900 align:middle
これをする
We

00:17:48.280 --> 00:17:49.930 align:middle
メソッドを定義できますね。
could define a method
doing this.

00:17:50.240 --> 00:17:53.040 align:middle
最大値を求めるメソッドを作りましょう。
Let's create a method
defining the maximum.

00:17:56.720 --> 00:18:00.100 align:middle
operations の maxValue です。
"Operation maxValue".

00:18:02.480 --> 00:18:03.240 align:middle
最大値とは何でしょう？

00:18:03.407 --> 00:18:05.020 align:middle
これに似ているはずです。
It is very close to this.

00:18:05.780 --> 00:18:10.000 align:middle
ここではダイスを「振る」かわりに

00:18:11.440 --> 00:18:12.430 align:middle
面の数を訊きます。
I will ask for the faces.

00:18:16.560 --> 00:18:20.490 align:middle
ではチェックしてみましょう。
インスペクトして
Let's check. If I do
"Inspect", there

00:18:21.830 --> 00:18:24.820 align:middle
maxValue します。16 です。
I do "maxValue", "16".

00:18:28.490 --> 00:18:30.480 align:middle
はい、10 と 6 なので正しいです。
Yes, it's right 10 and 6.

00:18:30.647 --> 00:18:33.090 align:middle
では maxVallue のテストを書きましょう。

00:18:37.010 --> 00:18:41.600 align:middle
これを使って
maxValue は

00:18:41.767 --> 00:18:42.400 align:middle
16 になるはずです。

00:18:45.320 --> 00:18:48.150 align:middle
見ての通り
テストではとても汚いコードを書きましたが

00:18:48.317 --> 00:18:51.320 align:middle
最終的には

00:18:51.487 --> 00:18:53.690 align:middle
メソッドを書いて使った方が良いです。

00:18:54.080 --> 00:18:58.370 align:middle
ではここで roll メソッドのテストに戻ります。

00:18:58.820 --> 00:19:02.340 align:middle
roll をします。

00:19:05.900 --> 00:19:08.770 align:middle
そしてその結果は

00:19:08.937 --> 00:19:11.000 align:middle
1 から h maxValue の間

00:19:14.230 --> 00:19:15.690 align:middle
でなければなりません。

00:19:24.080 --> 00:19:26.000 align:middle
実行すると、はい、動きます。

00:19:28.120 --> 00:19:30.870 align:middle
あまり統計的な根拠はないですが
This is not very statistical,
so here we could do

00:19:31.037 --> 00:19:35.800 align:middle
something like
1000 timesRepeat: のようなこともできます。

00:19:36.000 --> 00:19:38.560 align:middle
オッケーです。これで

00:19:42.220 --> 00:19:46.680 align:middle
1000回テストができました。

00:19:47.740 --> 00:19:49.330 align:middle
では保存します。素晴らしい。

00:19:49.497 --> 00:19:52.440 align:middle
maxValue と

00:19:54.610 --> 00:19:56.030 align:middle
rollとテストを追加。

00:20:03.940 --> 00:20:08.380 align:middle
これでほとんど完成です。

00:20:08.547 --> 00:20:11.070 align:middle
表現として

00:20:11.237 --> 00:20:13.680 align:middle
Die faces: 6 ではなく

00:20:16.290 --> 00:20:17.670 align:middle
1 D6
のように表現したいと思います。

00:20:17.837 --> 00:20:18.470 align:middle
そして

00:20:25.510 --> 00:20:27.630 align:middle
これは詰まるところ

00:20:27.797 --> 00:20:31.050 align:middle
整数オブジェクトにメッセージ D6 を送る
ということです。

00:20:31.770 --> 00:20:34.540 align:middle
なので、Integerクラスを見てみましょう。

00:20:34.707 --> 00:20:39.620 align:middle
これからやろうとしていることは

00:20:39.787 --> 00:20:43.660 align:middle
クラスへの拡張を定義することです。

00:20:43.827 --> 00:20:45.010 align:middle
クラスへの拡張とは？

00:20:45.890 --> 00:20:50.350 align:middle
メソッドをパッケージと同じ名前で
パッケージングするのですが

00:20:50.800 --> 00:20:53.360 align:middle
これからお見せします。

00:20:53.527 --> 00:20:57.420 align:middle
プロトコルを追加します。
先頭に * を付けます。

00:20:57.587 --> 00:21:00.780 align:middle
*Dice とすることで
灰色の表示になります。

00:21:00.947 --> 00:21:02.900 align:middle
これはこのメソッドは
このパッケージといっしょに

00:21:03.067 --> 00:21:04.460 align:middle
パッケージされるということです。
やってみましょう。

00:21:04.900 --> 00:21:08.950 align:middle
想像してみましょう。
D6とは何でしょう？

00:21:10.000 --> 00:21:13.570 align:middle
D6... ちょっと考えなければなりません。

00:21:21.050 --> 00:21:24.250 align:middle
まずはハンドルを作ります。

00:21:24.417 --> 00:21:25.510 align:middle
2 D6 とかの場合もありますから。

00:21:27.210 --> 00:21:31.930 align:middle
なので、handle と。

00:21:32.097 --> 00:21:32.730 align:middle
DiceHandle new

00:21:37.120 --> 00:21:38.280 align:middle
はい、これでできました。

00:21:39.380 --> 00:21:42.110 align:middle
これで、レシーバー回数ということで
I will do

00:21:42.277 --> 00:21:45.430 align:middle
self つまり自分の整数で
timesRepeat:

00:21:46.370 --> 00:21:50.140 align:middle
timesRepeat: を本当に多く使いましたが
こんなことは珍しいです。

00:21:51.900 --> 00:21:54.120 align:middle
timesRepeat: [handle addDie:
で、何でしょう。

00:21:56.790 --> 00:22:01.150 align:middle
Die faces:
そして

00:22:02.000 --> 00:22:03.720 align:middle
6 ですよね。

00:22:05.890 --> 00:22:09.830 align:middle
これでハンドルを返せば良さそうですね。

00:22:11.220 --> 00:22:12.330 align:middle
さあ動くでしょうか？

00:22:12.497 --> 00:22:14.950 align:middle
こんな風にテストをして
テストを書きます。

00:22:15.470 --> 00:22:20.380 align:middle
しかし 2 D6
インスペクトすると、ほら

00:22:20.547 --> 00:22:22.390 align:middle
2つの D6 が得られます。すごい。

00:22:23.190 --> 00:22:24.290 align:middle
テストを書きましょう。

00:22:25.640 --> 00:22:27.140 align:middle
これらのテストを分類しておきます。

00:22:28.150 --> 00:22:29.330 align:middle
testNewSyntax
と書きます。

00:22:33.950 --> 00:22:36.420 align:middle
ここで今は D6 しかありません。
後で一般化します。

00:22:38.010 --> 00:22:40.000 align:middle
これと全く同じことをしたいわけです。

00:22:40.167 --> 00:22:44.440 align:middle
そしてハンドルが得られるはず。
では、2 D6 として

00:22:47.020 --> 00:22:49.620 align:middle
self assert: と。

00:22:53.310 --> 00:22:54.430 align:middle
何をテストしましょう？

00:22:54.597 --> 00:22:56.470 align:middle
diceNumber は 2 のはずです。

00:23:02.880 --> 00:23:05.420 align:middle
お気付きかもしれませんが

00:23:05.587 --> 00:23:09.160 align:middle
ここは = 2 とすることもできます。

00:23:09.810 --> 00:23:12.080 align:middle
一般には、assert:equals: を使う方が良いです。

00:23:12.540 --> 00:23:14.310 align:middle
というのも、このように
エラーになった時に

00:23:14.477 --> 00:23:18.020 align:middle
「これを期待していたのに、これが得られた」
とシステムが言ってくれます。

00:23:18.630 --> 00:23:22.910 align:middle
= を使うと、システムは
「間違ってます」としか言えません。

00:23:23.680 --> 00:23:26.480 align:middle
この場合には

00:23:26.647 --> 00:23:28.850 align:middle
開発者としてはassert:equals:を使った方が
良いです。

00:23:30.580 --> 00:23:33.340 align:middle
「2 を期待していましたが、3 が得られました」

00:23:33.560 --> 00:23:34.680 align:middle
のようになるので。

00:23:35.860 --> 00:23:37.060 align:middle
ここは、こうします。

00:23:37.510 --> 00:23:38.780 align:middle
はい、動きました。

00:23:39.320 --> 00:23:41.940 align:middle
もっと賢い方法で

00:23:42.107 --> 00:23:43.090 align:middle
このテストができるでしょうか？

00:23:43.257 --> 00:23:44.240 align:middle
今のところ、これで十分です。

00:23:44.860 --> 00:23:46.640 align:middle
今、このパッケージには

00:23:46.807 --> 00:23:50.200 align:middle
D6 という拡張があることがわかります。

00:23:50.690 --> 00:23:55.480 align:middle
これを後で一般化して
with 

00:23:56.120 --> 00:23:57.550 align:middle
D: aNumberOfFaces とします。

00:24:01.360 --> 00:24:03.870 align:middle
ここが aNumberOfFaces になります。

00:24:05.200 --> 00:24:08.000 align:middle
そして D6 を書き直します。

00:24:08.137 --> 00:24:12.580 align:middle
D6 をこんな風に書きます。
このほうが良いです。

00:24:12.747 --> 00:24:16.660 align:middle
self D: 6 を返します。

00:24:19.050 --> 00:24:20.750 align:middle
他もやってしまいます。

00:24:20.917 --> 00:24:24.370 align:middle
D4

00:24:26.020 --> 00:24:30.870 align:middle
D2。
ダイスというよりコインですね。

00:24:31.220 --> 00:24:35.640 align:middle
D10 と D20.

00:24:36.440 --> 00:24:37.570 align:middle
これが原則です。

00:24:41.540 --> 00:24:45.930 align:middle
ではテストを走らせましょう。
実装を変更したのですから。

00:24:47.010 --> 00:24:49.370 align:middle
2 D6... 動いています。

00:24:49.830 --> 00:24:50.690 align:middle
では保存しましょう。

00:24:59.670 --> 00:25:03.320 align:middle
やり残したことはあるでしょうか？

00:25:03.680 --> 00:25:08.030 align:middle
あります。
ハンドル同士を足し合わせることです。

00:25:09.300 --> 00:25:11.600 align:middle
何をテストしましょうか？

00:25:11.767 --> 00:25:14.640 align:middle
今回確認したいのは
ハンドルを足すことなので

00:25:18.710 --> 00:25:23.240 align:middle
testAddingHandles

00:25:23.407 --> 00:25:25.590 align:middle
(ここで新しい表現を使うことができるのは

00:25:25.757 --> 00:25:26.440 align:middle
良いですね)

00:25:26.960 --> 00:25:28.940 align:middle
テストしたいことは

00:25:29.107 --> 00:25:33.820 align:middle
2 D20 + 3 D5

00:25:34.000 --> 00:25:38.570 align:middle
いや、3 D6 にしましょう。
（問題を複雑にしないようにしましょう）

00:25:38.737 --> 00:25:42.050 align:middle
いくつあるでしょうか？

00:25:43.160 --> 00:25:46.770 align:middle
diceNumber は 5 のはずです。

00:25:48.180 --> 00:25:52.270 align:middle
ここで、+ 演算子を定義しなければなりませんね。

00:25:52.870 --> 00:25:55.520 align:middle
Pharo では、+ は演算子ではありません。
単なるメッセージです。

00:25:55.687 --> 00:25:59.230 align:middle
なので DiceHandle クラスにメッセージを定義します。

00:26:00.530 --> 00:26:02.850 align:middle
+ と書きます。

00:26:04.650 --> 00:26:05.520 align:middle
で、 aDiceHandle です。

00:26:07.530 --> 00:26:09.410 align:middle
ここで考えてみましょう。

00:26:09.577 --> 00:26:11.770 align:middle
レシーバー（ハンドル）を書き変える方法と

00:26:11.937 --> 00:26:12.840 align:middle
関数的な方法があります。

00:26:13.130 --> 00:26:14.740 align:middle
関数的な方法のほうが好みです。

00:26:14.907 --> 00:26:17.470 align:middle
関数的な方法では新しいハンドルを作ります。

00:26:20.180 --> 00:26:23.690 align:middle
そこで新しいハンドルを作ります。

00:26:26.060 --> 00:26:27.650 align:middle
handle := self class new

00:26:29.540 --> 00:26:34.060 align:middle
ここでは DiceHandle と書くのを避けました。

00:26:34.227 --> 00:26:36.360 align:middle
後でその理由を説明するレッスンがあります。

00:26:36.527 --> 00:26:37.770 align:middle
それほど先ではありません。

00:26:37.937 --> 00:26:39.800 align:middle
一般的に、クラス名をハードコードすべきではない
ということです。

00:26:40.430 --> 00:26:42.530 align:middle
第7週かその辺りで

00:26:42.697 --> 00:26:44.040 align:middle
きちんと説明します。

00:26:44.740 --> 00:26:49.660 align:middle
self dice do:
とすると

00:26:49.827 --> 00:26:53.480 align:middle
自分が持つダイスを列挙します。
そしてそれをハンドルに加えていきます。

00:26:53.647 --> 00:26:55.610 align:middle
handle addDie: each

00:26:59.780 --> 00:27:03.660 align:middle
そして同じことをします。

00:27:03.827 --> 00:27:05.720 align:middle
こちらでは self ではなく…

00:27:05.887 --> 00:27:07.420 align:middle
ああ、このメッセージはわかりませんね。
システムがそう言っています。

00:27:07.587 --> 00:27:09.370 align:middle
それで気付いたのですが
まだ定義していません。

00:27:09.820 --> 00:27:12.790 align:middle
なので diceHandle にも動かないわけですが

00:27:15.630 --> 00:27:20.480 align:middle
とりあえず、まずはコンパイルしてしまって
後で直しましょう。

00:27:21.230 --> 00:27:22.450 align:middle
どういうことかというと

00:27:22.617 --> 00:27:24.790 align:middle
アクセサーが足りません。diceです。

00:27:25.280 --> 00:27:28.770 align:middle
なのでここで dice を書きましょう。

00:27:28.937 --> 00:27:32.060 align:middle
dice は
自分のダイスのコレクションを返します。

00:27:32.227 --> 00:27:35.280 align:middle
これでテストしてみます。

00:27:35.700 --> 00:27:38.690 align:middle
テストは大丈夫です。素晴らしい。
完成が近いということです。

00:27:38.857 --> 00:27:43.610 align:middle
保存します。
ハンドル同士の足し算

00:27:44.810 --> 00:27:46.690 align:middle
はい、オッケーです。

00:27:49.820 --> 00:27:53.770 align:middle
つまりこれで

00:27:57.300 --> 00:28:02.210 align:middle
2 D4 と書いて

00:28:02.377 --> 00:28:06.380 align:middle
roll つまり振ることができます。
そして数が返ってきます。

00:28:08.000 --> 00:28:10.400 align:middle
さあ、これでダンジョンズ＆ドラゴンズを
プレーすることができます。

00:28:11.200 --> 00:28:15.870 align:middle
ここまでやったことは

00:28:17.570 --> 00:28:19.480 align:middle
メソッドを書いて
テストを書いて

00:28:19.647 --> 00:28:23.010 align:middle
テストを走らせて
システムクラスを拡張しました。

00:28:23.177 --> 00:28:27.000 align:middle
Integerクラスにこのパッケージにリンクした
拡張をつけることで

00:28:27.167 --> 00:28:30.590 align:middle
このパッケージがロードされた時のみ
見えます。

00:28:32.290 --> 00:28:34.580 align:middle
そして演算子のオーバーロードもしました。

00:28:34.747 --> 00:28:39.320 align:middle
実際には単に + メッセージの
新しい定義をしただけです。

00:28:39.487 --> 00:28:43.600 align:middle
Pharo では足し算は単なるメッセージなので。

00:28:43.767 --> 00:28:48.160 align:middle
これによって良い感じのDSLで
記述できるようになりました。

00:28:49.900 --> 00:28:50.850 align:middle
さあ、あなたがコードを書く番です！

 align:middle


