2015-01-10 2 views
3

저는 C++ 프로그램 중 하나를 스칼라로 이식하고 있습니다. 이 프로젝트에는 조직 된 계층 구조에 수백 개의 사용자 정의 클래스가 있습니다. 스칼라 규칙에 따라 최상위 추상 클래스 중 하나를 봉인하면 해당 클래스의 모든 하위 유형에 대한 정의를 봉인 된 클래스/특성과 동일한 파일에 넣어야합니다. 내 클래스 계층 구조 중 하나에 대해서는 약 30 개의 클래스 정의를 해당 파일에 두는 것을 의미합니다.많은 하위 유형이있는 클래스 씰링

내 C++ 프로그램에서이 30 개의 클래스는 자체 헤더 및 구현 파일에 있으므로 유지 관리 및 읽기가 쉬워졌습니다. 30 개 클래스/객체의 정의를 스칼라 애플리케이션의 한 파일에 넣으면 유지 보수 및 읽기가 어려워 질까 우려됩니다.

클래스를 봉인 한 이유는 이러한 유형의 패턴 일치가 철저히 검색 될 수 있기 때문입니다. Scala 클래스 계층을 구성하는 것과 관련하여 올바른 방향으로 나를 안내 할 수있는 도움을 주시면 감사하겠습니다.

+0

클래스의 서브 클래스가 많은 경우 (케이스 30에 있음) 클래스를 봉인하지 않아야합니다. 다시 하위 클래스로 만들 때마다 변경할 필요가 없습니다. –

답변

2

가정 수업처럼 (파일이 증가 할 수있다) 많은 방법이 대소 클래스, 당신은 타입 클래스를 사용하여 구현에서 별도의 정의를 시도 할 수 있습니다 (그러나 때때로 컴파일러의 성능을 afffect 수)입니다

Model.scala

sealed trait A 
case class A1(a: Int) extends A 
case class A2(a: Int) extends A 
case class A3(a: Int, b: Int) extends A 
... 
case class A1(a: Int) extends A 

ImplA1.scala

package org.impl 
implicit class ImplA1(a: A1) { 
    def method1() = a.a + a.a 
} 

ImplA2.scala

package org.impl 
implicit class ImplA2(a: A2) { 
    def method1() = a.a * 2 
} 

사용법 :

import org.impl._ 
val a1 = new A1 
a1.method1() 
3

그것은 별도의 클래스에서이 작업을 수행 할 수있는 약간의 고통이,하지만 그것은 하나 개의 큰 파일에 모든 것을하는 것보다 덜 고통스러운 수 있습니다. 먼저 모든 파일을 함께 컴파일해야합니다. 그런 다음이 없는지 밀봉되어 있는지 확인 파일에서 다음을 수행하십시오

trait GenericA { def foo: Int } 
sealed trait A extends GenericA 
case class B() extends A with ImplB {} 
case class C() extends A with ImplC {} 
... 

트릭 슈퍼 클래스의 모든 (당신이 원하는 경우 대신 형질의 추상 클래스 일 수있다)이가는 것입니다 GenericA에 하지만 실제로는 코드를 사용하여GenericA을 사용하면 A 만 사용하면됩니다.

// File #1 
trait ImplB extends GenericA { def foo = 7 } 

// File #2 
trait ImplC extends GenericA { def foo = 4 } 

... 

지금 당신은 당신의 구현 (년 Generica 만 표현 될 수있는 적어도 그 부분을) 밖으로 분리가 : 지금, 당신은과 같이 정의 된 각 구현을 별도의 파일의 무리를 작성할 수 있습니다.

사용할 수있는 사례 클래스 매개 변수가 필요한 경우 어떻게합니까? 문제 없습니다 - 특성의 일부로 이들을 포함하십시오. 두 지점의 경우 클래스 매개 변수를 반복해야하기 때문에

// Main file 
case class D(i: Int) extends A with ImplD {} 

// Separate file 
trait ImplD { 
    def i: Int 
    def foo = i*3 
} 

그것은 추가 작업의 비트,하지만 귀하의 경우 그것은 가치가있을 수 있습니다.

관련 문제