2009-08-13 15 views
11

いくつかのscalaツールを書いているので、私は自分のコードを配置するための最良の方法、特に暗黙的な方法を理解しようとしています。私は2つの目標を持っています:Scalaアプリケーションでimplicitsをどのように整理すればよいですか?

  • 私は時々、私が求めるimplicitsをインポートすることができます。
  • その他、私はすべてをインポートしたいです。

暗黙の重複を避けるために、私は(scalazが配置されているのと同じように)このような構造を作ってみた:

case class StringW(s : String) { 
    def contrived = s + "?" 
} 

trait StringWImplicits { 
    implicit def To(s : String) = StringW(s) 
    implicit def From(sw : StringW) = sw.s 
} 

object StringW extends StringWImplicits 

// Elsewhere on Monkey Island 

object World extends StringWImplicits with ListWImplicits with MoreImplicits 

これは私がちょうど

import StringW._ // Selective import 

またはすることができます(ほとんどの場合)

import World._. // Import everything 

他の誰もそれをする?

+0

これに関する暗黙の意味は何ですか? –

+0

私はその中のすべての 'def'ininitionsが暗黙的であると仮定しましたか? –

+0

修正済み、ありがとうございました! –

答えて

4

implicitあなたはどこから来たのかわからないと変換が危険だと思います。私の場合、私はそれがimport私は同じのための様々なtrait sの暗黙の「継承」が好きかわからない

def someMethod(d: Date) ; Unit { 
    import mydate.Conversions._ 
    val tz = TimeZone.getDefault 
    val timeOfDay = d.getTimeOfDay(tz) //implicit used here 
    ... 
} 

できるだけ使用に近いConversionsクラスで私のimplicit Sを入れて、理由は悪いJavaの練習を実装してinterfaceを実装していたので、その定数を直接使用することができました(代わりに静的インポートが優先されます)。

+1

私はこのアドバイスには必ずしも同意していませんが、含意は暗黙的であるため有用であることが指摘されるかもしれません。毎回使用する直前にインポートステートメントを追加すると、暗黙の変換を明示的に適用した可能性があります。 –

+0

私は昨日帰ってきたので、私はこの正確な点を検討していました(そして、私はいつもそれを自分でフォローしているわけではありません)!私はまだ継承よりも輸入を好む。 –

1

私は通常、それがインポートされたものがimplicitの変換であることを明確に伝えるオブジェクトでimplicitの変換を持っていました。

たとえば、クラスがcom.foo.bar.FilthyRichStringの場合、暗黙的な変換はcom.foo.bar.implicit.FilthyRichStringImplicitになります。私は名前がちょっと長いと知っていますが、そのために私たちはIDEを持っています(そしてScala IDEのサポートは良くなっています)。私がこれを行う方法は、すべての暗黙的な変換を明確に10 second code reviewで見ることが重要であると感じていることです。


// other imports 
import com.foo.bar.FilthyRichString 

import com.foo.bar.util.Logger 
import com.foo.bar.util.FileIO 

import com.foo.bar.implicits.FilthyRichStringImplicit._ 
import com.foo.bar.implicits.MyListImplicit._ 
// other implicits 

このソースファイルでアクティブなすべての暗黙的な変換を確認することができます。また、インポートがパッケージ別にグループ分けされ、異なるパッケージ間に新しい行があるという規則を使用すると、それらはすべて一緒に集められます。

同じ引数の行に沿って、暗黙的な変換をすべて保持するcatch-allオブジェクトは好きではありません。大きなプロジェクトでは、実際にのすべてのソースファイルで暗黙的な変換が使用されますか?私はそれがあなたのコードの異なる部分間の非常に密接な結合を意味すると思います。

また、キャッチオールオブジェクトはドキュメント化にはあまり適していません。ファイルに使用されている暗黙的な変換をすべて明示的に記述する場合、インポート文を見るだけで暗黙のクラスのドキュメントに直接ジャンプできます。 catch-allオブジェクトの場合は、そのオブジェクト(大きなプロジェクトでは膨大かもしれません)を見てから、暗黙の変換を検索しなければなりません。

私はox39_lakesに同意します。traitで暗黙の変換を行っているのは、彼が言ったように、悪い習慣であることを引き継ぐ誘惑のために悪いです。これらの行に沿って、私は誘惑を完全に避けるため暗黙的な変換を保持するオブジェクトをfinalにします。暗黙的な変換がコード内で控えめに使用されている場合は、できるだけ使用に近いものとしてそれらをインポートするという彼の考えはとても良いです。

-- Flaviu Cipcigan

関連する問題