JavaScript ライブラリを作成しています。私はチェーンを実装しようとしています。
0: 最初に思いついたこと:
function V(p) {
return {
add : function(addend) { return V(p + addend); },
sub : function(subtra) { return V(p - subtra); },
};
}
この方法を使用すると、簡単に連鎖できます。
V(3).add(7).sub(5) // V(5)
残念ながら、結果は常にラップされた V() 関数です。結果の値をこの方法で抽出することはできません。そこで、この問題について少し考えて、2 つの半解決策を思いつきました。
1: 最後のメソッドにフラグを渡します
function V(p, flag) {
if(flag)
return p;
else
return {
add : function(addend, flag) { return V(p + addend, flag); },
sub : function(subtra, flag) { return V(p - subtra, flag); }
};
}
このメソッドを使用すると、最後に使用したメソッドにフラグを渡すことでチェーンを終了できます。
V(3).add(7).sub(5, true) // 5
これは問題なく機能しますが、コードの繰り返しが必要になり、チェーンが読みにくくなり、コードが洗練されなくなります。
2: start() および end() メソッドの使用
_chain = false;
function V(p) {
function Wrap(w) {
return (_chain) ? V(w) : w;
}
return {
add : function(addend) { return Wrap(p + addend); },
sub : function(subtra) { return Wrap(p - subtra); },
start : function() { _chain = true; },
end : function() { _chain = false; return p; }
};
}
このメソッドを使用すると、コードを追加せずに単一の操作を実行できます。
V(3).add(7) // 10
しかし、連鎖にはさらに 2 つの方法が必要であり、読みにくくなります。
V(3).start().add(7).sub(5).end() // 5
したがって、基本的には、チェーンをライブラリに実装するための最良の方法を探しているだけです。理想的には、任意の数のメソッドを使用でき、洗練されていない方法でチェーンを終了する必要がないものを探しています。
V(3).add(7).sub(5) // 5, perfect chaining