编写Javascript代码的更好方法

时间:2017-01-13 06:39:54

标签: 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个函数(main和performSomeLogic),在第二个场景中,我们有3个函数,代码已经模块化(main,performSomeLogic和commonLoop)。

哪种编码方式更好?

3 个答案:

答案 0 :(得分:2)

我认为方法应尽可能做一件事。保留您的方法,以便您可以为各个步骤传达更好的意义。 我觉得这会使你的主要方法更清晰,更易读,但不可否认它可能更冗长。

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
}

你的milage可能会有所不同。

答案 1 :(得分: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;
}

关于可读性的全部内容!将较小的任务分解为完全正确且仅执行其操作的功能。最好将不同的逻辑移到自己整洁的小盒子里,不要弄乱你的代码!一切都不可能是一个巨大的程序!

如果两个循环执行完全不同的任务,请不要将它们放在一起,如果不清楚且相关的逻辑,请在参数之间切换!

但是,如果逻辑紧密相关:

场景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;
}

将逻辑分组在一起是否有意义?数据集是否使用相同?它是通过不同方式实现同​​样的作用吗?你读它时有意义吗?

这些是您在组织代码时必须考虑的所有问题。

答案 2 :(得分: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;
}