流れるようなインターフェイス とカスケード式

キーワード引数のかわりに fluent interface (流れるようなインターフェース) を使う - kなんとかの日記 さんをみて。


反射的に「これってSmalltalk に喩えると*1、キーワードメッセージなのかカスケード式 なのかしら?」と考えてみたところ、カスケード式って良くできているのね、と今更ながら気付きました。


| pen |
pen := Pen new roundNib: 9;
               color: Color red.

Smalltalk の場合、「;」で前のメッセージのセンダに メッセージを送れます。これをカスケード式 と言います。で、カスケード式 がもし無かったら、Smalltalk では 流れるようなインターフェイス が流れません。というのも、たとえ self を返すメッセージをつなげる場合でも、キーワードメッセージの切れ目を教えてあげるために

| pen |
pen := (Pen new roundNib: 8) 
                color: Color red.

と、括弧で囲ってあげなければいけないからです。これでは 見た目も筆も ちっとも流れないです。

でもちょっとした甘味として カスケード式 があるおかげで、ジャージャーながれる インターフェイスがかけますし、おまけに self を返さない(流れるようなインターフェイスでない) メッセージも問答無用に流すことができます。その流す力は yourself と合わせると TOTO なみ、最強です。

おー、すてきだ、カスケード式。今まで パセリみたいな物だと思ってました。ゴメンよ、カスケード式。

おまけ

キーワードメッセージは、確かにとても解りやすいのだけれども、フツーの関数+キーワード引数に比べて自由度が低いよね、と思っていましたが、

流れるようなインターフェースで作られたメソッドの問題点は、分かりにくいという点だ。メソッドドキュメントでメソッドのメソッドブラウザ★を見ても、それだけでは意味が分からない。名前が悪いために本来の用途を伝えきれないのである。

http://capsctrl.que.jp/kdmsnr/wiki/bliki/?FluentInterface

と言う話を読むと、なるほど、とちょっと見方が変わったり。


* * *


以上、何を当たり前のことを、な話でした。てか、cascade という言葉の意味自体がそうじゃんという....orz


追記

とか書いたけれども、「流れるようなインターフェイス」を勘違いしてるっぽいですね、私。単に self を返せば流れるわけじゃないですよね。だめじゃん...orz

*1:sumimさんに感化されましたw