2009-07-23 2 views
2

필자는 매우 기초적인 GTD 응용 프로그램을 체계적으로 코딩하려고 노력하고 있지만 코딩 작업을 더 잘 수행하고 파이썬에서 더 잘할 수 있도록 노력하고 있습니다. 그러나 수업에 약간의 문제가 있습니다. 그러나 나는이 프로젝트는 다른 프로젝트로 구성 할 수 있도록 그것을 만들고 싶어,간단한 GTD 애플 리케이션을위한 파이썬 클래스

class Project: 
    def __init__(self, name, actions=[]): 
     self.name = name 
     self.actions = actions 
    def add(self, action): 
     self.actions.append(action) 

class Action: 
    def __init__(self, do='', context=''): 
     self.do = do 
     self.context = context 

각 프로젝트가에 액션이 있습니다

는 여기에 지금까지 가지고있는 클래스입니다. 매일 매일 모든 것을 인쇄하고 싶다고 말하십시오. 나는 문제가 나는 그것은 그 재귀를 사용할 것입니다 나에게 매우 분명이

> Project A 
>  Actions for Project A 
>  Project B 
>   Sub project A 
>    Actions for Sub project A 
>   Sub project B 
>    Actions for Sub project B 
>   Sub project C 
>    Sub sub project A 
>     Actions for sub sub project A 
>    Sub sub project B 
>     Actions for sub sub project B 
>    Actions for Sub project C 
>   Actions for Project B 

처럼 보였다 목록을 구성 할 방법을 함께 오는 데 문제가 있습니다. SubProject라는 또 다른 클래스를 생성하고 프로젝트에 서브 클래 싱할지 여부로 고심하고 있습니다. 뭔가 내 뇌가 예외를 발생시킵니다.

나는 프로젝트를 가져 와서 Project 클래스의 actions 속성에 추가 할 수 있었지만, MegaProject.actions.action.actions.action 상황이 시작되는 곳으로 들어갔다.

누군가가 수업 구조를 도울 수 있다면 크게 감사하겠습니다.

답변

3

작업 목록과 비슷한 하위 프로젝트 구성원을 만들고 비슷한 방식으로 프로젝트를 할당 할 수 있습니다. Project의 하위 클래스 화는 필요하지 않습니다.

class Project: 
    def __init__(self, name, actions=[], subprojects=[]): 
     self.name = name 
     self.actions = actions 
     self.subprojects = subprojects 

    def add(self, action): 
     self.actions.append(action) 

    def add_project(self, project) 
     self.subprojects.append(project) 

더 나은 점은 프로젝트가 합성이고 작업이 나뭇잎 인 복합 패턴을 구현하는 것이 좋습니다.

class Project: 
    def __init__(self, name, children=[]): 
     self.name = name 
     self.children = children 

    def add(self, object): 
     self.children.append(object) 

    def mark_done(self): 
     for c in self.children: 
      c.mark_done() 

class Action: 
    def __init__(self, do): 
     self.do = do 
     self.done = False 

    def mark_done(self): 
     self.done = True 

여기서 핵심은 프로젝트가 작업과 동일한 인터페이스 (추가/삭제 방법 제외)를 가지고 있다는 것입니다. 이렇게하면 전체 트리에서 메소드를 재귀 적으로 호출 할 수 있습니다. 복잡한 중첩 구조가있는 경우 최상위 수준에서 메서드를 호출하고 맨 아래까지 필터를 적용 할 수 있습니다.

트리에서 모든 리프 노드의 플랫 목록을 가져 오는 방법 (작업)을 원한다면 Project 클래스에서 이와 같은 메소드를 구현할 수 있습니다.

def get_action_list(self): 
    actions = [] 
    for c in self.children: 
     if c.__class__ == self.__class__: 
      actions += c.get_action_list() 
     else: 
      actions.append(c) 
    return actions 
+0

Perfect! 뿐만 아니라 작동합니까,하지만 난 그것을 이해할 것 같아요 롤 – mandroid

+0

get_action_list 함수는 정말 나를 위해 그것을 모두 묶어. Didnt는 __class__ 속성에 대해 알고 있습니다. – mandroid

+0

또한이 행은 다음과 같이 구현 될 수 있습니다 : if isinstance (c, self .__ class __) :' – sixthgear

0

"Project"클래스에 적용 할 수있는 composite pattern을 살펴 보시기 바랍니다. 구조를 올바르게 만들면, 예를 들어 설명한 것처럼 나무의 잎처럼 행동을 할 수 있어야합니다.

예를 들어 Project 클래스 (추상), ProjectComposite 클래스 (콘크리트) 및 동작 클래스를 리프로 사용할 수 있습니다.

0

기존 GTD 도구를 평가 했습니까? 필자는 기존의 GTD 도구에서 사용되는 파일 형식을 살펴볼 것입니다. XML에 저장하는 것. 이렇게하면 이런 종류의 데이터를 구성하는 방법이 효과가 있다는 것을 알 수 있습니다.

구조는 다소 단순한 (TaskPaper)에서 바로크 (OmniFocus)까지 다양합니다. 주위를 둘러보고 다른 사람들이 당신 앞에서 한 일을 배우십시오.

관련 문제