プロトコルブラウザとトランスクリプトの改行

確かTranscriptに改行するようメッセージを送れたと思い、WorkspaceのTranscriptという文字列を選択して、黄色ボタン (Option+ボタン) のmore...からシステムブラウザを表示する。文字列選択状態で"Command+b"でもいい。 それを見ると"TranscriptStream"のインスタンスということがわかるが、インスタンスメソッドを見ても、それっぽいのがわからない。

システムブラウザの、クラスかメソッドのペインに用意された黄ボタンメニューから「プロトコルブラウザ」を起動すると、こういうとき、シアワセになれます。注目しているクラスがサポートするプロトコル*1(ひいてはそれが束ねるメソッド)をどのスーパークラスに属するかを意識せずに一覧できるツールです。でも享受できるシアワセ感の多少は、そのクラス…というか継承パス設計における“クラス指向*2”の観点からのオブジェクト指向実践の度合いによって左右されます*3。TranscriptStream は“クラス指向”誕生以前から古いままずっと来ているクラスなので、その点、微妙かもしれません。(と言いつつ、次のこともあるので、TranscriptStream は、“メッセージ指向”的*4にもダメな奴かもしれません。w)

一方で、Transcript*5 に cr を送信しても、実際にトランスクリプトGUI)でキャレット位置が「改行して移動」するわけではない、というありがちな罠のほうのは大丈夫ですか? WriteStream >> #cr が、たんにメッセージ「nextPut: Character cr」のショートカットなのに対し、TranscriptStream >> #show: には #nextPuAll: の単純なエイリアス以上の仕組みがある…とか、そのため Transcript cr; show: … という(Smalltalk システムローカルの)慣習から外れて、“普通”の感覚でTrsnscript show: …; cr としてしまうと期待通りにならない、とかいった話なのですが。

毎度、老婆心ながら。(いったんコメントに書いたのですが、長くなったのでトラバに換えてみました。)

*1:メッセージカテゴリ、あるいは、メソッドカテゴリとも呼ばれるものです。

*2:再三言うように、これは簡単のため私が言っているだけで、より正確には「データ型による抽象化手法のスーパセット」。

*3:クラス指向に則ったきれいな設計(静的型システムではないし、必要な言語機能もいくつか欠いていますが、Smalltalk でも、ある程度は実践可能で、また普通、そうすることが推奨されてもいます)なら完成されたユーザー定義型の姿が浮かび上がりますが、そうでないと逆に今まで気づかずに済んだものまでがよく目について、クラス指向実践者の場合、ひどく気持ちの悪い思いをさせられることも多々ありそうです。w

*4:クラス設計を通じて「ユーザー定義の型」を厳密かつ安全に規定することを目指すクラス指向に対し、「対象に、どんなメッセージを送り、その結果がどうなのか」がキモであるメッセージ指向では、オブジェクトやその内部状態、クラス設計などにはわりと興味がなく、乱暴な言い方をすれば実はどーでもいい。クラス指向は、ある意味、それへのアンチテーゼでもあると私はみている。

*5:ちなみに、引用元でも言及があるように、 Transcript は、クラスではなくグローバル変数(まあ、クラスもグローバル変数に束縛されたオブジェクトに過ぎないので、正しく言うと、クラス以外のオブジェクトを束縛しているグローバル変数)です。Squeak などの古典的な Smalltalk システムにおいては、TranscriptStream のインスタンスを束縛しています。#p3 参照。