







第17回
■
■SqueakではじめるSmalltalk入門 第17回
■
本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。前回は、a BankAccountのインスタンス変数balanceへの外部からのアクセス手段、#balance、#balance:を定義しました。引き続き、出納機能を追加してゆきます。
クラスBankAccountに属するインスタンス(a BankAccount)は、たとえば「deposit: 100」というメッセージを受けて、インスタンス変数balanceに、パラメータである100を加算する挙動を示すことが期待されます。depositは預金という意味です。これを素直に書き下ろすと、メソッド定義は次のようになります。
deposit: aNumber
balance _ balance + aNumber
また、前回定義したアクセッサ、#balance、#balance:を使って、このように表現することも可能です。
deposit: aNumber
self balance: self balance + aNumber
念のため。このメソッド本体の式(二行目)で、二項メッセージ「+ aNumber」は、単項メッセージ「balance」の送信の結果(返値の数値)に対して送信されます。また、二項メッセージ「+ aNumber」は、キーワードメッセージ「balance: …」より優先されるので、この式は、
self balance: ((self balance) + aNumber)
のように解釈されることは、もう大丈夫ですね。
話を戻しましょう。この2つの書き方、つまりアクセッサを“使わない”(前者)、または“使う”(後者)には、少なくとも現時点では違いはなく、同じ挙動を示します。パフォーマンスや読み下し易さの点では前者が、再利用性では後者が有利です。どちらを使っても良いのですが、クラス内で方針を統一することが大切です。ここではこの先、クラス継承を利用した差分プログラミングの話に繋げることを念頭に置いて、後者を選択することにします。
メソッド#deposit:を定義するにあたり、カテゴリを新設しましょう。カテゴリ名は「accounting」にします。ここまで特化されたメソッドを、どのカテゴリに分類するかについて、もはやお手本になるクラスをシステムから探すことは(不可能、あるいはまったくの無駄ではないにせよ)難しいので、カテゴリ名の付け方は、このクラス定義を初めてブラウズする人の分かりやすさに対して最低限の配慮があれば、自由にしてよいと思います。
カテゴリを新設するには、メソッドカテゴリペイン(メッセージカテゴリペイン、プロトコルペイン、とも言う。ブラウザ上段右から2番目のペイン)の黄ボタンメニューからnew category...を選びます。
[fig.A]メソッドカテゴリペイン、黄ボタンメニューのnew category...

候補がポップアップメニューとして提示されますが、差分プログラミングをしているとき以外は、あまり役に立たないので、素直にnew...を選びます。すると、fill in the blankが現われるので「accounting」とタイプして入力し、accept(Acceptボタンのクリックか、cmd+Sをタイプ)します。acceptと同時に、メソッドカテゴリペインには新設のaccountingカテゴリが追加され、選択状態になります。同時にコードペインには、このカテゴリに属するメソッドをただちに定義可能なように、くだんのメソッド定義テンプレートが表示され、選択状態になるはずです。
[fig.B]追加されたaccountingカテゴリ

マウスポインタをコードペインに合わせ、deleteキーでメソッドテンプレートを消去したのち、#deposit:の定義(上の後者)をタイプして入力、あるいは、このメールからコピー・ペーストしてください。同じペインのシフト黄ボタンメニュー(shiftキーを押しながら黄ボタンメニュー呼び出し、あるいは、黄ボタンメニューからmore...を選択)からpretty printを選択してコードのスタイルを整え、accept(cmd+S)します。
[fig.C]#deposit:の定義

これで、a BankAccountは「deposit: …」メッセージを受け取ることができるようになります。すでに何度か利用しているa BankAccountを束縛したインスペクタの作業用ペイン(一番下のペイン)で、次の式をタイプして入力してからdo it(cmd+D)してみてください。
self deposit: 100
[fig.D]a BankAccount への「deposit: 100」メッセージの送信

評価の結果、インスタンス変数balanceの値が100だけ増加すれば、機能は正常です。.
このページを編集 (3697 bytes)
 |
以下の 1 ページから参照されています。 |
This page has been visited 974 times.