2009-08-21 3 views
6

저는 스칼라 액터를 사용하여 몇 가지 응용 프로그램을 작성했으며 사람들이 내가 겪은 문제 중 일부에 접근하거나 처리하는 방법에 관심이 있습니다.스칼라 액터를 실제로 사용하여 응용 프로그램 작성하기

과다한 메시지 클래스 또는!?

나는 사용자 조작에 반응하고 어떤 일이 일어나야 만하는 액터가 있습니다. 메시지 UserRequestsX(id)react을 말합니다. 내가 가진 계속되는 문제는 프로그램을 모듈화하기를 원하기 때문에 하나의 배우 만이 다른 배우를 포함시키지 않고 액션을 완료 할 수 없다는 것입니다. 예를 들어, id 매개 변수를 사용하여 많은 값을 검색해야한다고 가정하면 다른 액터를 통해 삭제해야합니다. 일반적인 Java 프로그램을 작성했다면 다음과 같이 할 수 있습니다.

public void reportTrades(Date date) { 
    Set<Trade> trades = persistence.lookup(date); 
    reportService.report(trades); 
} 

어느 정도 간단합니다. 그러나 액터를 사용하면 !?을 사용하지 않기 때문에 약간의 고통이됩니다. 한 배우가 ReportTrades(date) 메시지에 반응하지만 PersistenceActor에 거래를 요청한 다음 ReportActor에보고해야합니다. 나는 반응 블록이 그래서

react { 
    case ReportTrades(date) => 
     persistenceActor ! GetTradesAndReport(date) 
} 

것을 내 PersistenceActor에 :

react { 
    case GetTradesAndReport(date) => 
     val ts = trades.get(date) //from persietent store 
     reportActor ! ReportTrades(ts) 
} 

을하지만 지금은이 문제가 :

    를 내가이 일을 찾은 유일한 방법은하는 것입니다
  1. 같은 요청을 (예 : "보고서 거래")로 표시하려면 추가 메시지 클래스를 만들어야합니다. 사실이 시나리오에서는 3 가지가 있지만 더 많은 것을 가질 수 있습니다. 이러한 문제를 추적하는 것이 문제가됩니다.
  2. 첫 번째 메시지와 세 번째 메시지는 무엇이라고해야합니까? ReportTrades? 그것들을 모두 ReportTrades이라고 부르는 것은 혼란 스럽습니다 (또는 내가하는 경우, 나는 그것들을 별도의 패키지에 넣어야합니다). 기본적으로 val 유형별로 overloading 클래스가 없습니다.

내가 빠진 것이 있습니까? 이 문제를 피할 수 있습니까? 방금 포기하고 사용해야합니까? !? 사람들은 어떤 일이 벌어지고 있는지 명확히하기 위해 일부 조직 구조를 사용합니까?

+0

"반응"에서 영구 저장소에 직접 액세스하는 것이 안전합니까? 네가 방해 행위를 할 수 없다고 생각 했어.어쩌면 특정 배우에게 "받기"가 필요할 수도 있습니다. –

답변

2

내게는 ReportTrades 메시지가 두 가지 다른 개념을 혼합하고 있습니다. 하나는 요청이고, order는 응답입니다. 예를 들어, 이름은 GetTradesReport(Date)SendTradesReport(List[Trade]) 일 수 있습니다. 또는 ReportTradesByDate(Date)GenerateTradesReport(List[Trade]) 일 수 있습니다.

+0

그러나 내 견해는 여전히 유효합니다. 나는이 모든 수업을 데이터를 전달하는 것 외에는 사용하지 않는다. 어제 나는 4 명의 분리 된 배우들로부터 정보로 요청을 "장식"할 필요가있는 몇 가지 코드를 썼다. 의미있는 이름 지정을 허용하더라도 혼란 스럽습니다! –

+0

음, 이러한 클래스는 정보를 전달하는 용도로만 사용되지 않습니다. 그들은 목적을 위해 한 장소에서 다른 장소로 정보를 전달하는 데 사용됩니다. 그에 따라 이름을 지정하면 코드의 전체적인 가독성이 향상됩니다. –

0

reply을 사용하는 데 약간의 이의가 있습니까? 또는 주위에 trades을 전달 하시겠습니까? 그렇게하지 않으면, 여러분의 코드는 아마도 각각

react { 
    case ReportTrades(date) => persistenceActor ! GetTrades(date) 
    case Trades(ts) => // do smth with trades 
} 

react { 
    case GetTrades(date) => reply(Trades(trades.get(date))) 
} 

과 같을 것이다.

+0

필자의 요점은 내 트렌드 오브젝트를 내 코디네이터에게 다시 전달할 수는 없다는 것입니다. * 어떤 원래 명령이 호출되었는지 어떻게 알 수 있습니까? * 예를 들어, 내가해야 할 일이 몇 가지 있습니다. * DeleteTrades *, * ReportTrades *, * LoadTrades * 등 코디네이터는'SomeTradesToReport','SomeTradesToDelete' 또는'SomeTradesToLoad'와 같은 응답을 받아야합니다 ('!?'를 피한다고 가정) –

관련 문제