D3.js を学習しているときに、再利用可能なコード単位の背後にある主なデザイン パターンを説明するブログ投稿に出くわしました。関連するコードを以下に再現しました。以下に示すパターンは、D3 コードベースおよびプラグインで使用される方法とまったく同じです (例)。
このコードに関する私の 1 つの問題は、プロパティのコピーと貼り付けが非常に多いことです。JavaScript は関数型言語なので、ボイラープレート コードをリファクタリングできると思っていましたが、それを行う方法が思いつきません。arguments
パラメータとパラメータを共通の関数に渡すのは簡単ですが、プロパティとプロパティvalue
への参照を保持する方法が見つかりません。width
height
function chart() {
var width = 720, // default width
height = 80; // default height
function my() {
// generate chart here, using `width` and `height`
}
my.width = function(value) {
if (!arguments.length) return width;
width = value;
return my;
};
my.height = function(value) {
if (!arguments.length) return height;
height = value;
return my;
};
return my;
}
これが実際の D3 コードベースで行われているという事実は、リファクタリングが可能かどうか疑問に思いますが、これが優先度の高い問題ではないという単純な問題であることを願っています (そして、新しい貢献者はこれを行っています)。以前はそうだったからです)。
私が探しているのは、基本的にすべてのアクセサーの本体を次のものに置き換えることです:
my.height = function(value) {
return getSet(arguments, value, whatever);
};
呼び出し用のボイラープレートがまだいくつかありますが、少なくともロジックは一元化されており、必要に応じて 1 か所でのみ更新できます。