Написание приложений с участием 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)))
}
соответственно.