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 とする必要性は特に無かったようです。
また、別のオブジェクトで同名のメソッドを終了の代理通知の依頼 (命令) として使っていましたので、意味の一貫性の点からも良い変更だろうと思います。