第46回
■
■SqueakではじめるSmalltalk入門 第46回
■
本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。引き続き、ファイルリストの文字化けをフィックスする作業を通じて、Smalltalkならではの便利機能に触れてゆきます。
▼メソッドのバージョンをもとに戻す(バージョン管理システム)
前回、「FileList >> #readContentsBrief:」というメソッドを改変することで、ファイルリストをテキストエディタモードで呼び出したとき、このメソッドが呼び出されていることを確認しました。もはやこの細工は必要ないので、忘れないうちに元に戻しておくことにします。
もちろん追加した行を削除して再コンパイルすれば済むことですが、ここではあえて、Smalltalkシステムのバージョン管理機構を使用して、元のバージョンを復活させてみましょう。
Smalltalkでは、メソッド単位でコンパイルが完結することは、前回すでに体験していただいているとおりです。したがって、バージョン、つまり、改変の履歴も、各メソッドごとに個別に管理されています。注目するメソッドの過去のバージョンを見るには、ブラウザでそのメソッドを閲覧中にウインドウ中段のボタン群の中にある「versions」ボタンをクリックします。
[fig.A]「versions」ボタン
バージョンブラウザの上のペインには、そのメソッドの改変履歴がリストで表示されます。リストには、改変者のイニシャル(最初のメソッド改変のときに尋ねられたり、Utilities setAuthorInitialsでセットされたものです)、改変の日時、クラス名、メソッド名の順に表示されています。リストの上に行くほど最近の改変で、一番上のものが現行バージョンです。ためしに現行バージョンをクリックしてみてください。
[fig.B]バージョンブラウザ
ウインドウ中段、右端の「diff」(差分表示)オプションがオンになっているので、加えられた行は赤く、また、この差分にはありませんが、削除された行は青い色で、さらに取消線が付いた状態で表示されます。
では、改変を加える前のバージョンに戻してみましょう。上のペインの2行目をクリックして選択します(この時点で、差分の青い取消線表示も確認できるはずです)。選択したバージョンに戻すには、ウインドウ中段のボタン「revert」をクリックします。これだけです。
ウインドウを切り換え、元のブラウザに戻って確認してみると分かりますが、ちゃんとメソッドは手を加える前のバージョンに戻っています。
▼原因メソッドの呼び出し
前回の解析の結果、FileList >> #readContentsBrief:の定義中、
f converter: (self defaultEncoderFor: self fullName).
とあるところで正しくコンバータが設定されていないのが、どうやら文字化けの原因であることが分かりました(簡単のため、そういうことにしてください)。ここでコンバータを生成している、#defaultEncoderFor:というメソッドがなにをしているのかを覗いてみることにしましょう。
Smalltalkのメソッドは、やはりそれ自体がオブジェクトで、自分の定義の中で、どんなメソッドを呼び出しているのか(正確には、呼び出すためのメッセージを送信しているか)を把握しています。たとえば、今、注目している「FileList >> #readContentsBrief:」というメソッドなら、これにmessagesというメッセージを送ることで、自分の定義の中で呼び出しているメソッドの名前の一覧を返してきます。
(FileList >> #readContentsBrief:) messages
=> a Set(#oldFileOrNoneNamed: #defaultEncoderFor: #not #braceWith:with:with:
#translated #contentsOfEntireFile #'<=' #next: #readServerBrief #fullName
#close #converter: #size #format: #isRemoteDirectory #'==')
この性質を利用して、定義の中で送信されているメッセージに関係した情報をたやすく引き出せるように用意されたUIが、ブラウザ中段やや右寄りに並んでいるボタン「senders」と「implementors」です。これらのボタンをクリックすると、現在ブラウズ中のメソッド名に続いて、メソッドにmessgesメッセージを送信したときに得られるメソッド名の一覧がポップアップします。
[fig.C]「implementors」をクリックしたときポップアップするメニュー
このポップアップから適当なメソッド名を選ぶと、クリックしたのがたとえば「senders」ならsenders of it、つまり、選択した項目と同名のメソッドを呼び出しているメソッドの一覧がブラウズできます。これは、メソッド名をタイプして入力後、選択してcmd-Nとしたのと同じです。同様に「implementors」ならimplementors of it、つまり、選択した項目と同名のメソッドの定義をブラウズできます(cmd-B、もしくはcmd-Mと同じ)。
今回は、指定したメソッドの定義を見たいので、implementorsボタンをクリックしてdefaultEncoderFor:を選びます。さいわい、この名前を持つメソッドはFileListに定義されたひとつだけです。
[fig.D]FileList >> defaultEncoderFor:の定義
最後の行で、a Latin1TextConverterを返していますが、どうやらこれが文字化けの元凶のようです。試しに、文字化けの起こらないa ShiftJISTextConverterを返すように差し替えて動きを見てみましょう。
まず、Latin1TextConverterを選択して、Shiftjまでタイプしたあと、cmd-Qとします(クラス名やメソッド名の補完サービス)。すると、ShiftJISTextConverterと完全なクラス名が挿入されるので、そのままaccept(cmd-S)してコンパイルします。
[fig.E]暫定的なFileList >> defaultEncoderFor:の定義
あらためて、どこか適当な場所で、次の式をdo it (cmd-D)してみてください。
(FileStream fileNamed: 'ShiftJisExample.txt') edit
どうでしょう。文字化けは解消されましたね。次回は、この改変の影響を最小限にするため、ファイルの拡張子が.txtか.textの場合だけa ShiftJISTextConverterを返すような仕組みを設けて、このハックを終わりにしようと思います。
このページを編集 (5130 bytes)
|
以下の 1 ページから参照されています。 |
This page has been visited 761 times.