Существуют ли шаблоны для написания библиотеки, которая скрывает реализацию системы акторов? - PullRequest
0 голосов
/ 10 июня 2018

Все реализации системы акторов, которые я видел (в основном с использованием Akka), предполагают наличие веб-приложения, то есть HTTP-интерфейс, который вполне может обслуживаться асинхронной системой акторов.

Но что, если янаписание настольного приложения или библиотеки, которая будет использоваться в качестве компонента независимого от платформы приложения?

Я хочу, чтобы клиентские подпрограммы могли вызывать val childObj = parentObject.createChild( initParam ), не зная о моих разрешенных типах сообщений, илиактерская система в целом.например, Not parentObject ! CreateChild( initParam ), а затем обработать ответ, полученный в другом сообщении.

Я знаю, что могу скрыть асинхронные ответы за Futures, но существуют ли другие известные шаблоны для синхронной системы, передающей вычисления скрытомусистема акторов?

(я понимаю, что это приведет к блокировке вызова в библиотеку.)

1 Ответ

0 голосов
/ 10 июня 2018

Настольное приложение

Многое, что относится и к библиотекам, также применимо и здесь, поэтому посмотрите на раздел ниже.Если ничего другого, вы можете обернуть часть своего кода, которая использует Akka как отдельную библиотеку.Одно предостережение в том, что если вы используете Swing, вы, вероятно, захотите использовать SwingUtilities.invokeLater, чтобы вернуться к потоку диспетчеризации событий до взаимодействия с графическим интерфейсом.(Кроме того, не блокируйте этот поток. Возможно, вы захотите использовать фьючерсы, чтобы избежать этого, поэтому подумайте о том, чтобы спроектировать вашу библиотеку так, чтобы она возвращала фьючерсы.)

Библиотека

В вашем примере предполагается, чтообертка вокруг ваших актеров или, по крайней мере, дизайн снизу вверх, где ваш интерфейс определяется деталями вашей реализации.Вместо этого спроектируйте библиотеку более нисходящим способом, сначала выяснив интерфейс библиотеки, а затем (возможно) используя Akka в качестве детали реализации.(Это хорошая идея для проектирования библиотеки в целом.) Если вы уже написали что-то с использованием Akka, не беспокойтесь, просто спроектируйте интерфейс отдельно от реализации и сшейте их вместе.Если вы сделаете это, вам не понадобится конкретный шаблон, поскольку применяется обычный шаблон дизайна интерфейса, независимо от того, используете ли вы Akka.

В качестве примера рассмотрим компилятор.Подпись метода компиляции может быть простой:

def compile(sources: List[File]): List[File]  // Returns a list of binaries

Никаких упоминаний об актерах здесь.Но это может сделать:

compileActor ? Compile(sources)

... и заблокировать результат.Актер основного компилятора может зависеть от других акторов, но нет причин показывать их через публичный API.

...