包含反模式函数的对象中的参数太多了?

时间:2014-05-27 13:29:51

标签: javascript node.js design-patterns anti-patterns

在我的程序中,用户提供一个数组,用于定义循环中运行的函数。我有一堆必须传递给每个函数的变量。由于参数列表出现在许多地方,因此该列表似乎一直在增长并且变得难以维护。这是一些伪代码:

var fn_defs = {
    test_fn_1: function(test_var_1, test_var_2, test_var_3, test_var_4, test_var_5, cb){
        //...do stuff
    },
    test_fn_2: function(test_var_1, test_var_2, test_var_3, test_var_4, test_var_5, cb){
        //...do stuff
    },
    etc...
};

async.eachSeries(user_defined_list_of_function_names, function(fn, async_cb){
    var test_var_1, test_var_2, test_var_3, test_var_4, test_var_5;
    fn_defs[user_defined_list_of_function_names](test_var_1, test_var_2, test_var_3, test_var_4, test_var_5, function(result){
        async_cb();
    }, function(err){
        //end
    });
});

寻找更好的方法来做到这一点。我想我可以制作全局变量,但我想这也是一种反模式。

2 个答案:

答案 0 :(得分:2)

这种模式(函数的许多参数)在javascript中很常见。流行的JavaScript库中的许多函数都有很多参数。它们将这些参数括在一个对象中,该对象收集一个参数中的所有参数,并简化了给出可选参数。

例如,JQuery UI animate function,需要11个参数。所有参数都封装在一个对象中。传递缺少参数的对象将使用此参数默认值。

function dostuff(args){
    var def_args = {step: 1, state: 'PENDING', vas: function(){}};
    args = merge_options(def_args, args);

}

答案 1 :(得分:1)

如果您使用的是内部界面,则可以使用DTO(http://en.wikipedia.org/wiki/Data_transfer_object)进行总结,您可以创建一个简单的对象来对所有变量进行分组。