vieweditattachhistorytopchangessearchhelp

第14回


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


 本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、通常は許されない直接的な操作をインスペクタを介してオブジェクトに加えてみたり、システムブラウザで定義を変えてしまい、そのとき、オブジェクトがどのように振る舞うのかをインスペクタで観察してみましょう。

 前回おさらいで、(3/4)のインスペクタを起動してください。次の式、

(3/4) inspect


をdo it (cmd+D)するか、3/4部分を選択してinpect it (cmd+I)します。

[fig.A](3/4)のインスペクト結果
Uploaded Image: 14a.png

 まず、分母(denominator)を4から5に変えてみます。まず、denominatorを左ペインで選択し、右手のペインに4が現われることを確認します。

[fig.B]denominatorの現在値
Uploaded Image: 14b.png

 4を選択して、5とタイプして置き換え、accept (cmd+S)します。acceptは右側のペインの黄ボタンメニューにもあります。

[fig.C]denominatorを5に変えてaccept
Uploaded Image: 14c.png

 selfをクリックして選択し、(3/4)が(3/5)に変化したことを確認します。タイトルは動的に更新されないので、食い違っていますね。

[fig.D]selfで(3/5)になったことを確認
Uploaded Image: 14d.png

 下のワークスペースでself + (1/5)をprint it (cmd+P)してみましょう。結果は、(4/5)になり、最初(3/4)だったオブジェクトが今は(3/5)として振る舞っているのを確認できるはずです。

self + (1/5)   "=> (4/5) "


[fig.E]self + (1/5)のprint it
Uploaded Image: 14e.png

 整数に限らず、3.0などの浮動小数点少数(a Float)や、'squeak'といった文字列(a String)さえ束縛可能なので、(3.0/5)だとか('squeak'/5)といったあり得ない分数ができてしまいます。このようなインスペクタを介した、インスタンス変数への本来想定されないオブジェクトの束縛は、オブジェクトに対する紛れもない悪意ある“破壊”行為であり、以後の正常な振る舞いは期待できなくなるので注意してください。

 Smalltalkのオブジェクトの振る舞いを知るために、さらに危険な行為も試してみましょう。(3/4)、いや、かつて(3/4)だったオブジェクトのインスペクタの、右側のペインにあるselfをクリックして選択し、browse it (cmd+B)してください。すると、このオブジェクトが属するクラスを選択した状態でシステムブラウザが起動します。

 クラスを選択した直後、システムブラウザは下のペイン(コードペイン。通常は選択したメソッドのコードが表示される)に、クラスの定義内容が呼び出されます。

Number subclass: #Fraction
  instanceVariableNames: 'numerator denominator '
  classVariableNames: ''
  poolDictionaries: ''
  category: 'Kernel-Numbers'


 細かなことは後回しにして、ここはとりあえず、二行目の「instanceVariableNames:」に続く文字列リテラル(' 'で括られている)の中を眺めてください。スペースで区切って列挙されているのが、a Fractionが持つインスタンス変数の一覧です。ブラウズ中のクラスがFractionなら、numeratorとdenominatorを見つけられるでしょう。では、ここに、tempという文字列を追加しaccept (cmd+S)してみてください。

[fig.F]Fractionのインスタンスへのインスタンス変数tempの追加
Uploaded Image: 14f.png

 コンパイルが行なわれ、Fractionの定義が更新されます。このとき、かつて(3/4)だったインスペクト中のオブジェクトのインスペクタの中身(左側のペインのインスタンス変数のリスト)には、tempが追加されるはずです。

[fig.G]かつて(3/4)だったオブジェクトに追加されたtemp
Uploaded Image: 14g.png

 以上のように、Smalltalkでは、クラス定義の変更を随時行なうことができ、変更の結果は、それ以降生じるインスタンスはもちろん、システム内に既存の全インスタンスにも即座に反映されます。基本クラスに手を加えるという、いささか常軌を逸した例ではありましたが、こうしたクラス定義変更に伴うオブジェクトの動的な振る舞いを観察する際にも、インスペクタはその威力を発揮してくれることはお分かりいただけたと思います。

なお、このままシステムを保存してしまうと次回Squeakシステム起動時にも今回の変更が反映されて、面倒なことになりかねないので、終了の際にはsaveはせず、quit → Noか、OS Xの用意したメニューからQuit do not saveを選ぶようにしてください。

 インスペクタの機能の紹介を兼ねて、Squeak システムにおけるオブジェクトの驚くべき柔軟性を垣間見ていただいたところで、次回から、このインスペクタとブラウザを使った非常に小規模なクラスプログラミングの手順を紹介したいと思います。

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


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

This page has been visited 996 times.