如何在Javascript中提取包含return语句的通用逻辑?

时间:2012-05-02 14:10:56

标签: javascript refactoring

这是我的代码:

function function1() {
    var ids = GetIds(); // predefined function
    if (ids.length === 0) {
        alert("Please select at least one item to procees.");
        return;
    }

    ...
}

function function2() {
    var ids = GetIds(); // predefined function
    if (ids.length === 0) {
        alert("Please select at least one item to procees.");
        return;
    }

    ...
}

function function3() {
    var ids = GetIds(); // predefined function
    if (ids.length === 0) {
        alert("Please select at least one item to procees.");
        return;
    }

    ...
}

如何提取公共部分?如何重新考虑代码?退货声明很难处理。是否有任何与重新考虑此代码有关的模式?

提前致谢!

    if (ids.length === 0) {
        alert("Please select at least one item to procees.");
        return;
    }

3 个答案:

答案 0 :(得分:2)

这非常适合decorator pattern

function decorateGetId(f) {
  return function () {
    var ids = GetIds();
    if (ids.length === 0) {
      alert("Please select at least one item to process.");
      return;
    } else {
      return f(ids);
    }
  };
}

然后

function function1(ids) {
  // ...
}
function1 = decorateGetId(function1);

或我的偏好,因为函数语句在吊装时会发生奇怪的事情。

var function2 = decorateGetId(function (ids) {
  // function 2 body ...
});

答案 1 :(得分:0)

你做不到。您唯一能做的就是将alert()移到GetIds()。但是,在这种情况下,函数名称会有点混乱。

var ids = GetIds();
if(!ids) return;

或者你可以改变它:

GetIds(function(ids) {

});

您的GetIds功能会看起来像像这样:

function GetIds(callback) {
    var ids = ....;
    if(!ids) alert('...');
    else callback(ids);
}

答案 2 :(得分:0)

你可以尝试:

function checkId(ids) {
    if (ids.length === 0) {
        alert("Please select at least one item to procees.");
        return false;
    }
    return true;
}

function function1() {
    var ids = GetIds();
    if (!checkId(ids)) return;

    // More code here
}