代码之家  ›  专栏  ›  技术社区  ›  Kirzilla

组或单选按钮之间的依赖关系,最佳实践?

  •  0
  • Kirzilla  · 技术社区  · 14 年前

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

    Allow to post on wall  p  f  c  (groupA)
    Allow to view wall     p  f  c  (groupB)
    
    p = public
    f = only friends
    c = closed
    

    很明显,这组复选框之间存在依赖关系。例如,我们应该自动设置groupA= c 当B组= ;查看墙已关闭,因此墙注释窗体也应关闭,依此类推。

    使用大量的if可以解决这个问题,但是我们的控制结构会非常复杂。

    有什么好办法吗?

    3 回复  |  直到 14 年前
        1
  •  0
  •   a1ex07    14 年前

    read . 如果(0-无访问权限,1-有限[仅限好友],2-公共访问权限),则在更改GroupB验证GroupA中的值后,GroupA值可能如下所示 GroupA.value = (GroupA.value <= GroupB.value) ? GroupA.value : GroupB.value . GroupB-读取权限,GroupA-写入权限。

        2
  •  0
  •   Jerry Coffin    14 年前

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

    AND

    像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;
    
        3
  •  0
  •   rudi-moore    14 年前

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

    #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;
    }