2

私は非常に初歩的な 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 シチュエーションがポップアップし始める場所に遭遇しました。

誰かがクラス構造を手伝ってくれたら、大歓迎です!

4

3 に答える 3

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

ここで重要なのは、プロジェクトがアクションと同じインターフェースを持っていることです (追加/削除メソッドを除く)。これにより、ツリー全体のメソッドを再帰的に呼び出すことができます。ネストされた構造が複雑な場合は、最上位でメソッドを呼び出して、最下位までフィルター処理することができます。

ツリー (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
于 2009-07-24T00:01:01.930 に答える
0

「Project」クラスに適用できる複合パターンを確認することをお勧めします。構造を正しく作成すると、例で説明したように、アクションをそのツリーの葉にすることができるはずです。

たとえば、Project クラス (抽象)、ProjectComposite クラス (具体)、およびアクション クラスをリーフとして実行できます。

于 2009-07-23T23:59:57.563 に答える