在我的项目中,在哪里放置Scala镜头?

在我的项目中,在哪里放置Scala镜头?,scala,lenses,Scala,Lenses,实际上,我一直坚持函数式编程的代码风格和项目结构。当用Java编程时,我知道将所有逻辑放在哪里,但我不熟悉函数式 实际上,我试图使当前项目中的Scala类不可变。然后我想使用scalaz.Lens和scalaz.PLens在将来更改我的对象(实际上是创建新对象) 在所有Lense示例中,人们将代码放在一个对象中,这扩展了Apptrait以简单地显示其工作原理。但在现实生活中的例子应该是一些合适的地方写这些镜头 在Java中,所有的变体和访问器都放在类本身中。但我不知道在哪里写 如果您有任何建议,

实际上,我一直坚持函数式编程的代码风格和项目结构。当用Java编程时,我知道将所有逻辑放在哪里,但我不熟悉函数式

实际上,我试图使当前项目中的Scala类不可变。然后我想使用scalaz.Lens和scalaz.PLens在将来更改我的对象(实际上是创建新对象)

在所有Lense示例中,人们将代码放在一个对象中,这扩展了Apptrait以简单地显示其工作原理。但在现实生活中的例子应该是一些合适的地方写这些镜头

在Java中,所有的变体和访问器都放在类本身中。但我不知道在哪里写


如果您有任何建议,我们将不胜感激。

通常,镜片会固定在伴生物体中,如

package package1

import monocle.Iso
import monocle.macros.Lenses

@Lenses
case class Name(first: String, last: String, mid: Option[String]) {
  def fullName = s"$first ${mid.fold("")(_ + " ")}$last"
}

object Name {
  val fullName = Iso[Name, String](_.fullName)(_.split(' ') match {
    case Array() => Name("", "", None)
    case Array(name) => Name(name, "", None)
    case Array(first, last) => Name(first, last, None)
    case Array(first, mid, last, _*) => Name(first, last, Some(mid))
  })

}

软件包2
导入monocle.macros.lens
进口包装1_
@镜头
案例类用户(姓名:姓名,年龄:整数)
对象用户{
val fullName=name^name.fullName
}

这里的
@lents
宏注释将自动将简单字段的镜头放置在伴星对象中

通常您有
trait X
,而包含各种镜头的伴星
object X
也会将您的目光放在伴星对象上,感谢您的去目标化!
package package2

import monocle.macros.Lenses
import package1._

@Lenses
case class User(name: Name, age: Int)

object User {
  val fullName = name ^<-> Name.fullName
}