2015-11-13 4 views
4

На самом деле я придерживался функционального стиля кода программирования и структуры проекта. При программировании на Java я знал, где разместить всю мою логику, но я не знаком с функциональным стилем.Где разместить линзы Scala в моем проекте?

На самом деле я стараюсь сделать мои классы Scala в моем текущем проекте неизменными. Затем я хочу использовать scalaz.Lens и scalaz.PLens для изменения моих объектов в будущем (фактически создать новый).

Во всех примерах Lense люди помещают код в один объект, что расширяет черту приложения, чтобы просто показать, как это работает. Но в реальной жизни пример должен быть подходящим местом для написания этих объективов.

В Java все мутаторы и аксессоры, размещенные в самих классах. Но с объективами я не знаю, где их писать.

будет признателен за любые советы

+0

Обычно у вас есть «trai t X' и компаньон «объект X», содержащий различные линзы – Odomontois

+1

Также поместите свой глаз на ['Monocle'] (https://github.com/julien-truffaut/Monocle) – Odomontois

ответ

7

Обычно линзы держать в объектах компаньонов, как

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)) 
    }) 

} 

и

package package2 

import monocle.macros.Lenses 
import package1._ 

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

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

Здесь @Lenses макро аннотаций автоматически поместит линзы для простых полей в компаньона объекты

+0

Спасибо за детализацию! – maret