2009-07-23 70 views
2

我想爲自己編寫一個非常基本的GTD應用程序,不僅要組織起來,而且要更好地編寫代碼並在Python中變得更好。然而,我在課上遇到了一些麻煩。簡單的GTD應用程序的Python類

這裏是我到目前爲止類:

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。那裏的某些東西只會讓我的大腦產生一個異常。

我已經能夠接受項目並將它們添加到Project類中的動作屬性,但是然後我遇到了MegaProject.actions.action.actions.action情況開始彈出的位置。

如果有人可以幫助與類結構,它將不勝感激!

回答

3

您可以創建一個類似於您的動作列表的子項目成員,並以類似的方式將項目分配給它。沒有子項目是必要的。

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) 

更好的是,您可能希望實現一個組合模式,其中Projects是組合模式,Actions是葉子。

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 

這裏的關鍵在於項目具有與操作相同的界面(除了添加/刪除方法)。這允許遞歸地調用整個樹上的方法。如果你有一個複雜的嵌套結構,你可以調用頂層的方法,並將其過濾到最底層。

如果您想要一種方法來獲取樹中所有葉節點的平面列表(Actions),您可以在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

完美!它不僅工作,但我認爲我理解它大聲笑 – mandroid 2009-07-24 00:22:17

0

我建議你看看composite pattern,它可以應用到「項目」類。如果你正確地建構你的結構,你應該能夠使行動成爲那棵樹的一片葉子,就像你在例子中描述的那樣。例如,你可以做一個Project類(抽象),一個ProjectComposite類(具體)和你的動作類作爲一個葉子。

0

您評價過現有的GTD工具嗎?我會看看現有的GTD工具使用的文件格式,尤其是。那些保存到XML。這會讓你知道組織這種數據的方法往往有效。

結構範圍從相當簡單(TaskPaper)到巴洛克(OmniFocus)。環顧四周,瞭解別人在你面前的所作所爲。