Joe Armstrong の論文から、彼はアクター ベースのプログラムは次の 3 つの手順で設計する必要があると指定しました。問題は、ステップが実際の問題にどのように対応するか、またはそれらをどのように適用するかを理解していないことです。これがジョーの最初の提案です。
- 私たちは、現実世界の活動において、すべての真に同時の活動を識別します。
- 並行アクティビティ間のすべてのメッセージ チャネルを識別します。
- さまざまなメッセージ チャネルを流れるすべてのメッセージを書き留めます。それではプログラムを書いていきます。プログラムの構造は、問題の構造に正確に従っている必要があります。現実世界の各並行アクティビティは、プログラミング言語で正確に 1 つの並行プロセスにマップする必要があります。問題がプログラムに 1 対 1 でマッピングされている場合、そのプログラムは問題と同型であると言えます。
マッピングが正確に 1:1 であることが非常に重要です。その理由は、問題と解決策の間の概念的なギャップを最小限に抑えるためです。このマッピングが 1:1 でない場合、プログラムはすぐに劣化し、理解しにくくなります。この縮退は、CO 以外の言語を使用して並行問題を解決する場合によく見られます。多くの場合、プログラムを機能させる唯一の方法は、いくつかの独立したアクティビティを同じ言語スレッドまたはプロセスで制御することです。これにより、不可避的に明瞭さが失われ、プログラムが複雑で再現不可能な干渉エラーにさらされることになります。
1番は割とわかりやすいと思います。私が迷子になるのは#2(および3)です。私の欲求不満を説明するために、この要旨で利用可能な小さなサービスをスタブ化しました (コールバックを備えた Ruby サービス)。
そのサンプル サービスを見ると、#1 の答えがわかります。5つの同時サービスがあります。
- 始める
- ログインゲートウェイ
- ログアウトゲートウェイ
- 止まる
- 申し込む
これらのサービスの一部は、サービスの状態によっては機能しません (または機能しないはずです)。サービスが開始されていない場合、ログイン/ログアウト/購読は意味がありません。この種の状態情報は、Joe の 3 つのステップに関連していますか?
とにかく、その要旨のサンプル/モック サービスを考えると、誰かがこのサービスを Actory の方法でラップするプログラムをどのように設計するのか疑問に思っています。Joe の 3 つのステップを適用する方法に関するガイドラインのリストを確認したいと思います。いくつかのコード (任意の言語) を書くためのボーナス ポイント。