무비 오브젝트를 생성하는 여러 가지 방법이 있다면 메서드를 내 부속 개체에 여러 개 사용해야합니까? 하나의 방법을 선호하는 여러 적용 방법을 사용하는 것은 추악합니다. 하지만 내가 여러 가지 방법으로 객체를 구성한다면 나는 다시 표준 인 빌더 패턴을 java에서 사용했다. (Companion.forBla.withBla.withBla)Companion.forBla.withBla.withBla보다 scala companion 오브젝트가 더 적합한 builder 패턴을 적용합니까?
3
A
답변
5
당신은 builder과 factory method 구별 할 필요가있다.
빌더는 다른 속성을 가진 객체를 생성 할 수 있도록하기 위해 여러 생성자를 만들 신축 생성자을 피하기 하는 데 사용됩니다. 따라서 컴패니언 객체에 여러 apply
메소드를 사용하면 이러한 텔레 스코핑 생성자가 생기고 어수선한 코드 (anti-pattern)가 발생할 수 있습니다. 예제는 다음과 같습니다
case class ComplexClass(foo: String, bar: Int)
case class ComplexClassBuilder(foo: Option[String], bar: Option[Int]){
def withFoo(f: String) =
this.copy(foo = Some(f))
def withBar(b: Int) =
this.copy(bar = Some(b))
def finish = {
// this is the place to decide what happens if there are missing values
// possible ways to handle would be to throw an exception, return an option or use defaults
ComplexClass(foo getOrElse ":D", bar getOrElse 42)
}
}
팩토리 메소드 일반적으로 다형성 수 있도록 하는 데 사용됩니다. apply
방법은 팩토리 메소드를
trait C
case class Foo() extends C
case class Bar() extends C
object C {
def apply(isAwesome: Boolean): C = isAwesome match {
case true => Foo()
case false => Bar()
}
}
을 구현하는 좋은 방법입니다 그러나 언제나처럼, 그 패턴은 규칙이 없습니다. 하나 또는 두 개의 적용 메소드를 사용하여 다른 매개 변수로 오브젝트를 작성할 수 있습니다. 그러나 많은 다른 값을 설정해야하는 경우 apply
메소드를 사용하지 말고 빌더를 구현해야합니다.
2
귀하의 질문은 의견이나 취향의 문제 같아 보입니다. (왜 복수 apply
방법이 못생긴다고 생각합니까?).
방법 매개 변수는 기본값을 가질 수 있으며, 매개 변수 이름을 지정할 수 있습니다 :
class MySomething(val one: String, val two: Int)
object MySomething {
def apply(one: String = "hello", two: Int = 0) = new MySomething(one, two)
}
// Creates a MySomething with one = "hello" and two = 0
val a = MySomething()
// Creates a MySomething with one = "bye" and two = 0
val b = MySomething("bye")
// Creates a MySomething with one = "hello" and two = 2
val c = MySomething(two = 2)