2009年7月31日金曜日

Scala 練習5

今日も、ネットの連載記事を読みつついじってみる。
第4回 Scala言語を探検する(2)

今回は trait の説明が中心。「mix-in型の多重継承」、「アスペクト指向を簡易に実現」なんて書いてある。多重継承なんて何だかつまらない話っぽいけど、下の方に何気なくサラっと書かかれてる「インスタンス生成時にそのオブジェクトに対して個別にtraitの性質を与えることもできます。」ってところがとても面白い。多重型付けなんだな。

ちょっと古いけど Martin Fowler の「アナリシスパターンAnalysis Patterns)」(通称アナパタ)という絶品な良書があって、その付録の「A.13 汎化」で「多重継承(multiple inheritance)」と「多重型付け(multiple classification)」の違いについて説明がある。

要約すると「多重継承といっても個々のオブジェクトが持つのは単一の型だから、それは単一型付け(single classification)だけど、それに対して多重型付けは個々のオブジェクトが複数の型を持ちうるという別ものの話であり、概念的には後者の方が自然である。」といった内容。Scala の traitは多重継承だけでなく多重型付けもサポートしているようなので、分析レベルと実装レベルのギャップが狭くなるというわけで、これは歓迎。

ちなみにアナパタの同じ箇所に「多重型付け」と並んで「動的型付け(dynamic classification)」についても記述がある。この記事のサンプルをもじって言うと、Person with TPianoPlayer から例えば Person with TGuitarPlayer への、実行時の動的な変更が言語的にサポートされていれば「動的型付け」なんだけど、Scala ではどうなんだろう? いたるところで「Ruby は動的だが Scala は静的」なんて言われているようだからやっぱ無理かな。ちなみにJava や C++ は、もちろん動的型付けはサポートしていないから、 Strategy か State パターンを使うのが定石。

続くアスペクトのところもまあまあ面白いが、この記事では軽く紹介されているだけなので、フックのための小さい仕掛けのレベルを出ていない。もっとよく調べれば本格的な Separation of Concerns の技法の、Scala的なイディオムがあるのかもしれないが、Scala 初心者の自分にはまだ分からない。ちなみに mix-in といえば、昔アスペクト指向が流行始めた頃(2002年頃?)、AspectJ の対抗馬的な扱いで MixJuiceってのがあった気がするんだがどうなったんだろ?

最後の方に型の話があって、より純粋なオブジェクト指向言語って事らしいが、まあ、うん。

====
今日は、Eclipse をエディタとして使って、コンソールから :load して実行という変な使い方をしてみた。
scala> :load Person.scala
Loading Person.scala...
defined class Person
defined trait TTeacher
defined trait TPianoPlayer
defined class PianoplayingTeacher

scala> val t1 = new PianoplayingTeacher
t1: PianoplayingTeacher = PianoplayingTeacher@107e9a8
Eclipse のScala IDE でクラスを新規作成すると、[Finish]押してファイルも生成されてるのにフォームが閉じない。テンション下がる・・・

0 件のコメント:

コメントを投稿