vieweditattachhistorytopchangessearchhelp

第51回


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


本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。前回に引き続き、チェンジセットの扱いを取りあげます。

▼チェンジセットへの登録のタイミング
デフォルトの記録先として指定されているチェンジセット(チェンジソーターで選択した時「Changes go to ...」と表示されるチェンジセット。以下、デフォルトのチェンジセット)には、システムに加えられた改変が自動的に登録されてゆきます。これはその都度「登録」されたもので、けっして過去のある時点の状態と今の状態の差分をその都度いちいちチェックしているわけではないことに注意してください。

登録のタイミングは再コンパイル(もしくは新規コンパイル)です。したがって、何も改変を加えなくても再コンパイルすればデフォルトのチェンジセットに登録されてしまいます。たとえば、Integer >> #factorialをブラウズして、これを内容を変更せずに再コンパイルしてデフォルトのチェンジセットがどうなるか確認してみましょう。Integer >> #factorialの定義は、どこか適当な場所(たとえばワークスペースなど)で「factorial」とタイプしてからbrowse it(cmd+B)すると簡単に呼び出すことができます。

[fig.A]Integer >> #factorialの定義
Uploaded Image: 51a.png

  1. factorialの定義を呼び出すことができたら、これを再コンパイル、つまりaccept(cmd+S)すればよいのですが、Macで開いたばかりの文書ファイルの保存ができないのと同様に、Smalltalkシステムでも何らかの変更を加えないとエディタの内容はacceptできないようになっています。試しにaccept(cmd+S、あるいは黄ボタンメニューから「了解」を選択)してみても、コードペインがフラッシュ(瞬間的に白黒反転)して軽い注意を促されるはずです。

どこか適当な場所に改行やスペース(文字でも構いません)を挿入してから直ちにdeleteキーで削除するか、select all(cmd+A)してカット&ペースト(cmd+X後、cmd+V)するなどしてみましょう。コードペインに赤い枠が表示されれば、それがacceptが可能になった合図です。ここで改めてaccept(cmd+S、あるいは黄ボタンメニューから「了解」を選択)します。赤い枠が消えれば再コンパイルは完了です。

[fig.B]Integer >> #factorialを内容を変えずに再コンパイルする
Uploaded Image: 51b.png

さて、この状態でデフォルトのチェンジセットはどうなっているでしょうか? アクティブウインドウをブラウザからチェンジソーターに切り換えて確認してみます。右手上のペインにIntegerが追加されているので、それをクリックして選択すると、たった今、再コンパイルしたばかりの#factorialが登録されているはずです。このようなチェンジセット機構の挙動を便利に感じるか不便に思うかは場合によりますが、とりあえず今のところは、再コンパイルをきっかけにしてデフォルトチェンジセットへの登録が行なわれることを覚えておいてください。

[fig.C]内容不変にも関わらず登録された#factorial
Uploaded Image: 51c.png

▼冗長な登録を回避する
改変が加えられたメソッドは、バージョン管理機能を利用して、その定義を元に戻すことが可能です。この機構を用いれば、デフォルトのチェンジセットへの冗長な登録は避けられるのでないか…と思い付いた方もおられるかもしれませんね。でも残念ながら答はノーです。それは、今のデフォルトチェンジセットにFile >> #readContentsBrief:が登録されていることからもご推察いただけるものと思います。このメソッドは、確認のためいったん加筆しましたが、用が済んだ後、元に戻したはずです。しかし、こうしてしっかり登録されてしまっています。

じつはこれ、バージョン復帰の機構や、先のデフォルトチェンジセットへの登録のタイミングについて知っていれば、納得できる挙動なのです。バージョン復帰は、単に、元の定義をチェンジファイル(あるいはソースファイル)から引っ張ってきて再コンパイルしているだけなので、再コンパイルが行なわれたかどうかしか関知しないチェンジセット機構にとっては、内容が元にもどったかどうかなどは知ったことではない…というわけです。

でも、バージョンブラウザの機能を使って、いちいちチェンジソーターを開いて確認せずとも、デフォルトのチェンジセットへの冗長な登録を排除(削除)することは可能です。Integer >> #factorialを使って、実際に試してみましょう。まず、Integer >> #factorialのバージョンブラウザを開いてください。バージョンブラウザを開くには、ブラウザのversionsボタンをクリックします。他にも、メソッド名リストペインの黄ボタンメニューからversionsを選んでも、同ペインにフォーカス(マウスポインタを移動)してからcmd-Vとタイプしても同様です。

[fig.D]Integer >> #factorialのバージョンブラウザ
Uploaded Image: 51d.png

上のペインから元のバージョンを選んで中央のrevertボタンをクリックすることで、選択した元のバージョンに戻すことできます。そして、この操作を行なってもデフォルトのチェンジセットには相変わらずInteger >> #factorialは登録されたままであることについても、すでに述べたとおりなので、もはや確認の必要はないでしょう。

ここで注目すべきは、revertの隣にあるremove from changesボタンです。このボタンをクリックすることで、このバージョンブラウザを開いた(つまり注目している)メソッドをデフォルトのチェンジセットから削除することができます。ためしに同ボタンをクリックして、チェンジソーターに切り換えてその効果を確認してみてください。

余談ですが、このInteger >> #factorialバージョン履歴を見ると分かるように、内容をまったく変えていなくともacceptで強制的に再コンパイルにより、そのメソッドのオーサー(書き手)は変更されてしまっています。したがって、現状復帰を心がけるなら、必要があってメソッドの定義をいったん改変し元に戻す場合、それがささいな改変でも再編集してacceptするのではなく、バージョンブラウザのrevert機構を用いたほうがよさそうです。

▼チェンジソーターでの登録の削除
もちろん、チェンジソーターを使って不要な登録を削除することもできます。削除したいメソッド(たとえば、FileList >> #readContentsBrief:)を選んで、黄ボタンメニューからdelete method from changeSetを選択します。

[fig.E]FileList >> #readContentsBrief:の登録抹消
Uploaded Image: 51e.png

似ていてまぎらわしいのですが、次のremove method from systemを選んではいけません。このメニュー項目は、システムブラウザでのremove methodと同じで、メソッドそれ自体の削除になってしまいます。注意してください。

クラスごとチェンジセットから登録を抹消する場合は、右上のクラス名のリストペインからdelete class from change setを選択します。

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


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

This page has been visited 710 times.