2011-01-14 108 views
4

特征Traversable具有诸如toList,toMap,ToSeq的方法。鉴于List,Map,SeqTraversable的子类,这会产生循环依赖性,这通常是不是所需的设计模式。Scala系列中的循环依赖关系

据我所知,这是限制在集合库,它提供了一些很好的转换方法。

有没有其他设计考虑?如“实用程序”类,或将转换方法添加到Predef

说我想添加一个新类:class RandomList extends List {...}。如果有一个方法toRandomList适用于所有Traversable类,那将是非常好的,但为此,我需要用“隐藏在Traversable”上的“pimp我的类库”。这似乎有点矫枉过正。通过实用工具类设计,我可以扩展该类(或Predef)以添加我的转换方法。这里推荐的设计是什么?

+0

感谢@retronym和丹尼尔。但是,我主要是在回答问题的第一部分。循环依赖在默认情况下被接受为Scala库中的设计模式吗? – Adrian 2011-01-14 21:19:32

+0

Adrian:是的。安德烈的回答是正确的。 – 2011-01-24 14:59:30

+0

有一个关于Scala集合是一个独立模块的有效案例,因此被“允许”具有循环依赖关系。然而,它是一个大模块,并且它是积极开发的,因此更清洁的设计会很好。这与从外部进行函数式编程的方法有些类似,内部使用命令式编码(在私有方法中)。我的猜测是,避免循环依赖需要对类型进行抽象(即将类传递给类似于(T)的方法,而不是toList(),toMap()等),Scala不支持。 – Adrian 2011-01-26 06:14:11

回答

5

要添加一个toRandomClass你不得不诉诸皮条客我的图书馆模式的确。但是,为什么你认为这是过度杀伤力?开销可以忽略不计。而它不会工作延伸实用程序类 - 为什么斯卡拉会看到你的新类为该方法?更不用说,你必须实例化这样的类才能访问它的方法。

5

这里没有循环依赖关系。 循环依赖是什么发生时,有几个独立的组件彼此相互引用。 Scala标准库是一个组件。由于它始终构建在一个步骤,所以没有任何问题。

4

你说得对。让我们从String类删除toString ...