让我们假设我们在社交网络中有隐私选项页面;两组单选按钮。
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可以解决这个问题,但结果会有非常复杂的控制结构。
有什么好的解决方案吗?
谢谢
答案 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;
}