Условия динамического события - PullRequest
1 голос
/ 27 февраля 2010

Учтите, что у нас есть класс с именем Foo, который запускает событие "ready", когда оно готово.

from observer import SubjectSet

class Foo:
  def __init__(self):
    self.events = SubjectSet()
    self.events.create('ready')

  def do_sth(self):
    self.events.fire('ready')

Как видите, метод do_sth создает готовые экземпляры класса Foo. Но подклассы захотят добавить новые задачи / условия, которые необходимо выполнить, прежде чем выдать событие ready.

Чтобы решить эту проблему, я кодировал набор новых классов с именами TaskPool, Task, ObserverTask. Они используются классом Foo следующим образом:

from observer import SubjectSet
from taskpool import TaskPool, ObserverTask

class Foo:
  def __init__(self):
    self.events = SubjectSet()
    self.events.create('task1')
    self.events.create('task2')
    self.events.create('ready')

    task1 = ObserverTask( self.events.get('task1') )
    task1 = ObserverTask( self.events.get('task2') )

    self.tasks = TaskPool()
    self.tasks.append( task1, task2 )

    self.tasks.events.add_listener('success',self.events.subjects.ready.emit)

 def complete_task1(self):
   self.events.fire('task1')

 def complete_task2(self):
   self.events.fire('task2')

Теперь он запускает событие «Ready», когда его пул задач запускает событие «Success». Как и следовало ожидать, классы, которые будут расширять Foo, могут определять новые задачи, которые должны быть выполнены до запуска события ready. Кстати, почти все задачи асинхронные.

Как вы думаете, это хорошее решение проблемы? Я искал лучшие решения, но, похоже, я не знаю правильной поисковой фразы.

Спасибо.

1 Ответ

1 голос
/ 27 февраля 2010

Я думаю, что вы на самом деле не очень точно определяете, какую проблему вы пытаетесь решить. Тем не менее, нет ничего плохого в решении. Это явно асинхронный и управляемый событиями. Но я думаю, что в общем случае решение должно также стрелять для условий ошибки, то есть того, что происходит, если по какой-либо причине происходит сбой task1 или task2 - возможно, им следует разрешить отправлять событие «fail», а затем это также следует распространять из Фу с некоторой логикой --- т.е. если задача 1 не выполнена, будет ли задача 2 работать до конца или она будет прервана; и если задача 1 выполнена успешно, а задача 2 не выполнена, будет ли основной объект сообщать об «успехе» или «неудаче» или как? Просто вещи для рассмотрения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...