昨日発生していたサイトログインできない不具合は修正されております(詳細はこちら)

Scala の Enumeration について

@kmizu さんと @keisuke_n さんの Enumeration についての議論. @NetPenguin さんと @yasushia さんもちょっと関わっていたので発言を載せてあります.
2
前へ 1 ・・ 3 4 ・・ 8 次へ
kmizu @kmizu

@keisuke_n で、JavaのenumならよくてScalaのEnumerationなら駄目というのはどういったケースなのかなあというのが疑問なのです。両方とも動的さでは大差ないはずなので、差が出るというのが想像できない。 #scala

2010-06-05 10:31:43
kmizu @kmizu

@keisuke_n APIとして、sealed trait + case classの方がわかりやすいという点については同意します。ただ、[enum].[名前]がめんどくさいならimportすればいいのでは、と思わないでもないですが。 #scala

2010-06-05 10:33:10
kmizu @kmizu

@keisuke_n いや、自分もEnumerationはあまり好みませんが、その理由に関して、誤解を含んでいるものがあるのではないか、という疑問があるので聞いています。結論が同じであっても、論拠に疑問があるのです。

2010-06-05 10:35:40
💻🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu 回答を日記にまとめてもいいですか?

2010-06-05 10:36:41
kmizu @kmizu

@keisuke_n はい。お手数をおかけしますが、お願いします。

2010-06-05 10:37:26
💻🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu 1.objectだから継承される心配はないはわかりました, 2.定数としてidを取りたいはシリアライズしたいときや比較などで取りたいわけです。これはタイミングによってNullPointerExceptionなどが発生します(lazy valで解決することもある)。

2010-06-05 10:38:48
💻🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu Javaのenumは動的であっても、表面上は静的に動いているように見えるんですが、ScalaのEnumerationはそうじゃありません。タイミング次第で平気でNullPointerExceptionなどが発生します。

2010-06-05 10:39:54
💻🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu [enum].[名前]はやっぱりださいでしょ。もともとCぽいenumをみんな想像してるのでJavaのもちょっと、と思います。static importは最後の手段なんでいまいち。

2010-06-05 10:40:39
💻🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu 一応大まかに書きました。これで議論が進められる?

2010-06-05 10:41:16
kmizu @kmizu

@keisuke_n 2.について、シリアライズ絡みで何か問題が発生し得る、ということで了解しました。シリアライゼーション絡みなら何か不具合があってもおかしくはなさそう。

2010-06-05 10:42:27
💻🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu あともう1点。sealedほげほげは明確に型付けができます。これが大きい。Enumerationよりもわかりやすいし、変数に代入(型推論じゃない場合)するときもまよいがない。

2010-06-05 10:43:14
kmizu @kmizu

@keisuke_n タイミングってのが何を指すか、ですね。javapしたコード見る限りでは、staticイニシャライザで初期化コード動かしてるので、その後のタイミングでぬるぽが発生するのはちょっと考えづらい気もするのですが…。 #scala

2010-06-05 10:47:29
kmizu @kmizu

@keisuke_n 明確に型付けとは、どういう意味でしょうか。object A extends Enumeration { } と object B extends Enumeration { } でA.ValueとB.Valueは異なる型として区別されますよね。#scala

2010-06-05 10:49:28
💻🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu EnumerationのValueの話、もともとGenericsを使うケースではないし、ユーザがその型は何かが非常にわかりにくくなります。sealedほげは継承した型そのものなんでわかりやすいですよね?Erasureも排除したいですし。

2010-06-05 10:55:30
💻🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu タイミングはThreadなどが絡んだときに発生しているように見えます。たぶんScalaのバグではないかと思うのですが、原因はわかりません。ちなみにTL上で同じような現状にあっている人が何人かいます。

2010-06-05 10:56:25
💻🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu ほかに、ScalaのEnumerationが定数ではないおかげでコンパイルできないケースが存在します。ただいまコードを出せないのですが...。

2010-06-05 10:57:53
kmizu @kmizu

@keisuke_n いやいや、ジェネリクスは関係ありませんよ。A.ValueとB.Valueは単に別の列挙型として区別される(A.Value型の変数にB.Value型の値を代入したり、その逆ができない)というだけの話です。これ自体はわかりにくい話でも無いと思いますが…。

2010-06-05 10:58:11
💻🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu えーわかりにくいよー。だいたいScalaでわかりにくいと言っているのはGenerics関係なんで、Genericsが必要ないものにたいして無理してGenericsを使う意義がまったくわかりません。

2010-06-05 10:59:10
kmizu @kmizu

@keisuke_n いや、だからジェネリックスは使ってないんですってば。A.Valueという型とB.Valueという型がある。ただそれだけです。

2010-06-05 11:00:05
💻🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu たぶん @kmizu のレベルからするとそうなのかもしれないけど、一般的にGenericsは敬遠されます。私は一般以上のプログラマをあてにしていないので(まぁそもそもScalaだときびしいわけですが)、どう考えてもEnumerationは不利です。

2010-06-05 11:00:11
kmizu @kmizu

まあ、裏側の話をすると、あれはパス依存型を利用して実現されているので、まあややこしいといえばややこしいのだけど、ユーザは単に異なるEnumeration.Valueの型には互換性が無い、ということだけを知っておけばよい。

2010-06-05 11:01:24
💻🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu それがダメでしょ。 < ユーザは単に異なるEnumeration.Valueの型には互換性が無い、ということだけを知っておけばよい。 | 「必要以上にわかりやすくすんな」が私の意見。

2010-06-05 11:03:33
kmizu @kmizu

@keisuke_n 一応、用語の整理をしておきます。Java/Scalaで言うジェネリクスって、G<T>とかG[T]みたいに型をパラメータに取る型のことですよね?少なくとも、その意味では、scala.Enumerationはジェネリクスを使っていないです。

2010-06-05 11:03:39
kmizu @kmizu

@keisuke_n うーん。それに関しては、Javaのenumと同じですよね?Javaのenumのそれは良くて、Enumeration.Valueに関して同じようになっているのが何故まずいのでしょうか。

2010-06-05 11:04:41
💻🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu Genericsうんぬんはたんなる勘違いのようですね。あと型付けの話をまったくしてませんよね?

2010-06-05 11:07:18
前へ 1 ・・ 3 4 ・・ 8 次へ