SmalltalkとScalaのトレイトの違い

定期的に話題になる感のあるSmalltalkとScalaのトレイトの違いですが、今回はSmalltalkプログラマの @sumim さんとScalaプログラマの @kmizu さんの対話により、よりわかりやすく整理された内容になっていると思います。
2
Nebuta @nebutalab

Smalltalkは教育用のScratchくらいで殆ど使われていないが、そのコミュニティー(というかケント・ベック)からはデザインパターンやテスト駆動といった(少なくとも出てきた当時は)汎用的で革新的なアイデアが出てきたわけだ。Haskellもそういう立ち位置のイメージがある。

2013-03-01 17:48:44
sumim @sumim

@nebutalab TraitsとかClassboxes、DCIアーキテクチャはいずれも2000年以降ですから比較的最近になってからも、他でも使えるアイデアを創出していますね。教育分野以外への導入実績もあるのでぜひ知っておいて下さい→http://t.co/tAY9PvG33w

2013-03-01 18:46:04
Nebuta @nebutalab

@sumim 使われていないは語弊があったもしれません。TraitがSmalltalk由来というのは初めて知りました。

2013-03-02 15:32:25
sumim @sumim

@nebutalab 例えばScalaなら http://t.co/uTFP2z5djb の孫引きで http://t.co/cGjXosl4G7 にリーチできます。ただScalaのtraitは実質はmixinなのでオリジナルのTraitsの解説を読むと少々混乱するかもしれません

2013-03-03 13:30:38
kmizu @kmizu

@sumim @nebutalab Scalaのtraitを単なるmixinといってしまうのもまたちと語弊がある気もしなくもない…

2013-03-03 13:39:33
Nebuta @nebutalab

@kmizu http://t.co/j4nXOQ1q28 このあたりの説明でしょうか。Traitの使い方のチュートリアルとかあればいいですね。多重継承とどう違うのかなどを知りたいです。

2013-03-03 13:43:28
リンク はてなダイアリー 多重継承まとめ - 西尾泰和のはてなダイアリー 先週の金曜日、id:amachangの新しい会社(オーマ株式会社)に遊びに行ってきました。 正直なところ、最初に話.. 81 users 1
sumim @sumim

@kmizu @nebutalab 「単なる」mixinだと言えばたしかに語弊がありますね。誰がそんなこと言っていました?

2013-03-03 13:59:58
kmizu @kmizu

@sumim いえ、うがち過ぎでした。実質mixinという言い方からそういうニュアンスを勝手に読み取ってしまっただけです。

2013-03-03 14:02:46
kmizu @kmizu

@nebutalab その辺ですね。あとは、Scalaのtraitはself-type annotationとか、コンポーネント間の依存関係を指定するための指定子もあったりして(そして、それが重要な用途になっている)、mixinだけが強調されるとそれもちょっと違うかなという。

2013-03-03 14:05:05
sumim @sumim

@nebutalab Traitsも結局(広い意味での)多重継承の実現方法のひとつなので、基本的に独自の使い方というのはありません。複数のtraitをuseしたときにいったん平坦化されるところがmixinとの大きな違いで、useする順序というのを考えなくてもよいのがその特徴です。

2013-03-04 10:17:09
nishio hirokazu @nishio

@kmizu @sumim scalaのtraitに出来てsqueakのにできないことについて比較記事を書きたいところですね。やっぱりこういうものは自然言語で説明すると誤解が生まれるので、コードを出してその挙動で説明した方がよいのかも。

2013-03-04 19:30:58
sumim @sumim

@nishio @kmizu おもしろそうですね。

2013-03-04 21:12:07
kmizu @kmizu

@nishio .@sumim そうですね。その辺、一度整理してみたいですね…。squeakのtraitは私も詳しいとはいえないので、コード例出し合ってお互い理解深めるといい感じですかね。

2013-03-05 22:59:40
nishio hirokazu @nishio

@kmizu 「scalaのtraitは単なるmixin」という表現の語弊のあるところはどこだと思いますか?僕は型に関するところかと思っていますが。

2013-03-06 11:05:31
kmizu @kmizu

@nishio 概ねYESです。といっても、Scalaが静的型付き言語だから違う、という話ではなく、trait自体に他の型への依存性を記述するための機能 (self type annotation)等があるから、ですね。

2013-03-06 12:21:19
nishio hirokazu @nishio

@sumim squeakのtraitで「トレイトXはトレイトYとセットでなければクラスの構成要素になれない」というトレイト感の依存関係を宣言するのってどうするのでしょうか?クラスブラウザを見てもよくわかりませんでした。

2013-03-06 14:57:15
nishio hirokazu @nishio

@kmizu / “learn_language/trait at master · nishio/learn_language · GitHub” http://t.co/Jqyu9Pn4ou

2013-03-06 15:36:06
sumim @sumim

@kmizu @nishio 書いてみました。タイトルはあえて釣りです。→Scalaのトレイトは実はトレイトじゃなくただのミクスイン http://t.co/G8L5KqIES6

2013-03-06 16:02:44
リンク はてなダイアリー Scalaのトレイトは実はトレイトじゃなくただのミクスイン - Smalltalkのtは小文字です タイトルは釣りです。 まずおおざっぱに用語の整理をさせていただくと、ここで「トレイト」は、シェルリ(.. 68 users 8
sumim @sumim

@nishio 動的型言語向けのシェリルのトレイトにはそういう制約はなかったと思います。要はトレイトをJavaのインターフェイス的に使いたいという話ですよね。それが必要で、実現しようと思えばできなくはないと思いますが別の試みかと。参考:http://t.co/K2gjayHy4i

2013-03-06 16:12:57
nishio hirokazu @nishio

@sumim なるほど、そういう機能はないということですね。もう一点、squeakのtraitにnewを送ると普通にインスタンスが作られてしまうようですが、これは問題ないのでしょうか?

2013-03-06 16:21:09
nishio hirokazu @nishio

@sumim 補足ですが、先ほどの「トレイトXはトレイトYとセットでなければクラスの構成要素になれない」は、同じくシェリルらの2006年のACMの方(fine-grade reuse)の白丸メソッドのことを言いたかったのです。

2013-03-06 16:46:39
sumim @sumim

@nishio 問題なくはないですが、Smalltalk では抽象クラスでも普通に new できてしまうこともざらなので、そういう危機意識がそもそも欠落しているのだと思います。

2013-03-06 16:47:38