Проблема уровня разработки: множественные перечисления или циклическое перечисление в коде пользовательского интерфейса для принятия решения о видимости? - PullRequest
0 голосов
/ 01 декабря 2009

у нас идет дискуссия о ЛУЧШЕЙ ПРАКТИКЕ из архитектуры .NET ТОЧКА ЗРЕНИЯ ПРОЕКТА:

Задача: Как управлять видимостью на основе ролей в пользовательском интерфейсе с помощью enum?

Например: я хочу показать все типы команд [a, b, c, d, e] администратору, но только типы команд [a, b, c] обычному пользователю.

Сначала у меня есть enum, который включает все типы команд:

public enum TeamType { a, b, c, d, e }

Я использую это так:

if (IsAdminitrator()) 
    comboboxTeamtypes.Items.AddRange(Enum.GetNames(typeof(TeamType)));

Теперь я должен решить, как реализовать условие else. Поскольку перечисления не могут быть унаследованы, у меня есть два альтернативных подхода:

1) Должен ли я ввести другое перечисление, относящееся к другой роли:

public enum TeamTypeOthers {a, b, c }

и тогда я бы получил:

else
    comboboxTeamtypes.Items.AddRange(Enum.GetNames(typeof(TeamTypeOthers)));

2) Или я должен забыть о создании какого-либо специфичного для роли перечисления TeamTypeOthers и просто зациклить исходные значения перечисления TeamType в коде пользовательского интерфейса:

else
{
    foreach (TeamType teamtype in Enum.GetValues(typeof(TeamType)))
    {
        if (asdf == TeamType.a)
            comboboxTeamtypes.Items.Add(teamtype);
        else if (asdf == TeamType.b)
            comboboxTeamtypes.Items.Add(teamtype);
        if (asdf == TeamType.c)
            comboboxTeamtypes.Items.Add(teamtype);
    }
}

Я думаю, что первое решение красивое и чистое (хотя повторяющееся, которое не так приятно). Но теперь я также принимаю решение об использовании enum в более глубокой архитектуре, чем в решении 2, что, вероятно, плохо и поддерживает использование решения 2. Для меня решение 2 уродливо и грязно, потому что я не люблю культивирование циклов вокруг кода.

Ответы [ 2 ]

1 голос
/ 01 декабря 2009

Я бы немного изменил вещи и использовал бы простую битовую маску для разрешений:

public enum TeamType
{
    a = 1, // or 00001
    b = 2, // or 00010
    c = 4, // or 00100
    d = 8, // or 01000
    e = 16 // or 10000
}

Затем каждый тип пользователя получает свой уровень разрешений (каждое доступное разрешение добавляется вместе):

int administratorLevel = 32; // 11111
int userLevel = 7; // 00111

А затем, когда вы заполняете свой раскрывающийся список в пользовательском интерфейсе, появляется маскировка:

comboboxTeamTypes.Items.AddRange(
    Enum.GetValues(typeof(TeamType))
        .Where(v => myLevel & v == v)
        .Select(v => Enum.GetName(typeof(TeamType), v));
0 голосов
/ 01 декабря 2009

Какой у вас язык программирования? В Java я бы сказал вам создать перечислимый класс, как показано ниже, но, очевидно, это не Java.

public enum TeamType {
    A(false), B(false), C(false), D(true), E(true);
    private final boolean isAdmin;
    public TeamType(boolean isAdmin) {
        this.isAdmin = isAdmin;
    }
    public boolean isAdmin() {
        return this.isAdmin;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...