Что посоветуете применить в данном примере, м.б. ФП?
От: sergunok  
Дата: 01.08.11 21:38
Оценка:
// класс Цель, обладает неизменным идентификатором, координатами и состоянием.
class Target
{
  public int Id;
  public int X;
  public int Y;
  public TargetStatus Status; 
}

// класс Читатель информации о целях.. вычитывает откуда-то снаружи информацию о целях. поддерживает массив актуальных целей и дергает события об их появлении и модификации
class TargetReader
{
   public IDictionary<int, Target> Targets; // Id -> Target
   public event Action<Target> NewTarget;
   public event Action<Target> TargetChanged;
 

   public void Run()
   {
     while(true)
     {
        // код, считывающий данные о Target'ах откуда-то снаружи, предобрабатывающий их, обновляющий this.Targets и дергающий соответствующие события
        // код не совсем пустой, потому  реализуется за счет многонитевой обработки, соответственно события могут дергаться в разных нитях
     }
   } 
}

Далее нужно построить некоторую логику, которая реагирует на события NewTarget и TargetChanged, смотрит на свойства соответствующего или нескольких Targets и "что-то делает". Логику можно описывать по-разному, можно использовать callback'и (или что-то новомодное из .NET типа Async, но не хочется делать вопрос .NET специфичным). Но как ни крути возникает проблема concurrency, например,
void onTargetChanged(Target target)
{
  if(target.X > 100)
  {
    if(target.X > 1000 && this.reader.Targets.Count > 5)
      ...
  }
}

К моменту второго if target.X мог измениться, а вложенные if рассчитаны на его неизменность.

Знатоки concurrency, подскажите, как подобный примерчик можно переделать, чтобы этой проблемы не было, но код "логики" при этом читался.. Интуитивно хочется передавать изменения "целей" по свойствам и избавляться от shared state — this.Targets.. А это напоминает тезисы функционального программирования Соответственно вопрос №2 знатокам ФП.. Как примерно и разумно ли переделывать сам TargetReader либо "логику" с помощью языков ФП в данном случае? Как в ФП реализуется shared state?

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