はじめてのMorphicチュートリアル(第5回)「メソッドの登録」

前回はモーフを拡張したMyMorphクラスを作成した。実際には何も機能は追加せず設定も変えなかったため、元のモーフと(見た目は)全く同じである。
今回はMyMorphに変更を加え、元のモーフとは異なる大きさに変化させる。
Morphを生成すると、幅が50ピクセル、高さが40ピクセルの青で塗りつぶされた長方形が表示される。これを縦横16ピクセルの正方形に変えよう。
第2回のように、生成したモーフに後から設定を行って大きさを変えることは可能だが、モーフを生成した時点からそのような大きさにする場合、初期化のプロセスを修正する必要がある。モーフ(に限らずどのオブジェクトも)は生成の途中で、自分に対してinitializeメッセージを送る。(Behaviorクラスのnewで定義されている)
そのため、初期化を担うinitializeメソッドに修正を加えたいのだがモーフ全体が変わってしまうと困るので、MyMorphに新たにinitializeメソッドを追加して対応する。
initializeメソッドを追加するには、ワールドメニューからSystem Browserを起動する。System Browserで前回のMyMorphクラスを探すのだが、手っ取り早く見つけるために左上の小さな入力欄にクラスカテゴリの一部を入力する。
設定したクラスカテゴリは’Hajimeteno Morphic Tutorial’だったので、入力欄に haji と入力するとそのクラスカテゴリが現れる。クラスカテゴリ一覧から’Hajimeteno Morphic Tutorial’を選ぶと、上段の左から2番目のペインにMyMorphが現れる。これは、選んだクラスカテゴリに属するクラスの一覧である。クラスペインからMyMorphを選ぶと、その右のペインにno messagesが現れる。上段の右から2番目のペインには、選択したクラスのプロトコルの一覧が現れる。プロトコルとは、これから説明するメソッドの分類を表したものである。ここまでの操作を行い、プロトコルペインでno messagesを選ぶと以下のような画面が表示される。
MyMorphクラス
コードペインには以下のようなテキストが選択された状態になっている。

messageSelectorAndArgumentNames
    "comment stating purpose of message"
    | temporary variable names |
    statements

これはメソッドのテンプレートである。メソッドとはオブジェクトがメッセージを受け取った際、オブジェクトがどんな動作を行うかを定義したものである。メソッドは、オブジェクトが属するクラスに登録することで定義する。上のテンプレートが登録の形式を示している。
1行目は受け取るメッセージを記述する。
2行目にはメソッドのコメントを記述する。コメントの記述は省略することができる。なお、Smalltalkではコメントの両端をダブルクオーテーション(”)で囲む。
3行目にはメソッド内で使用する一時変数を記述する。Smalltalkではメソッド内で利用する一時変数は必ず宣言しておく必要がある。複数の一時変数はスペースで区切り、全体をバーティカルバー(|)で囲む。一時変数を使用しない場合は、2本のバーティカルバーだけを残すこともできるし、それ自体の記述を省略することもできる。
4行目以降にメソッドの内容を記述していくことになる。メソッドの内容を省略することも可能で、その場合はメッセージを受け取っても何もしないことになる。
Smalltalkでは、3種類のメッセージの形式があるのだが、ここでは単項メッセージとよばれる形式のメソッドの書き方だけを学ぼう。先ほど作成しようとしたinitializeメッセージが単項メッセージにあたり、オブジェクトに最も単純なメッセージを送ることができる。先ほどのメソッドテンプレートを書き換えて、以下のように入力する。

initialize
    super initialize.
    self extent: 16@16

入力が完了した時点で赤く表示される部分があれば何か問題があるので入力内容をチェックする。問題なさそうであれば、右クリックでAcceptを選ぶか、Command-S(Alt-S)を押す。すると以下のような画面が現れる。
署名ダイアログ
これはコードを登録した人を記録するためのダイアログウィンドウである。適当な名前やイニシャルを入力してOKを押すと、次回からは表示されなくなる。
さて、メソッドを追加したMyMorphを試したいのだが、今の時点でたくさんの青い四角が画面に溢れているだろう。これらのモーフを削除するには、ShiftとOptionを押した状態でモーフをクリックする。モーフの周囲にたくさんのボタン(Haloと呼ばれる)が現れたら×印のボタンを押してモーフを削除する。
Halo
画面が奇麗になったところで、Playgroundを使って以下のように入力する。

MyMorph new openInWorld.

画面の左上に小さなモーフが表示されるのがわかるだろう。
今回は長くなったのでここまでとし、次回は登録したメソッドの内容について学び、更に追加を行う。
(第5回おわり)