1 00:00:00,400 --> 00:00:01,800 みなさん、こんにちは。 2 00:00:01,960 --> 00:00:06,120 この講義では Pharo での 3 00:00:06,280 --> 00:00:07,560 クラスとメソッドの定義を説明します。 4 00:00:08,400 --> 00:00:10,920 Pharo に特有なこととして 5 00:00:11,080 --> 00:00:15,360 メソッドやクラスを定義する専用の 構文がない、ということがあります。 6 00:00:15,760 --> 00:00:17,840 クラスやメソッドはツールで定義されます。 7 00:00:18,000 --> 00:00:22,200 ツールがクラスやメソッドを生成する コンテキストを提供します。 8 00:00:23,760 --> 00:00:27,640 これが Pharo で主に使う コードブラウザーです。 9 00:00:27,800 --> 00:00:29,200 Nautilus(ノーチラス)です。 10 00:00:29,360 --> 00:00:32,720 下の部分に 11 00:00:32,880 --> 00:00:35,280 Point クラスの定義があります。 12 00:00:35,440 --> 00:00:40,880 Point クラスのスーパークラスは Object クラスだと解ります。 13 00:00:41,040 --> 00:00:44,080 そしてインスタンス変数として x と y があります。 14 00:00:44,480 --> 00:00:49,480 スーパークラスと 2 つのインスタンス変数 x と y と 15 00:00:51,240 --> 00:00:53,960 一番下にはパッケージ名があります。 16 00:00:54,120 --> 00:00:56,560 このクラスが入っているパッケージです。 17 00:00:56,840 --> 00:01:02,240 これからスライドの中で、新しいサブクラスを 定義する時にこんなコードを使います。 18 00:01:02,680 --> 00:01:05,200 見ての通り Pharo でクラスを生成するには 19 00:01:05,360 --> 00:01:08,200 スーパークラスにそのためのメッセージを 送ります。 20 00:01:08,360 --> 00:01:11,160 サブクラスの名前を引数にして。 21 00:01:12,960 --> 00:01:15,600 subclass:instanceVariableNames: 22 00:01:15,760 --> 00:01:17,560 classVariableNames:package: は 23 00:01:17,720 --> 00:01:20,440 Object クラスに送られる メッセージです。 24 00:01:20,600 --> 00:01:23,480 引数として、サブクラスの名前と 25 00:01:23,640 --> 00:01:26,480 インスタンス変数のリストと 26 00:01:26,640 --> 00:01:29,000 パッケージの名前を付けます。 27 00:01:30,160 --> 00:01:31,800 メソッド定義については 28 00:01:32,080 --> 00:01:35,240 これまた下の部分にありますが 29 00:01:35,760 --> 00:01:37,520 メソッドの名前 30 00:01:37,960 --> 00:01:39,600 コメント 31 00:01:40,400 --> 00:01:42,320 そしてメソッドのコードとなります。 32 00:01:42,480 --> 00:01:44,560 メソッドはクラスに属します。 33 00:01:44,720 --> 00:01:47,360 メソッドを定義する構文では 34 00:01:47,520 --> 00:01:51,960 そのメソッドが属するクラスについての 情報がありません。 35 00:01:52,120 --> 00:01:56,840 実際には コードブラウザでクラスを選択しますが 36 00:01:57,840 --> 00:02:01,720 そのクラスが そのメソッドが属するクラスになります。 37 00:02:04,440 --> 00:02:07,840 スライドの中ではメソッドが属するクラス は必要な情報なので 38 00:02:08,000 --> 00:02:12,520 単純にメソッド定義の中身をコピーする わけにはいきません。 39 00:02:12,680 --> 00:02:15,360 メソッド名の前に接頭辞をつけて 40 00:02:15,520 --> 00:02:19,320 メソッドが属するクラスを示します。 41 00:02:20,280 --> 00:02:21,960 追加するのは 42 00:02:23,960 --> 00:02:27,240 クラスの名前で 43 00:02:27,400 --> 00:02:31,280 定義しているメソッドを追加する 対象となるクラスを示します。 44 00:02:31,520 --> 00:02:33,960 つまり、コードブラウザ上では 45 00:02:34,200 --> 00:02:37,000 クラスはブラウザの中での 46 00:02:37,160 --> 00:02:39,160 選択としてしか出てきません。 47 00:02:40,000 --> 00:02:44,080 Integer クラスの factorial メソッド を定義します。 48 00:02:44,920 --> 00:02:47,760 メッセージについて 思い出して欲しいのですが 49 00:02:48,000 --> 00:02:51,760 factorial メソッドを定義していますが 50 00:02:53,080 --> 00:02:55,840 =, >, *, - 等といった 51 00:02:56,000 --> 00:03:01,800 二項メッセージを使います。 52 00:03:01,960 --> 00:03:04,040 二項メッセージです。 53 00:03:04,200 --> 00:03:09,040 factorial メソッドに再帰します。 54 00:03:09,200 --> 00:03:12,280 factorial は単項メッセージで 55 00:03:12,440 --> 00:03:15,040 数値オブジェクトに送られます。 56 00:03:16,240 --> 00:03:18,600 そしてキーワードメッセージが 2 つあります。 57 00:03:19,680 --> 00:03:23,560 IfTrue: が 2 回でて、 それと error: です。 58 00:03:24,640 --> 00:03:27,120 そして最後にキャレットがあります。 59 00:03:27,280 --> 00:03:29,560 返り値を返して 60 00:03:29,720 --> 00:03:31,520 メソッドから脱出します。 61 00:03:33,000 --> 00:03:35,360 リターンについては 62 00:03:35,520 --> 00:03:37,640 Pharo ではデフォルトで 63 00:03:37,800 --> 00:03:39,560 self を返します。 64 00:03:39,720 --> 00:03:41,480 つまり、現在のオブジェクトです。 65 00:03:42,080 --> 00:03:43,880 上に示したコードは 66 00:03:44,040 --> 00:03:47,080 下に示したコードと全く同じです。 67 00:03:47,240 --> 00:03:51,960 つまり、メソッドの最後にある ^ self はあってもなくても良いです。 68 00:03:52,920 --> 00:03:56,720 クラスにメッセージを送ります。 クラスメソッドです。 69 00:03:56,880 --> 00:03:58,520 クラスもオブジェクトなので 70 00:03:58,680 --> 00:04:01,280 クラスにメッセージを送ることができます。 71 00:04:01,440 --> 00:04:03,840 クラスメソッドを定義するには 72 00:04:04,000 --> 00:04:07,000 Nautilus のクラスボタンを押してから 73 00:04:09,040 --> 00:04:11,920 メソッドを定義してください。 74 00:04:12,160 --> 00:04:16,320 スライドでは class と書くことで 75 00:04:17,880 --> 00:04:22,040 クラス上で実行されるメソッドである ことを示して 76 00:04:22,200 --> 00:04:25,320 クラスのインスタンスで実行される メソッドと区別します。 77 00:04:25,760 --> 00:04:30,440 ここで x:y: メソッドは Point クラス上で実行されます。 78 00:04:30,600 --> 00:04:33,040 Point クラスのインスタンス上では ありません。 79 00:04:33,960 --> 00:04:35,960 この講義で 80 00:04:36,200 --> 00:04:37,840 覚えておくことは 81 00:04:38,640 --> 00:04:41,520 クラスは特別な構文で定義されるのではなく 82 00:04:41,680 --> 00:04:45,480 スーパークラスへのメッセージ送信で 定義されるということ。 83 00:04:46,960 --> 00:04:49,560 クラスはパッケージ内で定義されること。 84 00:04:49,720 --> 00:04:53,600 パッケージ名はそのメッセージの 引数として渡されること。 85 00:04:54,880 --> 00:04:56,720 全てのメソッドは public だということ。 86 00:04:56,880 --> 00:05:01,480 メソッドが public であることを示す キーワードはありません。全てそうだから。 87 00:05:01,640 --> 00:05:05,120 メソッドが protected や private だという概念はありません。 88 00:05:07,240 --> 00:05:10,880 デフォルトでは、メソッドはレシーバ自身 つまり self を返すということ。 89 00:05:11,040 --> 00:05:14,520 self 以外のものを返すためには キャレットを使います。 90 00:05:17,160 --> 00:05:19,880 クラスメソッドは普通のメソッドです。 91 00:05:20,040 --> 00:05:22,320 クラスメソッドを追加するには クラスボタンを押してから 92 00:05:22,480 --> 00:05:24,440 メソッドを作ります。 93 00:05:24,840 --> 00:05:27,840 これで第 1 週の講義はおしまいです。 94 00:05:28,000 --> 00:05:29,400 来週は 95 00:05:29,560 --> 00:05:32,800 Pharo の構文について より細部まで見ていきます。 96 00:05:32,960 --> 00:05:37,480 ブロックや、オブジェクトインスペクター と呼ばれるツールについてです。