群体或无线电按钮之间的依赖关系,最佳做法?

时间:2010-08-26 15:09:09

标签: algorithm

让我们假设我们在社交网络中有隐私选项页面;两组单选按钮。

Allow to post on wall  p  f  c  (groupA)
Allow to view wall     p  f  c  (groupB)

p = public
f = only friends
c = closed

很明显,这些复选框之间存在依赖关系。例如,当groupB = c时,我们应自动设置groupA = c;观察墙已关闭,因此墙面评论表格也应该关闭等等。

使用多个if可以解决这个问题,但结果会有非常复杂的控制结构。

有什么好的解决方案吗?

谢谢

3 个答案:

答案 0 :(得分:0)

您拥有2组权限,“写入”权限的限制永远不会低于read。 如果(0 - 无访问权限,1-有限[仅限朋友],2 - 公共访问权限),则在更改GroupB中的值后,验证GroupA值可能看起来像GroupA.value = (GroupA.value <= GroupB.value) ? GroupA.value : GroupB.value。 GroupB - 读取权限,GroupA - 写入权限。

答案 1 :(得分:0)

定义一个用于查看的位掩码,以及另一个用于发布的位掩码,每个位用于公共和朋友(仅关闭意味着两个位都设置为0)。设置为1的位允许访问,设置为0的位拒绝访问。

AND带有“view”位掩码的“post”位掩码,以确保“view”位掩码中清除的所有位也在“post”位掩码中清零。

在像C或C ++这样的东西中,这看起来像这样:

unsigned view;
unsigned post;

enum { friends = 1, public = 2 };

view = friends;
post = friends | public;    // create an invalid combination
post &= view;               // correct the invalid combination;

答案 2 :(得分:0)

您还可以在结构中定义比较并检查函数中的每个条目。

我的意思是C中的那样:

#define ACCESS_CLOSED 0
#define ACCESS_FRIEND 1
#define ACCESS_PUBLIC 2

typedef struct dep {
    int *master;
    int masterval;
    int *slave;
    int slaveval;
} dep_t;

int checkdeps(dep_t *deps, int n)
{
    int i;

    for (i=0; i<n; i++) {
        if (*(deps[i].master) == deps[i].masterval)
            *(deps[i].slave) = deps[i].slaveval;
    }
}

int main(void)
{
    int groupA = ACCESS_FRIEND;
    int groupB = ACCESS_FRIEND;
    int groupC = ACCESS_FRIEND;

    // if  the first argument has the value of the second argument
    // then the third is set to the value from the fourth
    dep_t deps[] = {
        { &groupB, ACCESS_CLOSED, &groupA, ACCESS_CLOSED },
        { &groupB, ACCESS_FRIEND, &groupC, ACCESS_CLOSED }
    };

    groupB = ACCESS_CLOSED;
    checkdeps(deps, sizeof(deps)/sizeof(dep_t));

    printf("A: %d, B: %d, C: %d\n", groupA, groupB, groupC);

    return 0;
}