2010-02-27 3 views
1

준비가되었을 때 "준비 됨"이벤트를 발생시키는 Foo라는 클래스가 있다고 가정 해보십시오.동적 이벤트 조건

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 클래스의 준비 인스턴스를 만듭니다. 그러나 하위 클래스는 준비 준비 이벤트를 보내기 전에 수행해야하는 새 작업/조건을 추가하려고합니다.

이 문제를 해결하기 위해 TaskPool, Task, ObserverTask라는 새로운 클래스 집합을 코딩했습니다. 그들은이 같은 푸 클래스에 의해 사용되는 : 그것은 TaskPool을 화재 "성공"이벤트 때

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') 

지금, 그것은 "준비"이벤트가 발생합니다. 예상대로, Foo를 확장 할 클래스는 준비 이벤트를 시작하기 전에 완료해야하는 새 태스크를 정의 할 수 있습니다. 그런데 거의 모든 작업이 비동기입니다.

문제의 좋은 해결책이라고 생각하십니까? 나는 더 나은 해결책을 찾고 있었지만 올바른 검색 문구를 모른다 고 생각합니다.

감사합니다.

답변

1

나는 실제로 당신이 해결하려고하는 문제가 무엇인지를 정확히 정의하지 않는다고 생각합니다. 그러나 솔루션에는 아무런 문제가 없습니다. 그것은 분명히 비동기적이고 이벤트 중심입니다. 하지만 나는 일반적으로 해결책은 또한 오류 상황에 대한 화살표가 있어야한다고 생각한다. 즉, task1이나 task2가 어떤 이유로 인해 실패하면 어떻게 될까? 아마도 '실패한'이벤트를 보내도록 허용되어야한다. 그리고 나서 이것이 전파되어야한다. Foo에서 어떤 논리를 가지고 --- ie task1이 실패하면 task2가 계속 실행되어 중단되거나 중단됩니다. task1이 성공하고 task2가 실패하면 주 대상 객체가 '성공'또는 '실패'라는 보고서를 보냅니 까? 고려해야 할 사항.