ScalaにおけるJavaのインターフェースって?

タイトル難しいな・・・ 抜けてたら勝手に編集してください
11
t_yano @t_yano

Scalaについてはtraitとか構造型についていろいろ聞いてみたいことがあるんだけどとても140文字では表せないな…。まあ、スタイルというか定石とかがどうなってるのか知りたい系の話だけど。

2011-10-24 01:31:09
t_yano @t_yano

なんか実装継承するケースばかりを見かけるのたけど、型を定義するためにtraitを使うとか、すべてのクラスはなんらかのtraitを型として持つべきだ派とか、あるいは逆に、すべての引数は理由がない限り構造的部分型にすべき派とか、そういう話はないんだろうか的な疑問。

2011-10-24 01:34:22
t_yano @t_yano

あるいはあるクラスを受け取ると定義されている関数に、その型ではないけど事実上その方として振る舞える別の型のオブジェクトを、なんらかの方法で渡すことが可能なので、関数インタフェースは具象型でも問題がないのだ、とかいう話でもアリ。

2011-10-24 01:35:36
t_yano @t_yano

あんまり広くコードを見てないので偏ってるだけなんかもしれんけど、メソッドインタフェースがtraitでも構造的部分型でもなく、明確な具象型になってるコートが散見されるので、あとから困らないのだろうかとかの疑問を感じている次第。単に、サンプルコード的なもの扱いで、はしょってるのかも。

2011-10-24 01:37:31
t_yano @t_yano

少なくともJavaでは、メソッドインタフェースが具象型であったためにあとから後悔することってたくさんあるので、そのような「あとで後悔する」ことに対する対策というのは、(なにせJavaからScalaに行く人も多いわけで)なにかされてるんじゃないかと思ってるのだけど。

2011-10-24 01:40:55
t_yano @t_yano

私の知識の範囲では、メソッドインタフェースではなるべくtraitを使うか、構造的部分型を使う、くらいしか思いつかない。構造的部分型は遅い、とかいう話を昔聞いたことがあるけど、もう大分たつから、いまはどうなんかなー

2011-10-24 01:42:12
がくぞ @gakuzzzz

そう言えばやのさんの言うとおり、 Scala ではあんまりメソッドインターフェイスを trait にしなきゃって強く意識はしてないな。Java に比べて。何でだろう?

2011-10-24 01:50:03
がくぞ @gakuzzzz

でも確かに List 使うよりは LinearSeq 使うべきだよな。なんか違うところに気を取られててそこまで注意が回ってないだけか?

2011-10-24 01:55:21
がくぞ @gakuzzzz

LinearSeq だと :: ないのか

2011-10-24 01:56:48
t_yano @t_yano

設定ファイルはインタフェースを定義して、それを実装するクラスをJVM系の好きなものでテキストファイルに書いてもらって、scripting APIでコンパイルしたらよくね?

2011-10-24 01:56:52
Kenji Yoshida @xuwei_k

後悔して大幅に作りなおしたとしても、、べつにScalaならたいした手間じゃないから、っていう個人的感覚。いちいちインターフェース作るのめんどい。Javaの経験がそれほどないから、ちゃんとインターフェースをつくるJavaっぽい設計に慣れていないっていうのはあるけど

2011-10-24 01:57:14
がくぞ @gakuzzzz

ポリモーフィックに動作を切り替えたい場合に、Javaみたいな interface と実装でのポリモーフィズムと型クラスによるポリモーフィズムっていう複数の選択肢があるってのも関係してくるかな?

2011-10-24 02:01:27
Naoki Takezoe @takezoen

どちらかというとDIコンテナみたいなものがないからとか、そういう理由な気がする。JavaでもDIが出てくるまではそこまでインターフェースマンセーでもなかったような。

2011-10-24 02:02:11
Kenji Yoshida @xuwei_k

.@t_yano 少なくとも「すべての引数は理由がない限り構造的部分型にすべき派」は皆無だとおもいますね。あれは、内部でリフレクション使うから遅いらしいですし。遅いからScala自体のコンパイラ内部でも基本的に使わなくなってるし

2011-10-24 02:03:14
t_yano @t_yano

@xuwei_k それは、自分の作ったプログラムを、自分でない誰かが使う(ライブラリとかそんなの)ケースは含まれてない話ということでいいでしょうか。

2011-10-24 02:04:27
t_yano @t_yano

まーもともと疑問に思ったのは、Scalaも2.9.1までいって、たくさんのライブラリも出てきているので、なんか「よその人に使ってもらうとき向けの抽象化」テクニックみたいなのも、定石みたいなもので発達してるんだろうなとか予想したから。

2011-10-24 02:07:30
がくぞ @gakuzzzz

構造的部分型は仮に動作が速くても多用すべきじゃない気がしてるけど、その理由をうまく言語化できてないな

2011-10-24 02:07:54
t_yano @t_yano

あと考えられるのは、上限下限+総称型(共変反変も)をがしがしつかい、多くのケースで、実際に型を指定するのは、ライブラリ作成者側ではなく、ユーザ側になっている、という仮説。

2011-10-24 02:08:26
t_yano @t_yano

まあその場合、下限はtraitになるのかな?

2011-10-24 02:08:41
t_yano @t_yano

@xuwei_k やっぱ構造的部分型が遅いってのは正しいのですね。了解です。

2011-10-24 02:09:16
Kenji Yoshida @xuwei_k

@t_yano そうですね、一人で作ってる場合はそんな感覚です。ちゃんとしたライブラリの場合は、ある程度インターフェースっぽいtraitをつくる場合もあると思いますよ。ただ、全体的にJavaと比べてインターフェースっぽいtraitをつくる習慣がないのも事実かも

2011-10-24 02:10:02
t_yano @t_yano

んで、Scalaの場合、ユーザ側が総称型に型を指定する場合、明確に型を書くよりも、型推論に拠るケースがおおいと思うので、あまり意識せずにすんでいるのか?という仮説。んでも、それほどScala使い込んでるわけでもないので、それで多くのケースをカバーできるのかはまだ疑問。

2011-10-24 02:12:28
Kenji Yoshida @xuwei_k

べつにライブラリ自体のversion変わるごとにAPIのインターフェースがドラスティックに変わってもいいから、それよりとにかく機能豊富で速いやつをガンガン開発して欲しいとか思ってる

2011-10-24 02:12:52
がくぞ @gakuzzzz

シグネチャが一緒でも意味的に同一として扱うと問題が発生するケースってのがあるからかな?

2011-10-24 02:13:27
Kenji Yoshida @xuwei_k

しょうがないなぁ・・とゅぎゃりますかね・・・(´・ω・`) RT @tototoshi なんかおもしろい話展開されてるけど眠すぎなので誰かあとでまとめといてくださいねっ!

2011-10-24 02:14:52