去掉多余的方法定义

Getting rid of redundant method definitions

本文关键字:方法 定义 多余      更新时间:2023-09-26

有四个方法对应于我用于路由构建的每个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。目前我有四个几乎相同的方法定义,我正在寻找更优雅的方法。

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

好吧,我会发布一个答案,因为你已经完成了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);
};

我考虑过创建一个带有方法名称的数组,并使用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);
        }
    };
});