シーンによるプロジェクトの分割を考えるにあたり、メッセージに求められる条件を考えました。
(「シーンによるプロジェクトの分割」と呼んでいるのは、ゲーム自体を複数のシーンに分けて作業性を高め、分割・結合を簡単にできるようにすることです。ゲーム全体を一つのマネージャー(ゲーム全体のデータを管理する構造体)に管理させるだけでなく、全てのシーンが揃っていなくても、最低限のシーンだけでテストができるようにします。)
概要
1) シーン間で送り合うメッセージの形態について考えた時に、メッセージと送り先をどう定義したらいいかで悩んだ。
2) 究極的には、送り先まで含めたメッセージはシステムの中でユニーク。メッセージは自然数(ID)でも良いし、文字列(ハッシュ)でも良い。文字列がハッシュ(ほぼユニーク)として機能しない場合、システムの外に管理台帳を置くことが前提。
3) 一般的な傾向として、メッセージ、送り先がそれぞれユニークかユニークでないかで、4種類に分類できる。それぞれ目的が異なる。また、日常的にメッセージを発する時、4種類を無意識に使い分けている。
メッセージの目的
特定の受け側に特別な何かを要求する、または受け側が何かするために合図をかけてもらうために送ります。
メッセージと送り先
メッセージは、受け側(送り先)とセットになります。
メッセージの型
メッセージがシステム内で一意に解釈できる(ユニーク)場合、送り先が省略できます。この場合、メッセージに送り先が暗黙的に含まれます。
メッセージがシステム内で一意に解釈できない(ユニークでない)場合、メッセージに一意さを求める追加の情報(文脈)、または送り先が必要です。一意に解釈できない、というのは、解釈に揺らぎがある、拡張性があるなどを指します。この場合、メッセージに追加の情報が追加されます。送り先も、この中に含まれます。
メッセージと行動の決定
これまでの記述をまとめると、以下になります。
(1) プログラムの世界では、メッセージは常に誰かに何らかのアクションを起こしてもらうために送ります。
(2) メッセージがユニークとは、特定の行動を誘発するかどうかを指します。
送り先がユニークとは、相手が特定できる(=特定の相手にしか意味を持たない)かどうかを指します。
(3) 誰かにメッセージを送りたい時、そのメッセージは、少なくとも特定の個人しか意味を持たなかったり、あえて相手を特定しなかったりします。送り先とメッセージの組み合わせで、以下の4種類に分かれます。
ブロードキャスト
特定の相手でなくても意味を持つが、特定の行動を誘発するのは、たとえば緊急警報、避難指示、迷子のお知らせなど(ブロードキャスト)です。
あいまいな指示
メッセージが特定の相手にしか意味を持たないが、そのメッセージだけで特定の行動を誘発できないものは、たとえばスローガンやプロパガンダ(背景や文脈が分からないと行動を起こせない言葉)です。その組織に属して、あの上司が言っているのだから、きっとこういう意味だろう、となります。メッセージを受けた相手は、さらに上司に説明を求めるか、あるいは思考停止(無視)します。
情報拡散、あるいは謎
メッセージが特定の相手でなくても意味を持ち、また特定の相手でなくても意味を持つものがあるとすれば、それは拡散情報です。たとえば新聞などの状況説明やゴシップ、ネット上などでのさらしなどでしょうか。そこから誘発される行動は、情報発信者からは想像もつかないので謎です。
システムにおけるメッセージの使い分け
システムにおけるメッセージの使い方として、最も一般的に使われるのは、特定のタスク/スレッドに対するサービス開始/終了などの指示です。これは特定のタスクのメールボックスにメッセージを投げ込んで使います。タイマーもこれに含まれます。
メッセージがユニークであること
任意のサービスから他のサービスにメッセージを送る場合、送り先まで含めたメッセージはシステム全体でユニークである必要があります(そうでないと複数の相手にメッセージが届いてしまう)。通常、複数の人数で開発を進める場合、開発者間のやり取りのため、システムの外に管理台帳を置きます。
もし、目的のサービスが存在しない場合、目的のサービスに近いサービスが代理応答するケースを考えた時、代理応答するサービスは、どの送り先に向けて送られたどのメッセージを代理応答するか決めます。その時、複数の解釈ができてしまうと、代理応答に失敗します。その意味でも、送り先を含めたメッセージはシステム全体でユニークである必要があります。
ユニークを作る方法は少なくとも2つあります。一つは台帳管理(通し番号=自然数)、もう一つはハッシュ(=文字列)です。文字列に、十分な命名規則があり、メッセージ名が重複しない場合、ハッシュでシステムを構成できます。そうでない場合は、システムの外に台帳を持つのが一般的と思いました。
(以上)