設定オブジェクトパターンをクラスのコンストラクタに適用する

関数の引数が多くなると、パラメータの順序を覚えたり、オプションパラメータの扱いづらくなります。

/* before */
// 定義
function test(arg1, arg2, opt_arg3, opt_arg4, opt_arg5) { ... }
// 実行
test(a, b, c, d);

そこで引数に辞書オブジェクトを与えて、パラメータを分かりやすく扱えるようにするのが設定オブジェクトです。

/* after (設定オブジェクト) */
// 定義
function test(conf) { ... }
// 実行
test({'arg1': a, 'arg2': b, 'arg3': c, 'arg4': d});

詳細:JavaScriptパターン -優れたアプリケーションのための作法- (P.81)


Closure Library でクラスを定義するとき、設定オブジェクトを用いると以下のような形式が考えられます。

goog.provide('model.Test');

/** @constructor */
model.Test = function (conf) {
    // required
    this.arg1 = conf.arg1;
    // required
    this.arg2 = conf.arg2;
    // required
    this.arg3 = conf.arg3;
    // option
    if (goog.isDefAndNotNull(conf.arg4)) {
        this.arg4 = conf.arg4;
    } else {
        this.arg4 = 'default value';
    }
    // option
    if (goog.isDefAndNotNull(conf.arg5)) {
        this.arg5 = conf.arg5;
    } else {
        this.arg5 = 'default value';
    }
}

// 実行
var test = new model.Test({'arg1': a, 'arg2': b, 'arg3': c, 'arg4': d});

辞書オブジェクト conf をクラス側で提供することも考えましたが、引数を毎回コピーするのは不自然だと感じ、呼び出し側で conf を作成するようにしました。

必須引数を代入した後は、goog.asserts.assert(this.arg1) を挟んだほうが安全かもしれません。

Google API Expertが解説する Closure Libraryプログラミングガイド

Google API Expertが解説する Closure Libraryプログラミングガイド