在scala

时间:2016-02-18 15:16:09

标签: scala

我们的应用程序需要一个包含大约70个或更多字段的域模型。 许多字段可以在逻辑上组合在一起。

我最初的想法是使用几个案例类和组合。 例如:

case class UserEvents(e1:String, e2:String, e3:String, e4:String...)
case class UserPreferences(p1:String, p2:String, p3;String, p4:String ...)
case class UserHistory(hi:String, h2:String, h3:String, h4:String ...)
case class User(id:Int, name:String, ue:UserEvents, up:UserPreferences, uh:UserHistory)

这是好设计吗?

另一种方法是将UserEventsUserPreferencesUserHistory建模为特征,然后User对其进行扩展。哪种方法会更好?

另外:我理解在Scala中,作为一种函数式语言,保持域类精益,并将作用于域类的逻辑放在单独的对象(贫血域模型)。这是对的吗?

由于

1 个答案:

答案 0 :(得分:3)

通常,Scala缺乏对最佳实践的看法,并允许许多可能的范例。这是一种非常灵活的( Scal 能力)语言。

  

另一种方法是将UserEvents,UserPreferences和UserHistory建模为traits,并让User扩展它们。哪种方法会更好?

在OO范例中,你会问这个关系是 has-a 关系(组合)还是是-a 关系的问题(遗产)。但那只是OO设计。

可以提出的另一个问题是这种关系是否与1:1不同。如果是这样,你必须使用合成。

我通常更喜欢构图,因为我发现它更容易理解,并且没有钻石依赖性问题,例如与泛型。

  

另外:我理解在Scala中,作为一种函数式语言,保持域类精益,并将作用于域类的逻辑放在单独的对象(贫血域模型)中被认为是一种好的做法。这是对的吗?

再次,这取决于。

Scala使得定义数据类型比使用Java更容易。所以很多人都使用这种能力。

我更喜欢贫血领域模型,因为我发现分离数据和逻辑很有帮助。但同样,你不会得到这个问题的规范答案。