2009-08-13 62 views
11

寫了一些scala工具後,我試圖去掌握安排我的代碼的最佳方式 - 特別是含義。我有2個進球:我應該如何在我的Scala應用程序中組織暗示?

  • 有時,我想能夠導入我所要求的暗示。
  • Othertimes,我想只導入一切。

爲了避免重複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

什麼是任何有關這'implicit'? – 2009-08-13 06:15:00

+0

我認爲其中的所有def定義應該是隱含的? – 2009-08-13 12:20:23

+0

現在修復,謝謝! – 2009-08-13 21:31:47

回答

4

我認爲implicit轉換是危險的,如果你不知道它們來自哪裏。就我而言,我把我的implicit S IN一Conversionsimport儘量靠近使用盡可能

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

我不知道我喜歡「繼承」從各種trait小號implicits爲同原因被認爲是錯誤的Java練習實施interface,所以你可以直接使用它的常量(靜態導入是首選,而不是)。

+1

並非我不一定不同意這個建議,但可能會指出implicits是有用的,因爲它們是隱含的。如果您在每次使用之前添加一條導入語句,則可能有一個說法,您可能已明確應用了隱式轉換。 – 2009-08-15 07:31:23

+0

昨天我回家時我正在考慮這個確切的一點(我並不總是遵循它自己)!然而,我仍然喜歡通過繼承導入。 – 2009-08-15 11:34:00

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 

並一目瞭然查看在此源文件中處於活動狀態的所有隱式轉換。如果您使用按包裝分組的進口慣例,並在不同包裝之間換行,則它們也將全部聚集在一起。

沿着同樣的論點,我不喜歡一個包含所有隱式轉換的通用對象。在一個大項目中,你真的會在所有源文件中使用全部隱式轉換嗎?我認爲這樣做意味着代碼的不同部分之間非常緊密的耦合。

此外,通用對象不適合文檔。在明確編寫文件中使用的所有隱式轉換的情況下,可以只查看導入語句並立即跳轉到隱式類的文檔。在一個全部收集的對象的情況下,人們必須查看該對象(在一個大項目中可能很大),然後搜索他們之後的隱式轉換。

我同意oxbow_lakes在trait中隱含轉換是不好的,因爲從它繼承的誘惑,就像他說的那樣,糟糕的做法。沿着這些路線,我會讓持有隱含轉換的對象僅僅是爲了避免完全的誘惑。如果隱式轉換隻是在代碼中謹慎使用,那麼他儘可能接近使用它的想法也非常好。

-- Flaviu Cipcigan

相關問題