스칼라에서 외부 라이브러리를 사용하고 있습니다. 스칼라에서는 일련의 특성을 사용하여 복잡한 구성 옵션을 다른 방법으로 전달합니다. 이것은 Highcharts Scala API이지만 문제는 좀 더 일반적인 것으로 보입니다.스칼라 (Highcharts lib)의 메소드에서 반환 된 값 수정하기
라이브러리는 여러 필드를 저장하고 전달할 수있는 데이터 전송 객체 인 특성 (실제 사용의 경우 HighchartsOptions)을 정의합니다. 간단하고 명확하게 일반화 된 코드는 다음과 같습니다
trait Opts {
def option1: Int = 3
def option2: String = "abc"
//Many more follow, often of more complex types
}
는만큼 옵션의 전체 집합을 한 곳에서 생성 할 수 있습니다,이 깔끔한 구문을 허용 :
val opts = new Opts() {
override val option1 = 5
//And so on for more fields
}
doSomething(opts)
그러나,있다 하나의 코드가 그러한 구성을 준비하지만 다른 코드는 하나의 옵션을 추가로 조정해야하는 몇 가지 상황이 있습니다. 일부 Opts
인스턴스를 메소드에 전달하고 메소드가 값을 2 개 수정하게하는 것이 좋을 것입니다.
원래 특성은 var
s가 아닌 def
s를 기반으로하므로 위의 예와 같이 개체 유형이 알려진 경우에만 옵션의 값을 쉽게 재정의 할 수 있습니다. 메서드가 일부 익명 하위 클래스 Opts
의 인스턴스 만받는 경우 어떻게 다른 인스턴스를 만들거나받은 인스턴스를 수정하여 예를 들어 option2
이 다른 값을 반환 할 수 있습니까? 원하는 작업은 Mockito's spy
과 비슷하지만 조롱 프레임 워크를 사용하여이 효과를 얻는 것보다 다소 인위적인 방법이 있어야한다고 생각합니다.
추신 : 사실 저는 도서관의 저자가 그러한 인터페이스를 사용하여 약간 놀랐습니다. 그래서 아마도 저는 뭔가를 놓치고 있으며, 단일 옵션 집합을 만드는 목표를 달성하는 완전히 다른 방법이 있습니다. 코드의 여러 다른 장소 (예 : 변경 가능하고 완성 된 HighchartsOptions
대신 전달할 수있는 일부 빌더 객체)?
이 솔루션이 가장 우아하다고 생각합니다. 매크로가있는 것도 유혹을 불러 일으키고 더 적은 코드가 필요하지만 표준이 아닌 (지금은) 확장에 달려 있습니다. –