Motoko では, 可変状態は常にアクタにプライベートであることを思い出して下さい.
Recall that in Motoko, mutable state is always private to an actor.
しかし, 二つのアクタはメッセージ・データを共有することはできますし, メッセージがアクタ (自分自身と相手) を参照することもできます. さらにメッセージは個々の関数も参照できます (shared
関数ならば) .
However, two actors can share message data, and those messages can refer to actors, including themselves and one another. Additionally, messages can refer to individual functions, if those functions are shared
.
このような機構を通じて, 二つのアクタの非同期メッセージ交換による振る舞いの協調が可能になります.
Through these mechanisms, two actors can coordinate their behavior through asynchronous message passing.
この節の例題では, 公開-購読パタン のさまざまな変種に焦点を当てて, アクタがどうやって関数を共有するのかを説明します. 公開-購読パタンでは, 公開 アクタが 購読 アクタのリストを記録し, 公開者の状態に注目すべき何かが起きたときにはそのリストのアクタに通知します. 例えば, 公開アクタが新しい投稿を公開したら, 購読アクタは新しい投稿があったことを知らされます
The examples in this section illustrate how actors share their functions by focusing on variations of the publish-subscribe pattern. In the publish-subscribe pattern, a publishing actor records a list of subscriber actors to notify when something notable occurs in the publisher’s state. For example, if the publisher actor publishes a new article, the subscriber actors are notified that a new article is available.
下の例題は Motoko の二つのアクタを使って, 公開者と購読者の関係の変種を作成します.
The example below uses two actors in Motoko to build variations of the publisher-subscriber relationship.
このパタンを使って動いているプロジェクトの完全なコードは, examples repository にある [pubsub](https://github.com/dfinity/examples/tree/master/motoko/pubsub の例を見てください.
To see the complete code for a working project that uses this pattern, see the pubsub example in the examples repository.
下の Subscriber
アクタ型は, 購読側アクタと公開側アクタのそれぞれ公開と呼び出しのインタフェイスとして考えられるものです.
The following Subscriber
actor type provides a possible interface for the subscriber actor and the publisher actor to expose and to call, respectively:
type Subscriber = actor {
notify : () -> ()
};
Publisher
はこの型を使って, 購読者をデータとして保存するためのデータ構造を定義する
各 SUbscriber
アクタは Subscriber
アクタ型のシグネチャに定義された notify
更新関数を公開する
The Publisher
uses this type to define a data structure to store its subscribers as data.
Each Subscriber
actor exposes a notify
update function as described in the Subscriber
actor type signature above.
副型付けをすれば, Subscriber
アクタはこの型定義には含まれていないようなメソッドでも追加して入れられることを付記しておきます.
Note that sub-typing enables the Subscriber
actor to include additional methods that are not listed in this type definition.
簡単にするために, notify
関数は関連する通知データを受け付け, 購読者側の何らかの新しい状態メッセージを公開者側に返すものとします. 例えば, 購読者側は通知データに基づいて, 購読の設定の変更を返したりするかもしれません.
For simplicity, assume that the notify
function accepts relevant notification data and returns some new status message about the subscriber to the publisher. For example, the subscriber might return a change to its subscription settings based on the notification data.
コードの公開者側では, 購読者の配列を保存します. 簡単にするために, 各購読者は一度 subscribe
関数を使ったら購読に登録されると言うことにします.
The publisher side of the code stores an array of subscribers. For simplicity, assume that each subscriber only subscribes itself once using a subscribe
function.
import Array "mo:base/Array";
actor Publisher {
var subs: [Subscriber] = [];
public func subscribe(sub: Subscriber) {
subs := Array.append<Subscriber>(subs, [sub]);
};
public func publish() {
for (sub in subs.vals()) {
sub.notify();
};
};
};
この後, 何らかの不特定の外部エージェントが publish
関数を起動すると, 購読者全員に上の Subscriber
型で定義したとおり notify
メッセージが届くことになります.
Later, when some unspecified external agent invokes the publish
function, all of the subscribers receive the notify
message, as defined in the Subscriber
type given above.
もっとも単純な場合には, 購読者アクタは以下のメソッドを持ちます:
init
メソッドで, 公開者からの通知を購読するSubscriber
型の notiry
関数で定義したとおり, 通知を受け取るcount
変数に格納した通知の数を返す get
メソッド) を許すIn the simplest case, the subscriber actor has the following methods:
init
method.notify
function in the Subscriber
type given above).get
method for the number of notifications received and stored in the count
variable.次のコードはこれらのメソッドを実装したものです:
The following code illustrates implementing these methods: