Есть набор действий, которые нужно совершать по наступлении опрд. условий.(пока это только время, но в дальнейшем может быть проверка бизнес объектов).
Звучит так:
1-е. действие выполняется ежедневно в 15.00.
2-е. ежемесячно 11 числа (при попадании на выходные переносится на ближайший
до этой даты раб. день)
3-е. ежемесячно 21 числа (при попадании на выходные на ближайший
до этой даты раб.день)
4-е. ежемесячно 15 числа (при попадании на выходные на ближайший
до этой даты раб.день)
5-е. ежемесячно 7 числа (при попадании на выходные на ближайший
после этой даты раб.день)
Сейчас я сделал абстрактный класс с двумя функциями CheckCondition и DoAction.
В одном из CheckCondition в частности что-то вроде:
DateTime now = DateTime.Now;
switch (now.Day)
{
// Если 11-е число суббота или воскресенье - не срабатываем
case 11:
if (now.DayOfWeek == DayOfWeek.Saturday ||
now.DayOfWeek == DayOfWeek.Sunday)
{
return false;
}
break;
// Если 12-е число понедельник - срабатываем
case 12:
if (now.DayOfWeek == DayOfWeek.Monday)
{
return true;
}
break;
// Если 13-е число понедельник - срабатываем
case 13:
if (now.DayOfWeek == DayOfWeek.Monday)
{
return true;
}
break;
default:
return false;
}
Но как-то каряво? Или нормально? Нужно учесть, что условия могут легко меняться, адаптироваться и т.п. Как бы лучше и проще делать без перекомпиляции? Вобщем может какие-то советы?
02.07.09 19:10: Перенесено из '.NET'
Здравствуйте, Ellin, Вы писали:
E>Но как-то каряво? Или нормально? Нужно учесть, что условия могут легко меняться, адаптироваться и т.п. Как бы лучше и проще делать без перекомпиляции? Вобщем может какие-то советы?
Ну а в чем проблема делать без перекомпиляции? Придумайте какой-нибудь формат описания условия вместе с правилами вроде переноса. Можно к примеру, реализовать именно сами атомарные методы, представляющие собой правила, а затем в каком-нибудь файле манифесте их комбинировать. Например правила могли бы выглядеть бы как-нибудь так:
interface IRule
{
bool Apply(DateTime dt);
}
class RegularRule : IRule
{
bool IRule.Apply(DateTime dt)
{
return dt.Day == DateTime.Now.Day;
}
}
class WeekendShiftRule : IRule
{
bool IRule.Apply(DateTime dt)
{
var day = DateTime.Now.Day;
var st = dt.DayOfWeek == DayOfWeek.Saturday;
var sn = dt.DayOfWeek == DayOfWeek.Sunday;
return sn && dt.Day == day - 2 || st && dt.Day == day - 1 || !sn && !st && dt.Day == day;
}
}
class WeekendShiftRule2 : IRule
{
bool IRule.Apply(DateTime dt)
{
var day = DateTime.Now.Day;
var st = dt.DayOfWeek == DayOfWeek.Saturday;
var sn = dt.DayOfWeek == DayOfWeek.Sunday;
return sn && dt.Day == day + 1 || st && dt.Day == day + 2 || !sn && !st && dt.Day == day;
}
}
и так далее. Потом навешиваешь эти правила и все.