使用权限而不重复代码

时间:2017-10-30 16:22:33

标签: javascript node.js

我有一个要求用户成为所有者或管理员的功能。有些命令仅供所有者使用,而不是管理员,但所有者也可以运行管理命令。

我发现我只是为两个部分重复相同的代码。有没有办法巩固这个,所以我不违反重复自己的规则?

这是我所拥有的一般方案:

request(checkPermissionRequest, function (error, response, body) {
    // Determine who is allowed to run the script
    switch (body[0].permission) {
        // Owner
        case 0:
            if (isOwner(user)) {
            // Script code
            }
            break;
        // Admin
        case 1:
            if (isOwner(user) || isAdmin(user)) {
                // Script code
            }
            break;
    }
});

更新

我可以看到上面的解释是如何造成一些混乱的,所以我会尝试清除它。有多个可用的脚本,一些用于所有者,一些用于管理员(也可以由所有者运行)。这些权限保存在数据库中,我通过发出请求得到它。这就是为什么我不能为管理员和所有者设置所有者和事物的原因,因为在我从数据库中获得结果之前,我不知道脚本的权限。这些权限由所有者设置,我无法跟踪它们。我修改了代码以试图更清晰。

3 个答案:

答案 0 :(得分:1)

您设计脚本的方式,您的权限级别由整数表示。让我们利用这一点。

让我们定义一个这样的辅助函数:

function getUserPermissions(user) {
    if(isOwner(user) return 0;
    if(isAdmin(user) return 1;
    return 2; // or some arbitrarily high value- heck, even Number.MAX_SAFE_INTEGER
}

然后,您可以简单地执行以下操作,而不是需要一个开关和一堆if语句:

request(checkPermissionRequest, function (error, response, body) {
    // Determine who is allowed to run the script
    if(getUserPermissions(user) < parseInt(body[0].permission) {
        // do the script
    }
});

如果遵循这种模式,你也可以考虑切换0和1,如果你能够,那么更高的数值表示更高的权限级别 - 如果只是为了便于阅读,因为它允许-1值表示没有权限的人。在这种情况下,您可能希望更改if条件以检查getUserPermissions(user) > parseInt(body[0].permission而不是<

另一方面,如果你使用稍微不那么可读的<选项,那么允许添加其他权限级别的权限,而不是管理员3等等,而不必增加现有的所有者和管理员级别。

答案 1 :(得分:0)

你可以嵌套if,只是从第一个数据块中排除'admin'。

if (isOwner(user) || isAdmin(user)) { 
    //some permissions for both
    if(isOwner(user)) { 
        //more permissions just for owner 
    }
}

答案 2 :(得分:0)

int g(const int& q) {
  return q;
}

int main() {
  int (*f)(int&) = static_cast<int(*)(int&)>(g); // breaks
  int x = 1;
  return f(x);
}