







第16回
■
■SqueakではじめるSmalltalk入門 第16回
■
本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、前回作成したBankAccountクラスにメソッドを追加してゆきます。
作業状態を凍結した仮想イメージを使ってシステムを起動します。ちょうどインスペクトした状態にあるa BankAccountに、無駄とは承知でbalance: 1000という“彼”の知らないメッセージを送って反応を見てみることにします。インスペクタのワークスペース(下のペイン)で、
self balance: 1000
とタイプして入力し、do it (cmd+D)してみてください。
[fig.A]とりあえずメッセージを送ってみる

まず、コンパイラがスペルミスを犯していないかとお節介を焼いてくれます。
[fig.B]コンパイラが起動するスペルチェッカ

いや、そんなことはない、という意思表示を込めて、項目の先頭にあるbalance:を選択しましょう。コンパイルは通りますが、実際のメッセージ送信の結果、a BankAccountは#balance:というセレクタからなるメッセージを受け付けられないとノーティファイア(ピンクの横長のウインドウ)を出します。
[fig.C]メッセージに応答できないことを示すノーティファイア

では、a BankAccountが、このメッセージを理解できるようにBankAccountクラスに改めて#balance:メソッドを定義することにします。ブラウザをクリックしてアクティベートし、メッセージカテゴリペイン(上段右から2番目)のno messagesをクリックして選択します。すると、コードペインにメソッド記述のためのテンプレートが現われます。マウスポインタをコードペインに移動するとテンプレートは選択されていることが分かるので、キーボードのdeleteキーを使って消してしまってください。
[fig.D]メソッド記述のためのテンプレート

うまく消えたら(消えないときは、マウスポインタの位置を確認してください。コードペインの区画を指していますか?)次のコードをタイプしてシフト黄ボタンメニュー(コードペインをshift + optionクリック、あるいは、黄ボタンメニューからmore...)からpretty printを選択してフォーマットを整えた後、accept (cmd+S)します。
balance: aNumber
balance _ aNumber
[fig.E]シフト黄ボタンメニューのpretty print

1行目の太字になっている行は「メッセージパターン」と呼ばれるもので、セレクタ(メソッド名)と、メッセージ送信時に添えられたパラメータ(引数)を束縛するための「パラメータ変数」の宣言文を兼ねます。コード本体は2行目以降(この場合、2行目のみ)です。インスタンス変数balanceに、パラメータ引数xの値を代入する簡単なコードであることは、一目でお分かりいただけると思います。
acceptと同時にあなたのイニシャルを要求するfill in the blankが現われることがあります。これは、メソッドごとに誰が作成/改変したかを記録する際に使われます(システムに加えられた改変履歴情報の扱いについては追って解説する予定です)。
適当なイニシャルを入力してacceptすると、ただちにコンパイルが行なわれます。無事、コンパイルが通ると、入力時にあったコードペイン周辺の赤枠が消えます。これで、a BankAccountはbalance: 1000というメッセージを受信できるようになりました。インスペクタのワークスペースで改めて、次式をdo it (cmd+D)してみましょう。インスペクタでbalanceが選択されていれば、その値がnilから1000に変更されるのを確認できるはずです。
[fig.F]インスタンス変数balanceの値が変化したところ

さらに続けて、インスタンス変数balanceの値を取り出すメッセージに応答できるように#balanceメソッドを追加します。Smalltalkでは、たとえオブジェクトがbalanceというインスタンス変数を持っていても、改めてアクセス専用のメソッドを定義しないかぎり(インスペクタなどの特殊な手段を除けば)通常の方法で、同インスタンス変数にはアクセスできません。
手順はおおむね、#balance:のときと同じです。ブラウザの上段右端のペイン(メソッドのリスト)に追加され、現在選択状態にあるbalance:をクリックして選択を解除します。すると、balance:の定義前のように、メソッド記述用のテンプレートがコードペインに現われます。マウスカーソルをコードペインの枠内に移動し、選択状態のテンプレートを削除して次のコードを入力し、pretty printでフォーマットを整えた後、accept (cmd+S)してください。
balance
^ balance
メソッド#balanceを起動するメッセージbalanceは、単項メッセージなので、セレクタ(メソッド名)、メッセージパターンはいずれも同じ「balance」です。当然、メッセージにパラメータは伴わないので、パラメータ変数の宣言も必要ありません。コードは、メソッドの返値を明示的にするための記号である“^”(ハット)にインスタンス変数であるbalanceを続けます。1行目のbalance(メッセージパターン、あるいはセレクタ)と2行目のbalance(インスタンス変数)は字面は同じですが別のものを表わしていることに注意してください。
acceptと同時にコンパイルが行なわれ、メソッドリストペインにbalanceが追加されると、その直後からインスペクタでインスペクト中のa BankAccountもメッセージ「balance」に応答できるようになります。
self balance "=> 1000 "
ところで、今回定義した#balance:や#balanceのように、同名のインスタンス変数にアクセスするためのメソッドは「アクセッサ」と呼ばれ、Smalltalkではaccessingというカテゴリに分類する習わしになっています。そこで、メソッドカテゴリペインの黄ボタンメニューからrename...を選択し、fill in the blankでaccessingと入力してaccept (cmd+S)しておくことにいたしましょう。
[fig.G]as yet unclassifiedカテゴリをrename...

[fig.H]accessingカテゴリに収った2つのアクセッサ

次回も、BankAccountへのメソッド追加を続けます。
このページを編集 (5134 bytes)
 |
以下の 1 ページから参照されています。 |
This page has been visited 996 times.