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 请求中的“操作”字段中的问题。我认为重构这些函数的更好方法是将它们组合成一个。那正确吗?如何更好地将它们结合成一个单一的?将它们结合起来有意义吗?

4

3 回答 3

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();
        });
    }
}

编辑

根据戴夫的建议进行了更新。还包括确认消息的第三个参数。

于 2013-08-30T13:46:22.870 回答
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 拆分为两个不同的函数并烘焙(硬编码)每个操作的参数是有意义的。或者您可能想要添加一个错误处理程序,将其作为一个单独的函数而不是混乱 $.get 调用会更好。

无论如何,这是一般建议,随着您开始编写更大的程序,它会开始变得更有意义。我知道很难抗拒创建可以做所有事情的“上帝对象”的诱惑,因为事情开始时很小而且看起来很容易管理,但最终最好的办法是避免这样做,并有利于代码的可读性和可维护性。

于 2013-08-30T13:57:44.120 回答
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();
        }
    });
}
}
于 2013-08-30T13:46:59.600 回答