如何抽象数据和控件以支持轻松扩展?

时间:2012-11-03 20:30:03

标签: scala traits

我有一个案例: 有SomeNode,由不同的基本部分组成:比如某些类型的A,B,C。还有一个转换函数可以将SomeNode的实例转换为另一个SomeNode

但是,SomeNode除了A,B,C之外,还可能会添加一些其他部分,因此可能会D作为SomeNode的第四部分。因此,转换函数的接口可能还需要相应地更改新添加的组件SomeNode,但可能会共享一些相同的逻辑。

然后我一直在想,抽象SomeNode及其转换函数的简易设计是什么?使用特质?怎么样?一些灵感的例子? 谢谢,

3 个答案:

答案 0 :(得分:2)

为了管理模块化,请查看蛋糕模式(又名面包末日模式)。关于这个主题有一些有趣的文章:

为了管理转换和特征,Scala编译器是我能想到的最好的例子。

答案 1 :(得分:1)

也许我错过了什么,但你不是在寻找继承吗?

class SomeNode(val a: Int, val b: String, val c: Char)

class SpecialNode(from: SomeNode, val d: List[Int]) extends 
         SomeNode(from.a, from.b, from.c)

SpecialNode分享SomeNode字段并添加新的d字段。转型看起来像这样(当然它可能更复杂:

def transform(node: SomeNode) = new SpecialNode(node, Nil)

答案 2 :(得分:1)

我犹豫是否以牺牲显示我的菜鸟身份来写这篇文章,但根据问题中使用的关键词,听起来像是“ OOP基础”正在被要求。

“如何抽象数据和控件以支持简单的可扩展性?”(泛化)

“有SomeNode,由不同的基本部分组成:”(聚合)

“还有一个转换函数可以将SomeNode的实例转换为另一个SomeNode。”(多态)

“但是,SomeNode可能会添加一些其他部分,除了A,B,C,...函数的界面可能还需要相应地更改新添加的组件SomeNode,但可能会有一些相同的逻辑共享。“(接口)

“然后我一直想知道,抽象SomeNode及其转换函数以获得简单的可扩展性有什么好的设计?”(继承)

根据我对这个问题的解释,我建议研究 S.O.L.I.D。设计原则 http://www.youtube.com/watch?NR=1&v=05jVWgKZ6MY&feature=endscreen