2010-12-18 70 views
3

我偶然發現自己在這個位置,我相信有一個更好的方式來做到這一點比我目前。更好的方法來編碼遞歸如果語句

在這個例子中,我試圖對一組有衝突項目的時間進行排序。我需要知道什麼時候是高優先級的,不能移動的,與低優先級的,可以移動的。 但我很確定這段代碼效率很低。

var holdLowPriorities = []; 

for (conflict = 0; conflict < sortedTimes.length - 1; conflict++) { 
    var firstConflictTimeStart = sortedTimes[conflict][0]; 
    var firstConflictTimeEnd = sortedTimes[conflict][1]; 
    var secondConflictTimeStart = sortedTimes[conflict + 1][0]; 
    var secondConflictTimeEnd = sortedTimes[conflict + 1][1]; 

    if (firstConflictTimeStart < secondConflictTimeEnd && 
      firstConflictTimeEnd > secondConflictTimeStart) { 
     // are either of the conflicts a high priority 
     var firstContactPriority = sortedTimes[conflict][2]; 
     var secondContactPriority = ortedTimes[conflict + 1][2] 

     if (firstConflictPriority == 2) { 
      //this is high priority, can't move 
     } 
     if (secondConflictPriority == 2) { 
      // this is also a priority, but has to move 
     } 
     // are either of the conflicts a low priority? 
     if (firstConflictPriority == 0) { 
      // this is a low priority so I can adjust the time 
     } else if (secondConflictPriority == 0) { 
      // this is a low priority so I can adjust the time 
     } 
    } 
} 

不幸的是,我甚至不知道怎麼稱呼這種類型的問題,因此不知道要尋找什麼,但我敢肯定的答案不是太複雜(我希望不是)。

+7

你可以使代碼更易於通過使用一些中間變量與準確的名稱 – 2010-12-18 01:47:07

+0

什麼是'sortedTimes'結構閱讀(很可能更有效)? – 2010-12-18 01:48:05

+2

哇,這是一個難以維護的代碼塊...... 10/10想要改進它......你一定要聽從米奇小麥的建議 - 一旦你有中間變量,編輯你的Q與更新碼。 – Basic 2010-12-18 01:51:51

回答

2

一個switch語句可能會幫助清理你的代碼位。

+0

然後,他將不得不寫多個switch語句,bec由於某種原因,他在他的if語句中有多個變量。另外,他只會被限制在字符串值而不是條件。 – Babiker 2010-12-18 02:05:24

+0

這不是在javascript中的情況,switch語句也需要表達式。 (查看鏈接) – 2010-12-18 02:09:11

+0

學到了一些新東西! +1 – Babiker 2010-12-18 02:16:59

1

就數據結構而言,if..else塊本身沒有任何低效率。即使嵌套if..else不是一個問題。在可讀性方面,這完全是另一回事。作爲一個經驗法則,嵌入的if..else塊很難嵌套(對於人來說,計算機當然對它們沒有問題)。

首先,我會跟米奇的建議,使用中間變量,以減少冗長的代碼去。就效率而言,它的內存效率肯定較低(儘管對於JavaScript來說,它可能會根據瀏覽器加速訪問)。但效率不是重點,代碼清晰度是。

其次,使用數組文本的語法,而不是new Array()holdLowPriorities.push([...])。再次,屏幕上的噪音越小,越容易看到發生了什麼。

第三,有幾個地方你正在做的是檢查某事的優先級。使用助手函數或方法來簡化代碼:checkProirity(sortedTimes,conflict,2)sortedTimes.checkProirity(conflict,2)。同樣,函數/方法調用本質上效率較低,但重點是爲了提高可讀性而改進代碼清晰度。

+0

謝謝Slebetman,我實際上在發佈時更改了代碼。我刪除了'新數組'的東西,因爲它實際上不是這個問題的一部分。使用幫助函數是一種解決方案,但我希望正確的答案比從輔助函數中獲取另一個變量更好。但也許這就是答案。 – pedalpete 2010-12-18 02:13:14

