【问题标题】:Getting rid of redundant method definitions摆脱多余的方法定义
【发布时间】:2015-03-20 14:35:36
【问题描述】:

我用于路由构建的每个 HTTP 请求方法都有对应的四种方法。

每种方法的方案是:

RouteBuilder.prototype.>>METHOD<< = function (params, callback) {
    if(typeof params === "function") {
        callback = params;
        router.>>METHOD<<(this._path, callback);
        return;
    }

    var subRoute = params.subRoute || "";
    var url = this._path + subRoute;
    if(params.auth !== undefined) {
        router.>>METHOD<<(url, Auth.authenticate(params.auth, { session: false }), callback);
    } else {
        router.>>METHOD<<(url, callback);
    }
};

您可能怀疑这些方法的名称是:get、post、put 和 delete。 目前我有四个几乎相同的方法定义,我正在寻找更优雅的方法。

我考虑过使用关键参数创建一个带有方法名称的数组并将方法映射到它,但是在循环中创建函数似乎不是一个好主意。我还需要这些方法与 JSDoc 兼容。

【问题讨论】:

  • 是的,如果你想创建很多类似的函数,循环创建它们。这没有什么问题!

标签: javascript function oop optimization


【解决方案1】:

好吧,我会发布一个答案,因为你已经完成了 99% 的工作。您在问题中发布的代码非常接近您正在寻找的通用解决方案:

RouteBuilder.prototype.route = function (method, params, callback) {
    if(typeof params === "function") {
        callback = params;
        router[method](this._path, callback);
        return;
    }

    var subRoute = params.subRoute || "";
    var url = this._path + subRoute;
    if(params.auth !== undefined) {
        router[method](url, Auth.authenticate(params.auth, { session: false }), callback);
    } else {
        router[method](url, callback);
    }
};

RouteBuilder.prototype.get = function(params, callback) {
    this.route("get", params, callback);
};

RouteBuilder.prototype.put  = function(params, callback) {
    this.route("put", params, callback);
};

RouteBuilder.prototype.post = function(params, callback) {
    this.route("post", params, callback);
};

RouteBuilder.prototype.del = function(params, callback) {
    this.route("del", params, callback);
};

【讨论】:

    【解决方案2】:

    我想过创建一个带有方法名称的数组并将方法映射到它,使用 key 参数,但在循环中创建函数似乎不是一个好主意。

    这种方法没有错,非常简单有效:

    ['get', 'post', 'put', 'delete'].forEach(function(METHOD) {
        RouteBuilder.prototype[METHOD] = function (params, callback) {
            if(typeof params === "function") {
                callback = params;
                router[METHOD](this._path, callback);
                return;
            }
    
            var subRoute = params.subRoute || "";
            var url = this._path + subRoute;
            if(params.auth !== undefined) {
                router[METHOD](url, Auth.authenticate(params.auth, { session: false }), callback);
            } else {
                router[METHOD](url, callback);
            }
        };
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-15
      • 2011-08-21
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      相关资源
      最近更新 更多