我有一个要求用户成为所有者或管理员的功能。有些命令仅供所有者使用,而不是管理员,但所有者也可以运行管理命令。
我发现我只是为两个部分重复相同的代码。有没有办法巩固这个,所以我不违反重复自己的规则?
这是我所拥有的一般方案:
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;
}
});
我可以看到上面的解释是如何造成一些混乱的,所以我会尝试清除它。有多个可用的脚本,一些用于所有者,一些用于管理员(也可以由所有者运行)。这些权限保存在数据库中,我通过发出请求得到它。这就是为什么我不能为管理员和所有者设置所有者和事物的原因,因为在我从数据库中获得结果之前,我不知道脚本的权限。这些权限由所有者设置,我无法跟踪它们。我修改了代码以试图更清晰。
答案 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);
}