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