この次のコードは、Backbone.js の Events#off()から取得したものです。
理解しやすいように IF 部分を単純化するにはどうすればよいですか?
for (i = list.length - 2; i >= 0; i -= 2) {
if (!(callback && list[i] !== callback || context && list[i + 1] !== context)) {
list.splice(i, 2);
}
}
この次のコードは、Backbone.js の Events#off()から取得したものです。
理解しやすいように IF 部分を単純化するにはどうすればよいですか?
for (i = list.length - 2; i >= 0; i -= 2) {
if (!(callback && list[i] !== callback || context && list[i + 1] !== context)) {
list.splice(i, 2);
}
}
var noCallback = callback && list[i] !== callback;
var noContext = context && list[i + 1] !== context;
if(! noCallback && ! noContext){...}
または、コメントでアドバイスされているように否定を削除するには:
var callbackCheck = !callback || list[i] === callback;
var contextCheck = !context || list[i + 1] === context;
if(callbackCheck && contextCheck ){...}
いくつかのブール演算:
!(callback && list[i] !== callback || context && list[i + 1] !== context)
!(!(!callback || list[i] === callback) || !(!context || list[i + 1] === context))
(!callback || list[i] === callback) && (!context || list[i + 1] === context)
否定接続法標準形よりも、選言標準形の方がはるかに理解しやすいと思います。
単一の部分を理解しやすくするために、話し言葉の変数名を使用します (これの範囲はわかりません。もっと良いものが見つかるかもしれません)。
var rightCallback = !callback || list[i] === callback;
var rightContext = !context || list[i + 1] === context;
if (rightCallback && rightContext) {…}
ステートメントをわかりやすい名前の関数にカプセル化することをお勧めします(何をしたいのかわかりません)。
if (true == meaningfulConditionName(list, callback))
{
list.splice(i, 2);
}
これ以上単純化することはできません:
for (i = list.length - 2; i >= 0; i -= 2) callback && list[i] !== callback || context && list[i + 1] !== context || list.splice(i, 2)
これが私のバージョンで、すべての Backbone.js テストに合格し、元のバージョンよりも遅くなります。
if(
// callback defined, context is null
// remove callback for all context
( callback && list[i] === callback
&& !context)
// callback defined and context is defined
// ie remove specified callback for specified context
|| ( callback && list[i] === callback
&& context && list[i+1] === context)
// callback NOT defined and context is defined
// ie removed all callback for specific context
|| ( !callback && list[i] !== callback
&& context && list[i+1] === context )
// callback NOT defined and context NOT defined
// i.e. removed everything, this is unreachable code
// as it is caught by
// https://github.com/documentcloud/backbone/blob/master/backbone.js#L112
// and https://github.com/documentcloud/backbone/blob/master/backbone.js#L103
|| ( !callback && !context )
) {
// remove callback and context
list.splice( i, 2 );
}