2012-05-23 3 views
3

scala으로 첫 걸음을 내고 있습니다.액터를 사용할 때 사례 클래스 정의 위치

나는 이미지를 다운로드하여 캐시에 저장하는 PhotosLoaderActor을 만들었습니다. 이렇게하려면 CacheActorDownloadActor이 있어야합니다.

PhotosLoaderActor이 있습니다

override def act() { 
    loop { 
    react { 
     case (caller : Actor, photoToLoad:String) => { // bla bla } 

난 그냥이 같은 것을 사용하는 case classes을 사용할 수 배웠 :

case class LoadImage(caller: Actor, photoToLoad: String) 
override def act() { 
    loop { 
    react { 
     case LoadImage(caller, photoToLoad) => { // bla bla } 

내 질문은 :

가 어디는 case classes을 정의해야합니다을 ? PhotosLoaderActor을 다른 패키지에서 호출하는 경우 액터를 가져 오면 case classes? 가장 좋은 방법은 무엇입니까?

답변

10

나는 몇 가지 다른 접근법을 시도해보고 모든 관련 메시지를 일반적으로 XyzProtocol과 같은 이름의 객체에 넣는 것으로 정했습니다. 예를 들어

:

object PhotoProtocol { 
    case class LoadImage(caller: Actor, photoToLoad: String) 
    case class UpdateCache(photoToLoad: String, photo: Photo) 
    case object ClearCache 
} 

나는이 몇 가지 이유에 대한 접근 같은 통합 개발 환경 또는 ScalaDoc에 하나, 포함하는 패키지를 스캔

  1. 을, 단지 1 또는 몇 XyzProtocol 보여줍니다 개체를 수십 개의 메시지로 흩 뜨리는 대신

  2. 시간이 지남에 따라 메시지를 처리하는 데 필요한 액터 수가 변경되면 (예 : 액터 풀 소개 또는 다른 액터 하위 트리에 대한 간접 참조) 메시지에 영향을 미치지 않습니다.

  3. 액터 클래스 내부에서 사례 클래스를 정의 할 때와 같이 액터 인스턴스가 우연히 캡처되지 않습니다. 이 우발적 인 캡처는 배우 클래스 내부의 사례 클래스를 절대로 정의하지 않을만큼 충분한 이유입니다.

참고 : 메시지 순수 (예를 들면, 내부 신호 자체가 자신에게 전송) 배우의 내부 구현 세부 경우 I 액터 클래스 컴패니언 객체에서 메시지를 정의한다.

추신. 표준 라이브러리 액터에서 Akka로 이동하는 것도 좋습니다. Akka는 Scala 2.10 배포판에 추가 될 것입니다.

1

나는 종종 그들을 그것을 사용하는 액터 위에 정의합니다. 또는 여러 사례가 동일한 경우에 일치하는 경우 해당 사례 클래스 전용 파일에 있습니다.

package org.numbers 
import akka.actor.Actor 

sealed trait Numbers 
case class Even(n: Int) extends Numbers 
case class Odd(n: Int) extends Numbers 

class NumberActor extends Actor { 
    def receive = { 
    case Even(n) => doEven(n) 
    case Odd(n) => doOdd(n) 
    } 

    def doEven = ... 
    def doOdd = ... 
} 

스칼라 액터 대신 akka를 사용합니다. 이렇게하면 액터가 포함 된 패키지를 가져 오면 해당 액터로 보낼 수있는 메시지도 가져옵니다. 사례 클래스가 액터의 "내부"에 정의되어 있으면 해당 액터로 메시지를 보내려는 다른 클래스에서 사용할 수 없게됩니다.

1

액터가 싱글 톤 객체 인 경우 객체 자체에 넣을 수 있습니다.

관련 문제