Зависимость между группой или радиопереключателями, лучшие практики? - PullRequest
0 голосов
/ 26 августа 2010

Давайте представим, что у нас есть страница настроек конфиденциальности в социальной сети;две группы переключателей.

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 когда groupB = c;стена для просмотра закрыта, поэтому форма комментариев к стене также должна быть закрыта и т. д.

Эту проблему можно решить, используя множество if, но в результате у нас будет очень сложная структура управления.* Любое хорошее решение?

Спасибо

Ответы [ 3 ]

0 голосов
/ 26 августа 2010

Определите одну битовую маску для просмотра и другую битовую маску для публикации, с одним битом для публики и друзей (закрытый просто означает, что оба бита установлены в 0).Бит, установленный на 1, разрешает доступ, а бит, установленный на 0, запрещает доступ.

AND битовая маска "post" с битовой маской "view", чтобы гарантировать, что все биты, которые очищены вБитовая маска "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;
0 голосов
/ 26 августа 2010

Вы также можете определить сравнения в структуре и проверить каждую запись в функции.

Я имею в виду нечто подобное в 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;
}
0 голосов
/ 26 августа 2010

У вас есть 2 набора разрешений, и разрешения на «запись» никогда не должны быть менее строгими, чем read.Если (0 - нет доступа, 1 - ограничено [только для друзей], 2 - публичный доступ), то после изменения значения в GroupB проверка значения GroupA может выглядеть как GroupA.value = (GroupA.value <= GroupB.value) ? GroupA.value : GroupB.value.GroupB - права на чтение, GroupA - права на запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...