0

我有两个类似的函数,它们都需要相同的参数检查

function doThis(foo, bar) {
    if (foo.length === 0) foo = 'foo';
    if (bar.length === 0) bar = 'bar';

    foo = encodeURI(foo);
    bar = encodeURI(bar);

    // ... some other checks and enforcements...

    // Output as alert
    alert(foo + bar);
}

function doThat(foo, bar) {
    if (foo.length === 0) foo = 'foo';
    if (bar.length === 0) bar = 'bar';

    foo = encodeURI(foo);
    bar = encodeURI(bar);

    // ... some other checks and enforcements...

    // Output on console
    console.log(foo + bar);
}

什么是干燥的正确方法?我想出了这个:

function paramsCheck(foo, bar) {
    if (foo.length === 0) foo = 'foo';
    if (bar.length === 0) bar = 'bar';

    foo = encodeURI(foo);
    bar = encodeURI(bar);

    // maybe some other checks and enforcements...

    return { foo: foo, bar: bar };
}

function doThis(foo, bar) {
    var params = paramsCheck(foo, bar);

    // Output
    alert(params.foo + params.bar);
}

function doThat(foo, bar) {
    var params = paramsCheck(foo, bar);

    // Output
    console.log(params.foo + params.bar);
}

但我对此并不满意。我宁愿将参数作为引用传递给paramsCheck(),所以我可以直接修改它们而不是返回一个新对象。

4

2 回答 2

2

这可能会奏效,尽管根据您给出的建议,我会建议这样的事情:

function paramsCheck(params) {
    var l = params.length, i;
    for( i in params) if( params.hasOwnProperty(i)) {
        params[i] = encodeURI(params[i] === 0 ? i : params[i]);
    }
}
function doThis(foo,bar) {
    var params = {foo:foo,bar:bar};
    paramsCheck(params);
    // now do stuff
}

此解决方案更灵活,因为它不对输入进行假设,因此您可以非常轻松地添加第三个参数。

于 2013-06-27T08:28:45.610 回答
1

你可以做

function doThis(foo, bar) {
    foo = clean(foo, 'foo');
    bar = clean(bar, 'bar');

    // ... some other checks and enforcements...

    // Output as alert
    alert(foo + bar);
}

function clean(value, defaultValue){
    if (value.length === 0) value = defaultValue;
    return encodeURI(value);
}
于 2013-06-27T08:28:15.073 回答