2017-01-13 6 views
0

私はコードを書ける最良の方法を知りました。Javascriptコードを書く方が良い

シナリオ1:

function main() { 
    var arr = []; 
    performSomeLogic(arr); 
} 

function performSomeLogic(arr) { 
    var sum = 0; 

    for (var i = 0; i < arr.length; i++) { 
     sum += arr[i]; 
     // some more logic 
    } 

    for (var i = 0; i < arr.length; i++) { 
     sum += arr[i]; 
     // some other logic 
    } 
} 

シナリオ2:あなたが最初のシナリオで見ることができるように

function main() { 
    var arr = []; 
    performSomeLogic(arr); 
} 

function performSomeLogic(arr) { 
    var sum = 0; 
    sum = commonLoop(true, arr); 
    sum = commonLoop(false, arr); 
} 

function commonLoop(flag, arr) { 
    var sum = 0; 
    for (var i = 0; i < arr.length; i++) { 
     sum += arr[i]; 
     if(flag){ 
      // some more logic 
     } else { 
      // some other logic 
     } 
    } 
    return sum; 
} 

我々は持っている唯一の2つの機能(メインとperformSomeLogic)と第二中シナリオには3つの関数があり、コードはモジュール化されています(main、performSomeLogic、およびcommonLoop)。

どのコーディング方法が優れていますか?

+0

あなたが最初にゼロに 'sum'をリセット必要ですシナリオ? – tsh

+0

最初のものは読みやすく、両方の関数の全体的な複雑さは同じ+ 2番目のアプローチでは、すべての繰り返しに対して余分なif-else条件があります –

+0

コードを関数に分割したい – Mairaj

答えて

2

可能な限り、方法は1つのことを行うべきだと思います。個々のステップにより良い意味を伝えることができるように、メソッドを保持してください。 これはあなたの主な方法をよりクリーンで読みやすくすると感じていますが、それはおそらくもっと冗長でしょう。

function main() { 
    var arr = []; 
    var sum; 
    sum += performFirstLogic(arr); 
    sum += performSecondLogic(arr); 
} 

function performFirstLogic(arr) { 
    var sum = 0; 

    for (var i = 0; i < arr.length; i++) { 
    sum += arr[i]; 
    // some more logic 
    } 

return sum; 
} 

function performSecondLogic(arr) { 
    var sum = 0; 

    for (var i = 0; i < arr.length; i++) { 
    sum += arr[i]; 
    // some more logic 
    } 

    return sum; 
} 

場合によっては、機能を簡単にするために関数を渡す機会があるかもしれません。

function main() { 
    var arr = []; 
    var sum; 
    sum += processLoop(arr, firstLogic); 
    sum += processLoop(arr, secondLogic); 
} 

function processLoop(arr, customLogic) { 
    var sum = 0; 

    for (var i = 0; i < arr.length; i++) { 
    sum += arr[i]; 
    customLogic(arr[i]); 
    } 

return sum; 
} 

function firstLogic(data) { 
    //First lot of logic 
} 

function secondLogic(data) { 
    //First lot of logic 
} 

あなたの感想は異なる場合があります。

0

短い答えは:

コードは何をするのか:

ロング回答依存しますか?ループ内で発生しているロジックは緊密に関係していますか?それはまったく別の仕事ですか?これは、読みやすさについてのすべてです

シナリオ1(変更)

function main() { 
    var arr = []; 
    performSomeLogic(arr); 
} 

function performSomeLogic(distinctData, uniqueData) { 
    var sum = 0; 

    sum += clearlyPerformDistinctTask(distinctData); 

    sum += clearlyPerformUniqueTask(uniqueData); 
} 

function clearlyPerformDistinctTask(arr) { 

    for (var i = 0; i < arr.length; i++) { 
     sum += arr[i]; 
     // some more logic 
    } 

    return sum; 
} 


function clearlyPerformUniqueTask(arr) { 

    for (var i = 0; i < arr.length; i++) { 
     sum += arr[i]; 
     // some more logic 
    } 

    return sum; 
} 

は、次のバージョンを考えてみましょう!小規模なタスクを、正確に言う機能とその機能だけに分解してください。別のロジックを独自のきちんとした小さなボックスに移動する方が良いでしょう。コードを乱雑にしないでください!すべてが1つの巨大な手続きになることはできません!

2つのループがまったく異なるタスクを実行する場合は、それらをまとめてパラメータを切り替えないでください。

しかし、ロジックがしっかりと関連している場合:

シナリオ2(変更)

function main() { 
    var arr = []; 
    performSomeLogic(arr); 
} 

function performSomeLogic(data) { 
    var sum = 0; 

    sum += clearlyPerformTaskWithOptions(data, { sumType: "X"}); 
    sum += clearlyPerformTaskWithOptions(data, { sumType: "Y"}); 
} 

function clearlyPerformTask(arr, options) { 

    for (var i = 0; i < arr.length; i++) { 
     if (options.sumType == "X") 
      sum += arr[i]; 
     else if (options.sumType == "Y") 
      sum += 2 * arr[i]; 
     else 
      sum -= 4; 
     // some more logic 
    } 

    return sum; 
} 

すると、それが一緒のグループにあなたのロジックを意味を成していますか?データセットは同じですか?それは同じ役割を果たしますが、異なる手段で達成していますか?あなたがそれを読むと意味がありますか?

これらは、コードを整理する際に考慮する必要があるすべての質問です。

0

それはあなたがやろうとしているかは不明だと、なぜ、あなたはここにreduce method on arraysためのいくつかの用途を見出す可能性があるため、あなたの質問は少し混乱して:

function main() { 
    var arr = []; 
    var sum = arr.reduce(sumAndDoLogic, 0); 
    // do stuff with sum 
} 

function sumAndDoLogic(sum, currentValue) { 
    if (/* something about currentValue */) { 
    // do some logic 
    } else { 
    // do some different logic 
    } 
    return sum + currentValue; 
} 
関連する問題