将DRY应用于整个文件中的多个循环

时间:2014-11-15 16:29:16

标签: javascript optimization dry

我目前正在学习并尝试应用干净和模块化代码的原则。当我编写应用程序时,我注意到我使用相同的代码在不同的函数中循环使用相同的JSON对象。

for(var i = 0; i < myJSONData.length; i++) {
    // do stuff with myJSONData[i]
}

这在整个应用程序中变得多余。

var myJSONData = [/* array of objects */];

var myFunc = function() {
    for(var i = 0; i < myJSONData.length; i++) {
        // do stuff with myJSONData[i]
    }
}

var anotherFunc = function() {
    for(var i = 0; i < myJSONData.length; i++) {
        // do different stuff with myJSONData[i]
    }
}

我如何在这里应用DRY原则并且只写一次循环?

2 个答案:

答案 0 :(得分:2)

您提供的示例看起来很好。在几个函数中有一个类似的循环并且这种重复类型不一定是个问题是很常见的,只要循环中的代码不重复。

但您也可以考虑重新组织如下。

function myFunc(item) {
    // do stuff with item
}
function anotherFunc(item) {
    // do stuff with item
}
//...
myJSONData.forEach(myFunc);
// ...
mYJSONData.forEach(anotherFunc);

这样做的一个好的副作用是myJSONData可以在一个函数中定义,并且不需要具有更宽/全局的范围。 myFuncanotherFunc将一次只传递一个项目。

答案 1 :(得分:1)

这种模式很常见,而且经常是必要的。真正唯一不干的是for(...) {和结束}

这个术语是样板文件,它是代码,它增加了很少的语义值,但是必须将代码连接到语言。它通常不是DRY,它通常被认为是语言中的一个缺陷,而不是代码中的必须重复这些东西。

Javascript是一种可以解决此问题的语言。

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

变为

arr.forEach(foo);

所以你的代码会变成

jsonArray.forEach(function(a) { /* first loop */ });
// stuff
jsonArray.forEach(function(a) { /* second loop */ });

当用英语阅读时,重复自己是非常明智的。