如果声明包含权限检查

时间:2017-10-18 11:06:55

标签: logic

我在编写需要检查一种累积权限的特定if语句时遇到一些麻烦,并且类似于它会是这样的:

  • 员工有2个属性:Alpha和Beta;
  • Alpha可以是XNULL,Beta可以是ABCNULL;
  • 要检查员工是否可以进入特定房间,我们需要检查该特定员工是否可以访问该房间:
    • 客房的Alpha属性为yes或no属性,Beta属性的每个值(Alpha = X [Y / N],Beta = A [Y / {{1 }},Beta = B [N / Y],Beta = C [N / Y]);
    • 如果员工的属性Alpha设置为N,则Beta设置为任意内容且房间设置为[Alpha = X - > X]员工可以进入那个房间;
    • 如果员工的属性Alpha设置为Yes,则Beta设置为X且房间有[Alpha = X - > NULL]员工无法进入那个房间;
    • 如果员工的属性Alpha设置为No,Beta设置为X,则房间的[Alpha = X - > A]和[Beta = A - > No]员工可以进入那个房间,最后
    • 如果员工的属性Alpha设置为Yes,Beta设置为X,则房间的[Alpha = X - > A]和[Beta = A - > No]员工无法进入该房间

我的问题是:我在一个循环中有一个巨大的if语句,它在房间内运行,向员工列出可用的房间。任何人都可以建议一个新的外观吗?

1 个答案:

答案 0 :(得分:0)

而不是:

master_access = {}
for each employee in employees
    access = {}

    for each room in rooms
        if employee_has_access(employee, room)
            access.add(room)

    master_access.add(access)

return master_access

您可以执行类似

的操作
for each room in rooms
    if room.Alpha then alpha_rooms.add(room)
    if room.Beta.A then beta_a_rooms.add(room)
    else if room.Beta.B then beta_b_rooms.add(room)
    else if room.Beta.C then beta_c_rooms.add(room)

master_access = {}
for each employee in employees do
    access = {}
    if employee.Alpha == 'X' then access = access union alpha_rooms
    if employee.Beta == 'A' then access = access union beta_a_rooms
    else if employee.Beta == 'B' then access = access union beta_b_rooms
    else if employee.Beta == 'C' then access = access union beta_c_rooms
    master_access.add(access)

return master_access

第一个样本 - 也许你在做什么 - 员工和房间数量是O(er),而第二个样本更像是O(e + r)(或者,至少可以更像是constexpr bool f(const char *&s) { do { ++s; } while (*s); return true; } constexpr bool g(const char *s) { return f(s); } int main() { static_assert(g("x"), ""); } 如果您愿意预先计算所有六个房间列表并在第二个循环中添加一层嵌套来直接选择每个员工的房间列表。