0

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

这会导致感觉像是代码重复,因为我可能想对分支的所有叶子做某事,所以分支中有一些方法可以对叶子、指定的一组叶子或所有已知的叶子做某事分支,尽管这些确实通过简单地循环叶子并要求它们对自己做所说的事情来减少代码重复(因此执行工作的实际代码在叶子类中的一个地方)。

然后树干进来,我可能想一口气对整棵树(即所有叶子)做点什么,所以我在那里有方法要求所有已知对象运行它们的全叶功能。我开始觉得这种方式与叶子中的实际动作完全不同,尽管它工作正常,而且代码看起来相当紧凑——非常简短、可读且运行良好。

另一个问题出现在逻辑分组中。有些数据我可能想与一些、大多数或所有叶子相关联,以表明它们是某个逻辑组的一部分,因此目前叶子本身都在存储这种数据。当我想获得一个逻辑组时,我必须扫描所有叶子并将它们收集起来,而不是在主干级别拥有某种列表。这实际上一切正常,甚至非常合乎逻辑,但感觉很疯狂。这仅仅是使用树状结构的本质,因为它们的复杂性,还是有其他方法可以做这些事情?我不喜欢建立二级结构来从相反的方向连接事物——例如,制作一个引用逻辑组中叶子的结构,然后从更像列表的方向接近它们。

我很想听听其他人在这些事情上的经历的想法——任何和所有的想法。

4

1 回答 1

0

我从您的问题中得出的结论是“一切正常”,但是代码开始变得难以管理且难以推理,并且:有没有更好的方法来做到这一点?

您的问题缺少的一件事是可靠的上下文。您的树结构实际上解决了什么样的问题?这些对象实际上做了什么?它们都是相同类型的对象,还是混合对象?通过其中一些细节,您可能会得到更实际的回应。

就目前而言,我建议查看一些有关设计模式的资源。特别是复合访问者模式。

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

您还可以看看 Alex Martelli 关于Python 设计模式的演讲。

这个问题一般有一些关于模式和 python 的进一步资源链接。

希望有帮助。

于 2011-09-21T07:13:35.807 回答