Написание приложений с участием Scala

Теперь я написал несколько приложений с участием scala, и меня интересует, как люди подошли или столкнулись с некоторыми из проблем, с которыми я столкнулся.

Множество классов сообщений или!?

У меня есть актер, который реагирует на операцию пользователя и должен вызывать что-то. Скажем, react сообщение UserRequestsX(id). Постоянная проблема заключается в том, что, поскольку я хочу модулизовать свои программы, один актер сам по себе не может завершить действие без привлечения других участников. Например, предположим, что мне нужно использовать параметр 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)
}

Но теперь у меня есть 2 проблемы:

  • Мне нужно создать дополнительные классы сообщений для представления одного и того же запроса (т.е. "сделки с отчетами" ). На самом деле у меня есть три в этом сценарии, но у меня может быть намного больше - это становится проблемой отслеживания этих
  • Что я должен назвать первым и третьим сообщением ReportTrades? Сложно назвать их как ReportTrades (или если я это сделаю, я должен поместить их в отдельные пакеты). По существу, нет такой вещи, как overloading класс по типу val.

Есть ли что-то, что мне не хватает? Могу ли я избежать этого? Должен ли я просто отказаться и использовать !?. Используют ли люди какую-то организационную структуру, чтобы выяснить, что происходит?

Ответ 1

Для меня ваше сообщение ReportTrades смешивает два разных понятия. Один - это запрос, заказ - это ответ. Например, они могут быть названы GetTradesReport(Date) и SendTradesReport(List[Trade]). Или, может быть, ReportTradesByDate(Date) и GenerateTradesReport(List[Trade]).

Ответ 2

Есть ли возражения против использования 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)))
}

соответственно.