В настоящее время я поддерживаю пару Scala-приложений на основе акторов, и один вопрос, который я постоянно задаю: Кто отправляет это сообщение?
Например, я нахожу кусок кода, который печатает страшное сообщение, которое я нашел в журналах:
case ReportFailedUpdates(stuff) =>
log("The horror! The horror! " + stuff)
dieHorribly()
и я хочу узнать, в чем может быть причина. Если бы я не использовал актеров, я мог бы нажать Ctrl+Alt+H
(по крайней мере, в Eclipse) и узнать, кто "вызвал" этот "метод" (и кто вызвал то, и кто вызвал это). Что касается актеров, я обнаруживаю, что ищу ! ReportFailedUpdates(
, чтобы узнать, какие актеры отправляют это сообщение, затем ищу отправителей сообщения, на которое реагировал актер, и т. д. (и обычно рисуя результат на бумаге). Это имеет два недостатка:
- Это медленнее, так как Eclipse выполняет текстовый поиск по (потенциально многим) проектам, и мне приходится записывать материал
- Это не обязательно находит все вхождения, так как, возможно, это было отправлено с
!?
, или, может быть, кто-то поставил два пробела между!
иReportFailedUpdates
, или, или, или....
Что мне понравилось, так это некоторая инструментальная поддержка, которая позволяет мне выяснить, откуда могло прийти сообщение — примерно эквивалент иерархии вызовов для кода, не основанного на актерах.
Есть ли инструменты, которые это делают? Является ли это особенностью ScalaIDE для Eclipse, которую я просто не обнаружил? Если я буду использовать IntelliJ, станет ли моя жизнь лучше?
Обновить
Мой пример может ввести в заблуждение. Речь идет не только о выяснении того, что пошло не так, когда все рушится — я часто делаю это, когда беру в руки новую систему и мне нужно выяснить, как она работает. Похоже, что еще нет инструмента для этого. Думаю, мне придется подумать о том, как вы могли бы начать статически извлекать (и, возможно, визуализировать) граф потока сообщений...