2013-12-17 2 views
3

무비 오브젝트를 생성하는 여러 가지 방법이 있다면 메서드를 내 부속 개체에 여러 개 사용해야합니까? 하나의 방법을 선호하는 여러 적용 방법을 사용하는 것은 추악합니다. 하지만 내가 여러 가지 방법으로 객체를 구성한다면 나는 다시 표준 인 빌더 패턴을 java에서 사용했다. (Companion.forBla.withBla.withBla)Companion.forBla.withBla.withBla보다 scala companion 오브젝트가 더 적합한 builder 패턴을 적용합니까?

답변

5

당신은 builderfactory 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)