1 00:00:00,160 --> 00:00:03,400 このセッションでは Pharo のオブジェクトモデルを見ましょう。 2 00:00:03,560 --> 00:00:08,600 外観から、そのエレガントさとシンプルさを 見てみます。 3 00:00:08,760 --> 00:00:11,280 今はまだ全てを理解する必要はありません。 4 00:00:11,440 --> 00:00:15,840 続く数週でこれらの概念を見ていきます。 5 00:00:17,120 --> 00:00:20,400 Pharo にはオブジェクトとメッセージ しかありません。 6 00:00:20,560 --> 00:00:22,360 オブジェクトがたくさんあり 7 00:00:22,520 --> 00:00:27,240 マウスポインタや真偽値や配列や 8 00:00:27,400 --> 00:00:31,520 数値や文字列やウィンドウやスクロールバー 等々を表現します。 9 00:00:31,680 --> 00:00:33,160 コンパイラーでさえ 10 00:00:33,320 --> 00:00:38,360 ソケットやフォントやコレクションのような システムのオブジェクトであっても 11 00:00:38,520 --> 00:00:40,360 これらは皆、オブジェクトで 12 00:00:40,520 --> 00:00:42,720 それらにメッセージを送ることができます。 13 00:00:42,880 --> 00:00:45,240 沢山の異なるメッセージがあります。 14 00:00:45,400 --> 00:00:49,240 コレクションに size を送って その大きさを得ることができます。 15 00:00:49,400 --> 00:00:52,560 + や at:put: や do: などの メッセージがあります。 16 00:00:52,720 --> 00:00:55,280 オブジェクトとメッセージ。 17 00:00:55,760 --> 00:00:58,920 メッセージはプログラマーの意図を示します。 18 00:00:59,080 --> 00:01:02,840 オブジェクトにメッセージを送るというのは そのオブジェクトに何かをするように頼むことです。 19 00:01:03,000 --> 00:01:06,720 オブジェクトへの依頼なのです。 20 00:01:06,880 --> 00:01:10,440 そしてオブジェクトがどのメソッドを使うかを 決定します。 21 00:01:10,600 --> 00:01:14,440 こうして どんな方法を用いるかを決めることで 22 00:01:14,600 --> 00:01:17,200 プログラマの意図を達成します。 23 00:01:17,880 --> 00:01:22,480 次の概念はクロージャです。 24 00:01:22,720 --> 00:01:25,440 レキシカルクロージャやブロックという 25 00:01:25,600 --> 00:01:29,240 Pharo でのある種の匿名メソッドです。 26 00:01:29,400 --> 00:01:32,720 我々はブロックと呼びます。 これは重要な用語です。 27 00:01:33,400 --> 00:01:37,960 ここにある通り ブロックは角括弧で区切られています。 28 00:01:38,120 --> 00:01:40,280 これ全体が1つのブロックです。 29 00:01:40,440 --> 00:01:44,720 これを匿名メソッドとして見てください。 30 00:01:46,200 --> 00:01:50,200 Pharo での とてもシンプルで統一的なモデルです。 31 00:01:50,520 --> 00:01:53,400 全てのものはオブジェクトであり クラスのインスタンスであり 32 00:01:53,560 --> 00:01:56,760 クラスやメッセージさえもオブジェクトで 33 00:01:57,160 --> 00:02:01,440 そしてオブジェクト間の全ての計算は メッセージ送信を介して行われます。 34 00:02:01,600 --> 00:02:04,440 メッセージを送るという言い方が 35 00:02:04,600 --> 00:02:08,000 正しい用語です。 メソッドの実行ではありません。 36 00:02:08,160 --> 00:02:11,120 なぜなら メッセージをオブジェクトに送ると 37 00:02:11,280 --> 00:02:15,240 メソッド探索と呼ばれるアルゴリズムがあり 38 00:02:15,400 --> 00:02:17,120 そのアルゴリズムが 39 00:02:17,280 --> 00:02:19,760 使うべき正しいメソッドを選択します。 40 00:02:19,920 --> 00:02:24,880 メソッドは仮想的に束縛されています。 41 00:02:25,200 --> 00:02:28,280 それらは遅延束縛をします。 42 00:02:28,560 --> 00:02:31,200 私がオブジェクトにメッセージを送り 43 00:02:31,360 --> 00:02:34,360 メソッド探索が正しいメソッドを選択する。 44 00:02:34,520 --> 00:02:37,880 あとでこの話題のためのセッションがあるので その時にまたお話します。 45 00:02:40,160 --> 00:02:42,960 Pharo のオブジェクトモデルは次の通りです。 46 00:02:43,120 --> 00:02:45,360 インスタンス変数は protected です。 47 00:02:45,520 --> 00:02:48,520 全てのオブジェクトはインスタンス変数を持ち インスタンス変数は protected です。 48 00:02:48,680 --> 00:02:50,880 インスタンス変数はオブジェクト単位でprivateで 49 00:02:51,040 --> 00:02:55,080 サブクラスからアクセス可能です。 50 00:02:56,240 --> 00:02:59,000 メソッドは public で virtual です。 51 00:02:59,160 --> 00:03:02,280 Pharo では全てのメソッドは public です。 52 00:03:02,720 --> 00:03:05,560 そして Pharo はクラス間に単一継承があります。 53 00:03:05,720 --> 00:03:08,120 1 つのクラスは 1 つのスーパークラスを持っています。 54 00:03:09,560 --> 00:03:14,280 ここにコード例があります。 2 点間の外積(cross product)です。 55 00:03:14,440 --> 00:03:16,480 point1 と point2 があり 56 00:03:16,640 --> 00:03:21,600 point1 の x と point2 の y を掛けます。 57 00:03:21,760 --> 00:03:23,960 そしてそこから 58 00:03:24,120 --> 00:03:27,760 point1 の y と point2 の x の積 を引きます。 59 00:03:28,120 --> 00:03:32,600 Pharo でできる計算の例です。 60 00:03:34,560 --> 00:03:38,080 オブジェクトを生成するには 特別なメッセージがあります。 61 00:03:38,240 --> 00:03:39,480 ここに例があります。 62 00:03:39,640 --> 00:03:44,160 「@」メッセージを 整数 10 に 63 00:03:44,320 --> 00:03:46,680 引数 20 をつけて送ると 64 00:03:46,840 --> 00:03:50,240 点を生成します。 Point クラスのインスタンスです。 65 00:03:50,400 --> 00:03:53,320 メッセージの名前は @ です。 66 00:03:53,480 --> 00:03:57,640 そのメッセージを受け取る整数は 10 です。 67 00:03:57,800 --> 00:04:00,200 メッセージ名の前にあるものです。 68 00:04:00,360 --> 00:04:03,840 そして引数はメッセージ名の後にあります。 20 です。 69 00:04:04,000 --> 00:04:06,040 ここにもう 1 つ例があります。 70 00:04:06,200 --> 00:04:10,880 ここにあるような文字列を 作りたいとします。 71 00:04:11,040 --> 00:04:13,200 この文字列はどうやって得られるのでしょう? 72 00:04:13,360 --> 00:04:16,480 最初の部分「Pharo」があり 73 00:04:16,640 --> 00:04:19,800 それに「,」メッセージを送ります。 74 00:04:19,960 --> 00:04:24,120 引数として文字列「is Cool」を 75 00:04:24,360 --> 00:04:26,280 ここで与えます。いいですか? 76 00:04:28,160 --> 00:04:31,880 「,」メッセージの意味は文字列の連結です。 77 00:04:32,040 --> 00:04:35,640 2 つの文字列が繋げられて 1 つの文字列を生成します。 78 00:04:37,000 --> 00:04:40,560 new メッセージで直接 79 00:04:40,720 --> 00:04:42,240 オブジェクトを作ることができます。 80 00:04:42,400 --> 00:04:47,200 Monster クラスに new を送ると そのクラスのインスタンスが得られます。 81 00:04:47,360 --> 00:04:49,000 「aMonster」と表記します。 82 00:04:49,160 --> 00:04:52,640 Array(配列)クラスのインスタンスを 83 00:04:52,840 --> 00:04:54,360 new: メッセージで作ることができます。 84 00:04:54,520 --> 00:04:57,400 引数がくることを「:」が表しています。 85 00:04:57,560 --> 00:04:59,520 そしてここに整数 6 がきます。 86 00:04:59,680 --> 00:05:02,400 すると大きさ 6 の配列が得られます。 87 00:05:03,000 --> 00:05:05,960 オブジェクトを生成する専用のメッセージがあり 88 00:05:06,120 --> 00:05:09,040 クラスに自分のメッセージを定義することができます。 89 00:05:09,200 --> 00:05:11,360 Tomagoshi クラスに 90 00:05:11,520 --> 00:05:14,080 withHunger: メソッドを定義できます。 91 00:05:14,240 --> 00:05:17,800 そしてこのメソッドに整数 10 を与えます。 92 00:05:17,960 --> 00:05:20,880 これで Tomagoshi クラスのインスタンスを 93 00:05:21,040 --> 00:05:22,800 属性値付きで生成できます。 94 00:05:23,320 --> 00:05:27,520 オブジェクト生成に特化したメッセージです。 95 00:05:28,880 --> 00:05:33,880 この講義では、Pharo のオブジェクトモデルの 外観を見てきました。 96 00:05:34,040 --> 00:05:37,880 全てを理解する必要はありません。 これらの概念はまた後でやります。 97 00:05:38,040 --> 00:05:41,760 しかし Pharo にはコンストラクターや 98 00:05:41,920 --> 00:05:45,320 静的(static)メソッドや 型宣言やインターフェイスや 99 00:05:45,480 --> 00:05:48,040 パッケージ、private、protected修飾子がない ということを覚えておくことは重要です。 100 00:05:48,200 --> 00:05:51,600 他のオブジェクト指向言語でよくある こういった古典的な修飾子はないのです。 101 00:05:51,760 --> 00:05:56,040 パラメトリックな型やボクシングや アンボクシングなどもありません。 102 00:05:56,200 --> 00:05:59,280 そして、Pharo が本当に強力な言語だと いうことがわかるでしょう。 103 00:06:00,720 --> 00:06:04,120 つまり、Pharo では 全てのものがオブジェクトなのです。 104 00:06:04,280 --> 00:06:07,200 計算はオブジェクトに送られた メッセージによって実行されます。 105 00:06:07,360 --> 00:06:12,080 メソッドは遅延束縛されます。 106 00:06:12,240 --> 00:06:14,640 メソッド探索というアルゴリズムがあり 107 00:06:14,800 --> 00:06:18,680 オブジェクトがメッセージを受け取った時に 正しいメソッドを選択します。 108 00:06:18,960 --> 00:06:22,640 ブロックという概念があります。 匿名メソッドです。 109 00:06:22,800 --> 00:06:25,000 Pharo ではとても重要なものです。 110 00:06:25,160 --> 00:06:30,040 そして、クラスに特定のメッセージを 送ることによって 111 00:06:30,200 --> 00:06:31,800 オブジェクトを生成します。