我怎样才能重构这两个函数?

时间:2013-08-30 13:41:46

标签: javascript

我有两个功能。

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'字段中的问题。我认为重构这些功能的更好方法是将它们组合成一个单独的。是对的吗?如何将它们统一为单身?合并它们有​​意义吗?

3 个答案:

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

修改

根据Dave的建议更新。还包括确认消息的第三个参数。

答案 1 :(得分: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”的诱惑所做的一切,因为事情从小事做起,似乎可以管理,但最终最好是避免这样做,并且有利于代码的可读性和可持续性。

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