2009-08-13 55 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

相关问题