相关疑难解决方法(0)

实例化不可变配对对象

是否可以创建一个具有对合作伙伴对象的不可变引用的类,或者它是否必须是var我在创建后分配的类?

例如

class PairedObject (p: PairedObject, id: String) {
  val partner: PairedObject = p  // but I need ref to this object to create p!
}
Run Code Online (Sandbox Code Playgroud)

或类似地,我如何实例化以下对?

class Chicken (e: Egg) { 
  val offspring = e
}

class Egg (c: Chicken) {
  val mother = c
}
Run Code Online (Sandbox Code Playgroud)

scala object immutability

26
推荐指数
1
解决办法
1963
查看次数

为什么Scala集合中没有不可变的双链表?

看看这个问题,提问者对a中某个元素的第一个和最后一个实例感兴趣List,似乎更有效的解决方案是使用DoubleLinkedList可以从列表末尾向后搜索的问题.但是,集合API中只有一个实现,它是可变的.

为什么没有不可变版本?

collections scala linked-list immutability

13
推荐指数
3
解决办法
3367
查看次数

重构具有可变性和循环依赖性的域模型,以便为Scala提供良好的FP实践?

我来自OO背景(C#,javascript),而Scala是我第一次涉足FP.

由于我的背景,我无法很好地实现适合我的域问题的域模型,并且还符合FP的良好实践,例如代码中的最小可变性.

首先,简要描述我现在的域名问题.

  • 主域对象是: Event, Tournament, User, and Team
  • Teams 由...组成 Users
  • 双方TeamsUsers可以参加Tournaments这发生在一个Event
  • EventsUsers和组成Tournaments
  • 结果,统计数据,以及排名TeamsUsers谁竞争,跨越TournamentsEvents将是一大特色.

鉴于问题的这种描述,我对域的最初想法是创建对象,其中双向循环关系是常态 - 类似于图形.我的想法是,能够访问任何给定对象的所有关联对象将为我提供最简单的路径,为我的数据编程视图,并操纵它.

case class User(
           email: String,
           teams: List[TeamUser],
           events: List[EventUser],
           tournaments: List[TournamentUser]) {
}
case class TournamentUser(
                     tournament: Tournament, 
                     user: User, 
                     isPresent: Boolean){
}
case class Tournament(
                 game: Game,
                 event: Event, 
                 users: List[TournamentUser], 
                 teams: List[TournamentTeam]) {
}
Run Code Online (Sandbox Code Playgroud)

然而,随着我进一步深入FP最佳实践,我发现我的思维过程与FP原则不相容.循环引用是不受欢迎的,似乎几乎不可能与不可变对象.

鉴于此,我现在正在努力解决如何重构我的域以满足良好FP的要求,同时仍然保持域中"真实世界对象"的常识组织.

我考虑过的一些选择

functional-programming scala immutability domain-model cyclic-reference

8
推荐指数
1
解决办法
539
查看次数