Command Pattern 改定

前回のコマンド・パターンの記事のちょっとしたアップデートです。

The Pragmatic Programmers が提唱する "Tell Don't Ask" の原則というものがあります。Java World にも同趣旨のコラムがあり、「オブジェクトに情報を尋ねるのではなく、情報を持っているオブジェクトに仕事をしてもらうべきだ」という OO プログラミング上の望ましい慣習を提唱しています。

これに習いまして、コマンド実行の箇所において、コマンドが同期か非同期かを問い合わせる、とした部分を次のように変更してみました。

Command.Center.Manager:

    exec_command: function ()
    {
	var comd = this.get_command();
	if (comd)
	{
	    this.__at_work++;
	    comd.execute();
	    comd.notify_when_done();  // <- ココ
	}
	else
	    this.exec_finalizer();
    },

Command.Abstract:

    notify_when_done: function ()
    {
	if (!this.__async)
	    this.done();
    }

notify_when_done を、『問い合わせ兼 setter』ではなく、『命令』としました。この方が見た目にもスッキリしますね。"__async" の値はクラスの初期化メソッドで設定すれば良いですし、実際、値を後から変更したいケースに出くわしたことも無く、setter とする必要性は特に無かったようです。

また、別のオブジェクトで同名のメソッドを終了の代理通知の依頼 (命令) として使っていましたので、意味の一貫性の点からも良い変更だろうと思います。