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を用意する? それは混乱の元だろう。