«前の日記(2004年01月25日) 最新 次の日記(2004年01月27日)» 編集

Matzにっき


2004年01月26日 [長年日記]

_ [OOP]Applying Traits to the Smalltalk Collection Classes

Applying Traits to the Smalltalk Collection Classes,
Andrew P. Black, Nathanael Schärli, Stéphane Ducasse
SIGPLAN Notices Vol.38 No.11, Nov. 2003

読んでみた。suminさんのおっしゃる通り、さほど目新しい印象はなかった。 どうも論文中で触れている"Mix-in"がなにか非常に欠陥のある設計のものをわざわざ取り上げているような 気がする。実際に論文で紹介しているようなクラス階層の再構成はRubyのmoduleを使っても、 ほとんど問題なく行えるような気がする。Rubyにはundefもaliasもあるし。

あと、Rubyだとインスタンス変数の宣言が要らないので、Smalltalkのtraitと違って、 メソッドに対して「they cannot directly reference any instance variable」という制限が必要なくなるということが興味深い。

新しいと感じられた点はtrait同士の演算(sum, overriding, inheritance, excluding)である。 もっとも「overriding」はmoduleに対するinclude、「inheritance」はclassに対するincludeであるから、 Rubyにないのは「sum」と「excluding」だ。これはmoduleに追加するメソッドとして検討の余地はあるかも。 「このモジュールからこれこれのメソッドを除いたもの」とか、 「このモジュールとこのモジュールを足したもの*1」とか、 「このモジュールをこのメソッドの名前だけ変えたもの」とかの指定で、 名前のないtraitが作れるのは非常に面白い。

ただ、traitは「a first-class collection of named methods」であり、 そのinclude(論文中ではuses:)は、そのtraitが(現時点で)持つメソッド集合を使うイメージのようだ。 Rubyのincludeはinheritと同様、 シンボリックな関係*2を維持している。 いっそmoduleもtraitのようにしてしまうとラクなんだが、多分許されないだろうなあ。

moduleとは別にtraitを用意する? それは混乱の元だろう。

*1  衝突したメソッドの呼び出しはエラーになる

*2  includeしたmoduleにメソッドが追加されると追随すること

_ [家族]家庭の夕べ

月曜恒例の「家庭の夕べ」。年初にたてた目標の評価を行う。全然体重減ってないじゃん(苦笑)。

その後、活動として「福笑い」。そしてみんなでアイスクリームを食べる。


«前の日記(2004年01月25日) 最新 次の日記(2004年01月27日)» 編集