Условие на экшен
От: Ellin Россия www.rsdn.ru
Дата: 02.07.09 10:52
Оценка:
Есть набор действий, которые нужно совершать по наступлении опрд. условий.(пока это только время, но в дальнейшем может быть проверка бизнес объектов).
Звучит так:
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'
Re: Условие на экшен
От: Воронков Василий Россия  
Дата: 02.07.09 15:08
Оценка:
Здравствуйте, 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;    
   }
}



и так далее. Потом навешиваешь эти правила и все.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.