2012-05-02 8 views
0

は私のコードです:Javascriptでreturn文を含む共通ロジックを抽出する方法は?ここ

function function1() { 
    var ids = GetIds(); // predefined function 
    if (ids.length === 0) { 
     alert("Please select at least one item to procees."); 
     return; 
    } 

    ... 
} 

function function2() { 
    var ids = GetIds(); // predefined function 
    if (ids.length === 0) { 
     alert("Please select at least one item to procees."); 
     return; 
    } 

    ... 
} 

function function3() { 
    var ids = GetIds(); // predefined function 
    if (ids.length === 0) { 
     alert("Please select at least one item to procees."); 
     return; 
    } 

    ... 
} 

共通部分を抽出するためにどのように?コードを再因子化する方法は? return文は非常に扱いにくいです。このコードを再因子に関連付けるパターンはありますか?

ありがとうございます!

if (ids.length === 0) { 
     alert("Please select at least one item to procees."); 
     return; 
    } 
+0

共通部分を含む関数を作成し、共通部分の代わりに関数を呼び出します。 "return"ステートメントを抽出することはできません。なぜなら、別の場所に移動すると、そのステートメントが置かれている場所で仕事をしないからです。 –

+1

共通部分は?しかし、3つの関数はすべて同じ関数本体を持っています。なぜあなたは同じ身体で3つの機能を持っていますか? .All the dots、私は見る... ':)' –

答えて

0

できません。あなたができる唯一のことはalert()GetIds()に移動することです。しかし、この場合、関数名はちょっと混乱します。

var ids = GetIds(); 
if(!ids) return; 

それともあなたはこのようにそれを変更することができます:

GetIds(function(ids) { 

}); 

あなたGetIds機能は、その後、例えばなりますこのように:

function GetIds(callback) { 
    var ids = ....; 
    if(!ids) alert('...'); 
    else callback(ids); 
} 
+0

しかし、コールバック関数のreturnステートメントはまだワークフローをmain関数に返します。 – zsong

+0

はい、そのバージョンでは、元の 'return'の後にすべてのコードをコールバック関数に入れることになっています。呼び出し関数で 'if(whatever)return; 'がなくても、呼び出し関数を別の関数から返すことは不可能です。 – ThiefMaster

0

あなたは試みることができる:

function checkId(ids) { 
    if (ids.length === 0) { 
     alert("Please select at least one item to procees."); 
     return false; 
    } 
    return true; 
} 

function function1() { 
    var ids = GetIds(); 
    if (!checkId(ids)) return; 

    // More code here 
} 
+0

GetIdsをcheckIdに移動してみませんか? – Bergi

2

これはdecorator patternに適しています。その後、

function decorateGetId(f) { 
    return function() { 
    var ids = GetIds(); 
    if (ids.length === 0) { 
     alert("Please select at least one item to process."); 
     return; 
    } else { 
     return f(ids); 
    } 
    }; 
} 

いずれか

function function1(ids) { 
    // ... 
} 
function1 = decorateGetId(function1); 

または私の好み、functionステートメントは、巻上で奇妙なことをしているため。

var function2 = decorateGetId(function (ids) { 
    // function 2 body ... 
}); 
関連する問題