vieweditattachhistorytopchangessearchhelp

第15回


■SqueakではじめるSmalltalk入門   第15回


 本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回からしばらく、オブジェクト指向プログラミングにおける、“Hello World!”的存在とも言える「銀行口座」の例に取り組んでみましょう。

 銀行口座(bank account)と言っても、出納と残高管理だけの財布のような簡単なオブジェクトを想定します。このオブジェクトはBankAccountというクラスのインスタンス(a BankAccount)で、残高(balance)というただひとつのインスタンス変数を持ちます。このインスタンス変数balanceと同名の、balance: x、balanceというメッセージで、残高の設定と内容の呼び出しが可能です。また、出納はそれぞれ、withdraw: x、deposit: x(xは任意の金額)というメッセージを送信することで行ない、払い戻しの際、残高は負にならないことにします。

 このa BankAccountとのメッセージのやりとりを想像すると、こんな具合になるでしょうか。

| account |
World findATranscript: nil.             "transcriptを開く"
account _ BankAccount new.              "a BankAccount作成"
account balance: 1000.                  "1000円預金"
Transcript cr; show: account balance.   "残高照会 => 1000 "
account withdraw: 600.                  "600円払戻"
Transcript cr; show: account balance.   "残高照会 => 400 "
account deposit: 60.                    "60円預入"
Transcript cr; show: account balance.   "残高照会 => 460 "
account withdraw: 700.                  "700円払戻"
Transcript cr; show: account balance.   "残高照会 => 0 "


 ではまず、クラスを定義します。作業場を整えるために、デスクトップを新調します。左下のNavigatorと書かれたタブをクリックして、NEWボタンをクリックします。小さなウインドウが現われたら、中央付近をクリックして中に入ります。新しいデスクトップが現われたら、デスクトップメニューからopen... → workspaceでワークスペースを開き、そこで、

(FileStream fileNamed: 'BankAccount.txt') edit


などとタイプした後、do it (cmd+D)して作業用のテキストファイルエディタを開いておきます。ここにタイプした内容はaccept (cmd+S) → overwrite that fileでBankAccount.txtというファイルに保存できます。

 机上の整理が付いたら、あらためて、デスクトップメニューからopen... →browser でブラウザを開きます。まず、これから作るクラスを分類するための新しい、カテゴリを設けましょう。クラスカテゴリペイン(左上のペイン)で黄ボタンクリック(ワンボタンマウスならoption-クリック、2ボタンなら右、ホイール付きを含め3ボタンなら中ボタンをクリック)して、黄ボタンメニューを出し、add item...を選びます。

[fig.A]クラスカテゴリペインの黄ボタンメニュー
Uploaded Image: 15a.png

 入力ボックス(fill in the blank)が現われるので、Category-MosaDenなどとしてaccept (cmd+S)します。するとクラスカテゴリペインに追加したカテゴリが現われ(確認するにはスクロールする必要があります)、また、コードペイン(下のペイン)にはクラスを新規作成するためのテンプレートが現われます。

Object subclass: #NameOfSubclass
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
  category: 'Category-MosaDen'


[fig.B]追加されたクラスカテゴリと新規クラス作成用のテンプレート
Uploaded Image: 15b.png

 subclass: の直後、#NameOfSubclassと書かれた場所を、#BankAccountと書き換えます。テキスト編集の作法はMacのそれとよく似ているので問題はないはずです。ダブルクリック【註】で「NameOfSubclass」を選択状態にして「BankAccount」とタイプして入力するのがよいでしょう。続けて、instanceVariableNames: に続くシングルクオートの中にキャレットを移動し、インスタンス変数である「balance」とタイプします。スペルを確認したら、accept (cmd+S)して決定します。


【註】まるでダブルクリックで単語が選択されているように見えますが、実は、Squeakシステムは、Macと異なり、ダブルクリックによる単語の選択という概念がありません。NameOfSubclass内のキャレットを(移動させないようにして)クリックする、という操作によりテキストが選択されています。なお、クリックするキャレットが置かれた位置により、単語選択、括弧/引用符内文字列選択、段落選択、全文選択と振る舞いが変わるのが特徴です。

Object subclass: #BankAccount
  instanceVariableNames: 'balance'
  classVariableNames: ''
  poolDictionaries: ''
  category: 'Category-MosaDen'


 実はこのテンプレート、Objectというクラスへのメッセージ送信式になっています。余計な改行を省くと、subclass: #BankAccount instanceVariableNames: 'balance' classVariableNames: ''poolDictionaries: '' category: 'Category-MosaDen'という5つのパラメータ(引数)を持つ長〜いメッセージであることが分かります。Objectクラスに対して、BankAccountという名前の、balanceというインスタンス変数を持つクラスを、自らのサブクラスとしてCategory-MosaDenというカテゴリに作りなさい(すでにある場合は再定義しなさい)…と言っているわけです。3番目と4番目のパラメータ(クラス変数とプール辞書)は大域変数を宣言するためのものですが、普段は使わないので当面は無視してかまいません。

 とりあえずBankAccountというクラスを作ることができましたので、そのインスタンスを作ってインスペクトしてみましょう。インスタンスを作るにはクラスにnewというメッセージを送信します。次の式を適当な場所に入力後、選択してinspect it (cmd+I)してください。

BankAccount new


[fig.C]インスペクトされたBankAccountのインスタンス
Uploaded Image: 15c.png

 インスペクタ左側のリストには、balanceというインスタンス変数が確認できるはずです。クリックすると、nilが束縛されていることが分かります。Smalltalkでは、未定義の変数には常にnilが束縛されています。このことを頭の片隅に置いておいてください。

 ここでいったん、作業状態を凍結しておきます。デスクトップメニューからsave as new versionを選び、スナップショットをとっておきましょう。次回の作業の続きは、今作成した仮想イメージファイル「Squeak3.6-nnnn-full.1.image」を仮想マシンにドロップインして起動するシステムを使ってください。次回はメソッドを定義します。

このページを編集 (5573 bytes)


Congratulations! 以下の 1 ページから参照されています。

This page has been visited 1125 times.