2008-08-29 9 views
1

У меня есть небольшая дилемма, которая может помочь вам разобраться.Решение для определения класса

Я сегодня работаю над модификацией членства ASP.NET, чтобы добавить уровень косвенности. В принципе, членство ASP.NET поддерживает пользователей и роли, оставляя все правила авторизации на основе того, принадлежит ли пользователь роли или нет.

Что мне нужно сделать, это добавить концепцию функции, в которой пользователь будет принадлежать роли (или ролям), а роль будет иметь одну или несколько функций, связанных с ними, что позволит нам санкционировать определенное действие на основе если пользователь принадлежит к роли, у которой есть назначенная функция.

Сказав это, моя проблема не имеет к этому никакого отношения, это общая проблема дизайна класса.

Я хочу предоставить абстрактный метод в моем базовом классе RoleProvider для создания функции (и ее сохранения), но я хочу сделать это необязательным для сохранения описания этой функции, поэтому мне нужно создать мой метод CreateFunction с помощью перегрузка, одна подпись, принимающая имя, а другая - имя и описание.

я могу думать о следующих сценариях:

  1. Создать обе подписи с абстрактным модификатора. Это связано с тем, что разработчик может не соблюдать лучшую практику, которая говорит о том, что одна перегрузка должна вызывать другую с нормализованными параметрами, а логика должна быть только в последней (той, которая имеет все параметры). Кроме того, неплохо потребовать, чтобы оба метода были реализованы разработчиком.

  2. Создайте первый, как виртуальный, а второй, как абстрактный. Вызвать второе из первого, позволить разработчику переопределить поведение. У этой проблемы есть одна и та же проблема: разработчик может принимать «плохие решения» при ее переопределении.

  3. То же, что и раньше, но не позволяйте первому быть переопределенным (удалить виртуальный модификатор). Проблема здесь в том, что разработчик должен знать, что метод может быть вызван с нулевым описанием и должен обрабатывать эту ситуацию.

Я думаю, что лучшим вариантом является третий один ...

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

ответ

1

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

class Base { 
    public final constructor(name) { 
    constructor(name, null) 
    end 

    public abstract constructor(name, description); 
} 

или, в качестве альтернативы:

class Base { 
    public abstract constructor(name); 

    public final constructor(name, description) { 
    constructor(name) 
    this.set_description(description) 
    } 

    private final set_description(description) { 
    ... 
    } 
} 

В Java существует правило, которое поддерживает это решение: «никогда не вызывать неконфиденциальные методы из конструктора».

0

Чтобы ответить на первую часть вашего сообщения, проверьте AzMan (диспетчер авторизации), который, кстати, встроен в окна. Он имеет возможность указывать операции, которые могут быть объединены в роли или назначены непосредственно пользователям.

Check out

Чтобы ответить на вторую часть вашего вопроса, то я не хотел бы использовать абстрактный класс. Вместо этого просто предоставляйте функциональность в конструкторе и выполняйте его. Это вам нравится указанное поведение, и вы не хотите, чтобы оно менялось. Зачем принуждать потомков обеспечивать реализацию.

Смежные вопросы