2008年11月09日

c++でメッセージ送信

ゲーム中に発生するイベントを、発生した場所から処理するオブジェクトへ伝えるために、c++では基本的にメンバ関数を使う。
だが、単純な構造の時は全然問題ないのだが、システムが複雑になってくると自機やステージみたいな重要なオブジェクトへのアクセス種類が増えてしまい、その結果インターフェースとしてのメンバ関数も増えてしまうことが良くある。
設計の教科書だとこういう場合は、ひとつのオブジェクトに処理を手中させずに処理ごとにクラスを分けるべきと書いてあるかもしれない。ただ素人じゃないので簡単に分割できるような処理だったら最初から別クラスで設計してあるだろう。そうでないものを無理やり分けてしまうとオブジェクト間の依存率が高いものになってしまい逆に全体の複雑さが増してしまう。そういう問題を解決するためのデザインパターンは……

っていうお堅い話じゃなくて、メンバ関数が多いなら入り口を一つにまとめちゃえば?ってのが今回思いついたアイディア。
もうイベント毎に新しいメンバ関数を追加するのは懲り懲りにゃ、基底にメッセージを受け取るインターフェースを一つ作っておくから今後はそこにお願い。

class Object {
public:
virtual void message(string s){
throw runtime_error("message失敗");
}
};


こんな感じ?後はメッセージの内容を継承先で動的に解析して処理しちゃえばいいのです。今時のC++は正規表現も使えるし……と思ったけどせめて解析を楽にするために関数名と引数ぐらいは分けておくか(あと引数を参照に)
virtual void message(const string& function, const vector<string>& arguments){...

なんかすべてのメッセージをこれで処理できそうな気がしてきた。それってどこかで見たことあるような……Smalltalkみたいなオブジェクト指向の原点に近いのか?

とは言え、さすがにすべてをこれで処理しちゃうと何がなんだか分からなくなりそうなので、ゲーム中におきるイベントや通信系イベント、Windowsメッセージみたいに用途を決めて使えば多少はコードがスッキリしないだろうか?と願いつつ、成功するのか微妙な結果に終わるのかはまた今度。
posted by 鶴 at 04:53| Comment(0) | TrackBack(0) | プログラム系
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/22613782

この記事へのトラックバック