読者です 読者をやめる 読者になる 読者になる

レガシーコード生産ガイド

私に教えられることなら

Squeak Smalltalkでstub/todo用メッセージ

Smalltalkで少し大きめの処理を書くときは、自分は大抵デバッガ内でメソッドを作りながら進める。

そのやり方がいいのか悪いのかは別として、書くべきところをデバッガが勝手に用意してくれるので便利。

ただ、「今はこの条件は無視する(todo)」とか「今はこのメソッドは何もしない(stub)」とか飛ばしておきたいときがあって、その後そこを改めて作りこむために楽な方法が欲しい。

そこでTranscriptに、「書くべきメソッドをブラウザで開くコード」を出力できるようにする。

ブラウザで開くコード

Browser newOnClass: クラスオブジェクト selector: セレクタ.で開ける。

FooクラスのbarメソッドならBrowser newOnClass: Foo selector #bar.となる。

stub/todoメソッド

例えばFooクラスのfooメソッドで、次のように書いて

Foo>>#foo
    self bar.
    self todo: 'baz処理をする'.

Foo>>#bar
    self stub.

todo:のとこではFoo>>#fooを、stubのとこではFoo>>#barを開くコードを出力したい。

stub/todoどちらでも、開きたいのは「自分にメッセージを送ったメソッド」で、thisContext senderで取り出せる。

さらにそのsenderにmethodClassselectorメッセージを送ると、そのまま欲しいものが手に入る。

todo: aString 
    Transcript
        cr; show: 'TODO: ' , aString;
        cr; show: ('Browser newOnClass: {1} selector: #{2}.'
          format: {thisContext sender methodClass. 
                   thisContext sender selector});
        cr.


stub
    Transcript
        cr; show: ('"STUB" Browser newOnClass: {1} selector: #{2}.'
          format: {thisContext sender methodClass. 
                   thisContext sender selector});
        cr.

使用例

Transcriptに以下のような出力がされる。Browserの行にカーソルを合わせてdo itで書き始められる。

TODO: assign sentence
Browser newOnClass: PhMethodParser selector: #parseSentence.

"STUB" Browser newOnClass: PhMethodParser selector: #parseExpression.
広告を非表示にする