2013-08-30 31 views
0

我有兩個功能。我該如何重構這兩個功能?

function markAsPerforming(orderInd) { 
    if (confirm('confirm?')) { 
     $.get('server.php', {'action':'markAsPerforming', 'ind':orderInd}, function(data) { 
      if (data != 'ok') { 
       alert(data); 
       loadOrders(); 
      } else { 
       loadOrders(); 
      } 
     }); 
    } 
} 

function deleteOrder(orderInd) { 
    if (confirm('confirm?')) { 
     $.get('server.php', {'action':'delOrder', 'ind':orderInd}, function(data) { 
      if (data != 'ok') { 
       alert(data); 
       loadOrders(); 
      } else { 
       loadOrders(); 
      } 
     }); 
    } 
} 

主要區別在於函數的名稱,confirm()中的問題和get請求中'action'字段中的問題。我認爲重構這些功能的更好方式將它們合併爲一個。是對的嗎?如何更好地將它們合併爲單個?將它們結合起來有意義嗎?

+0

在您的代碼示例中,即使確認消息也是一樣的。你只需要編寫一個單獨的函數來獲取額外的「action」參數。 –

+4

乍一看,除了''action''值之外,它們完全相同。重構不明顯嗎? –

+0

你可能會嘗試http://codereview.stackexchange.com – meagar

回答

2

重構成單個函數肯定有意義。只要給它一個更通用的名稱,必要時採取第二action參數和第三confirm參數:

function orderAction(orderInd, action, confirm) { 

    if (confirm(confirm)) { 
     $.get('server.php', {'action': action, 'ind':orderInd}, function(data) { 
      if (data != 'ok') { 
       alert(data); 
      } 
      loadOrders(); 
     }); 
    } 
} 

編輯

更新按照戴夫的建議。還包括確認消息的第三個參數。

+1

增量多餘的'loadOrders'也應該被取出,並且我可以將它扁平化以刪除確認流嵌套。 –

+0

哦,是的,好點,戴夫:) –

+0

其實,你能否詳細說明確認流程嵌套部分? (如果更簡單,請隨時更新我的​​答案,或發佈新答案) –

1

您可以重構這個樣子,哪裏actionNm將等於delOrdermarkAsPerforming

function onConfirm(orderInd, actionNm) { 
if (confirm('confirm?')) { 
    $.get('server.php', {'action':actionNm, 'ind':orderInd}, function(data){ 
     if (data != 'ok') { 
      alert(data); 
      loadOrders(); 
     } else { 
      loadOrders(); 
     } 
    }); 
} 
} 
2

我覺得這種方式有點更多的語義。你有兩個單獨的動作共享一些功能。

function markAsPerforming(orderInd) { 
    if (confirm('confirm?')) { 
     doGet("markAsPerforming", orderInd); 
    } 
} 

function deleteOrder(orderInd) { 
    if (confirm('confirm?')) { 
     doGet("delOrder", orderInd); 
    } 
} 

function doGet(action, orderInd) { 
    $.get('server.php', {'action':action, 'ind':orderInd}, function(data) { 
      if (data != 'ok') { 
       alert(data); 
       loadOrders(); 
      } else { 
       loadOrders(); 
      } 
    }); 
} 

這是不是一個好主意有一個大功能有很多參數。最好有很多小函數被另一個分組函數調用。它更加語義化,更容易維護小功能,而不是增加更多參數。

繼續在同一個概念,你可以進一步重構:

function doGet(action, orderInd) { 
    $.get('server.php', {'action': action, 'ind':orderInd}, success); 
} 
function success(data) { 
    if (data != 'ok') { 
     alert(data); 
    } 
    loadOrders(); //loadOrders was being called regardless of data, so I took it out 
} 

注意,你現在有4個功能,而不是2,但他們都進行了非常具體的任務。最終,這一切取決於你認爲你需要改變這個功能的程度,以及你認爲它們會隨着時間的推移而增長多少。例如,將來您可能需要在服務器中調用不同的url來執行不同的操作,將doGet分成兩個不同的函數並烘焙(硬編碼)每個操作的參數是有意義的。或者你可能想添加一個錯誤處理程序,這會更好地作爲一個sepparate函數而不是混亂$ .get調用。

無論如何,這是一般性的建議,當你開始編寫更大的程序時,這將開始變得更有意義。我知道很難抵制創建「god objects」這樣做的誘惑,因爲事情從小事情開始看起來很容易理解,但最終最好的辦法是避免這樣做,並且傾向於代碼可讀性和可保持性。

+0

這是我最喜歡的答案:) –

+0

好!謝謝。我是初學者開發人員。 – Nikita