Вот вам практическая задачка из реальной жизни. Мой мозг пока не нашел простого решения.
Пишу проект на ASP.NET (2.0, C#). Есть сайт, на этом сайте пользователи могут оставлять посты, комментировать, голосовать и т.д. Для большинства возможностей необходима регистрация на сайте. Т.е. существуют некоторые действия:
— пост
— коммент
— голосование
— регистрация
(может быть что-нибудь еще — это я к тому, что архитектура должна быть легко расширяемой)
на все эти действия нужно наложить определенные ограничения. Ограничивать надо для того, что поддерживать _порядок_. Все ограничения зависят от каких-либо факторов. У пользователей, например есть такой параметр как _карма_. В зависимости от различных параметров, необходимо ограничивать пользователей в каких-либо действиях.
Ограничение может быть нескольких типов:
— Allow (т.е. нет ограничения, разрешить)
— Deny(reason) (запретить, одновременно указав причину запрета какого-либо действия [например, "ваша карма ниже нуля"])
— Captcha (обязательно требовать ввод кода с картинки)
— что-нибудь еще
Чтобы было понятнее, приведу пример. Рассмотрим действие "коммент".
— запретить (Deny) "коммент" всем пользователям, у которых карма ниже -10
— обязательно спрашивать капчу (Captcha), если предыдущий коммент был менее 15 секунд назад
— всегда спрашивать капчу, если карма ниже 50
Причем, ограничение может трассироваться по двум параметрам:
— по логину
— по айпишнику
Другими словами, действие "регистрация" должно ограничиваться с учетом IP адреса. Т.е. не может быть больше 5 регистраций в 10 минут с одного IP.
Как это должно выглядеть в коде:
UserContext userContext = getContext(); // получаем логин, IP пользователя, карму и другие параметры
Verifier verifier = getVerifier();
VerifierResult result = verifier.CheckAction(ActionType.Comment, userContext);
if(VerifierResult.Allow == result)
{
// добавить комментарий
}
else if(VerifierResult.Deny == result) {
// вывести сообщение об ошибке
}
else if(VerifierResult.Captcha == result)
{
// спросить капчу (конечно, это лучше делать в Page_Load, чтобы сразу спрашивать, если что)
}
Особой остроты ощущений добавляет обязательное наличие следующей функциональности: необходимо ограничивать какие-то действия по их количеству за промежуток времени.
Например, разрешить (Allow) три поста подряд с любым интервалом, но потом спрашивать капчу (Captcha)
или
Разрешить (Captcha) три поста подряд, а потом запретить в течение какого-то времени действие "пост" (так сделано в reddit.com)
или
Разрешить (Captcha) три коммента за 5 минут, с любым интервалом
Вот такая задачка. Только не говорите, что функционал лишний. Хотелось бы комментариев по поводу того, как сделать то, что описано выше (а не комментариев в стиле "мне кажется, что ты заморачиваешься, достаточно одной проверки" или "все люди делают по-другому").