2

編輯:已經更改了問題,所以這個最變得無關緊要。

下面是對它的簡單說明。

var holdLowPriorities = []; 

for(conflict=0; conflict<sortedTimes.length-1; conflict++){ 
    var conflictTime = sortedTimes[conflict], 
     nextConflictTime = sortedTimes[conflict + 1]; 
    if (conflictTime[0] >= nextConflictTime[1] || conflictTime[1] <= nextConflictTime[0]) { 
    continue; 
    } 

    // are either of the conflicts a high priority 
    if (data[conflictTime[2]].stepsArr[conflictTime[3]].priority==2) { 
    alert(data[conflictTime[2]].stepsArr[conflictTime[3]]. 
    } 
    if (data[nextConflictTime[2]].stepsArr[nextConflictTime[3]].priority == 2) { 
    alert(data[nextConflictTime[2]].stepsArr[nextConflictTime[3]]. 
    } 

    // are either of the conflicts a low priority? 
    if (data[conflictTime[2]].stepsArr[conflictTime[3]].priority==0) { 
    holdLowPriorities.push([conflictTime[2], conflictTime[3], conflict]); 
    } else if (data[nextConflictTime[2]].stepsArr[nextConflictTime[3]].priority == 0) { 
    holdLowPriorities.push([nextConflictTime[2], nextConflictTime[3], conflict+1]) 
    } 

    //alert(data[nextConflictTime[2]].stepsArr[nextConflictTime[3]].prerequisite+' '+conflictTime[0]+' '+conflictTime[1]+' '+nextConflictTime[0]+' '+nextConflictTime[1]+' '+data[nextConflictTime[2]].stepsArr[nextConflictTime[3]].taskid+'/'+data[conflictTime[2]].stepsArr[conflictTime[3]].taskid); 
} 

然後,通過使用輔助方法和更多變量,可以使這更明顯。

function conflictData(conflict) { 
    return data[conflict[2]].stepsArr[conflict[3]; 
} 

var holdLowPriorities = []; 

for(conflict=0; conflict<sortedTimes.length-1; conflict++){ 
    var conflictTime = sortedTimes[conflict], 
     nextConflictTime = sortedTimes[conflict + 1]; 
    if (conflictTime[0] >= nextConflictTime[1] || conflictTime[1] <= nextConflictTime[0]) { 
    continue; 
    } 

    var thisConflictData = conflictData(conflictTime), 
     nextConflictData = conflictData(nextConflictTime); 

    // are either of the conflicts a high priority 
    if (thisConflictData.priority == 2) { 
    alert(thisConflictData); 
    } 
    if (nextConflictData.priority == 2) { 
    alert(nextConflictData); 
    } 

    // are either of the conflicts a low priority? 
    if (thisConflictData.priority == 0) { 
    holdLowPriorities.push([conflictTime[2], conflictTime[3], conflict]); 
    } else if (nextConflictData.priority == 0) { 
    holdLowPriorities.push([nextConflictTime[2], nextConflictTime[3], conflict+1]) 
    } 

    //alert(nextConflictData.prerequisite + ' ' + conflictTime[0] + ' ' + conflictTime[1] + ' ' + nextConflictTime[0] + ' ' + nextConflictTime[1] + ' ' + nextConflictData.taskid + '/' + thisConflictData.taskid); 
} 

當我這樣表達時,我認爲你可以開始看到可能的錯誤;如果高優先級具有conflictTime和nextConflictTime檢查,如果低優先級具有if,否則如果。這是需要的嗎?然後,您可能可以將此/下一個衝突優先級放入交換機中,或者重新組織代碼。但我認爲它現在處於可以更容易理解的階段。

+0

感謝克里斯,我發現它是非常有趣的,大多數建議是關於代碼的可讀性,而不是一種不同的方式來編寫代碼,我沒有意識到的功能(除開關)或類似的東西。也許我不像程序員那樣糟糕,只是冗長的代碼。 – pedalpete 2010-12-18 03:50:35