2011-09-21 102 views
0

我正在寻找更多关于处理类实例的树的信息,以及如何最好地从树干上的树叶上调用方法。我有一个包含许多分支实例的主干实例(在字典中),并且每个实例都有许多叶子实例(以及分支中的字典)。叶子是行动真正发生的地方,因此叶子中有方法来查询价值,恢复价值和许多其他事情。在Python中使用类实例的树

这导致了代码重复的感觉,因为我可能想对某个分支的所有叶做些什么,所以在分支中有一些方法用于对叶,指定叶集或全部叶子知道这个分支,尽管这些通过简单地循环叶子并要求他们自己做这些事情(因此实际工作的代码在叶子类中的一个地方)来减少代码重复。

然后树干进来,在那里我可能想要对整个树(即所有树叶)做一些事情,所以我有方法让所有已知对象运行它们的全叶函数。我开始觉得从这种方式的叶子中真正的动作中移除了,虽然它工作的很好,而且代码看起来相当紧密 - 非常简短,可读性和运行良好。

另一个问题出现在逻辑分组中。有些数据可能要与某些,大部分或全部叶子相关联,以表明它们是某个逻辑组的一部分,所以目前叶子本身都存储了这种数据。当我想要得到一个逻辑组时,我必须扫描所有的树叶并将它们收集起来,而不是在树干层面有某种列表。这实际上一切正常,甚至是非常合乎逻辑的,但它感觉疯了。这仅仅是因为它们的复杂性,还是有其他方法来处理这些类型的事物,而与树状结构一起工作的本质?我不想建立二级结构来从相反方向连接到事物 - 例如用一个逻辑组中的树叶作为参照,然后从那个更像列表的方向接近它们。将所有东西都保存在一棵大树中的一个好处就是它可以用腌菜一次性倾倒和装载。

我很乐意听到别人对这些事情的经验 - 任何和所有 - 的想法。

回答

0

我从你的问题中拿走的是“一切正常”,但是代码开始感觉难以理解和难以推理,并且:有没有更好的方法来做到这一点?

您的问题缺失的一件事是一个坚实的背景。你的树结构实际上解决了什么样的问题?这些对象实际上做了什么?他们都是同一类型的对象,还是有混合的对象?有了这些细节,你可能会得到更多的实际答案。

现在,我建议检查一下design patterns上的一些资源。具体来说就是compositevisitor模式。

在书结束的事情,你可以看看Design Patterns和/或Refactoring to Patterns。这些代码都没有任何Python代码,但如果你不介意Java,后者是一个很好的介绍,它很难推断代码结构并使用模式来更好地组织事物。

你也许还会看看Alex Martelli在Python Design Patterns上的演讲。

question还有一些关于模式和python的资源链接。

希望有所帮助。

+0

谢谢,马克。你对我的模糊问题基本上是正确的。你也不是第一个向我推荐设计模式的人。我想我终于准备好了提示。我目前正在寻找一份Design Patterns书。 –