简化复杂的类层次结构

时间:2010-08-19 17:52:29

标签: python class-hierarchy

为了最大化代码重用,我为Python代码创建了一个相当复杂的类层次结构。它是这样的:

class ElectionMethod
    class IterativeMethod
        class SNTV
        ...
    class NonIterativeMethod
        class OrderDependent
            class CambridgeSTV
            ...
        class OrderIndependent
            class WIGM
                class ERS97STV
                ...
            class Recursive
                class MeekSTV
                ...

只有类层次结构的叶子才会被实例化为对象。这确实有助于最大化代码重用的目的,但代码本身很复杂(某些类有20个左右的方法),并且考虑到许多级别,找到实现的地方可能会很费时间。

我已经尝试取出大块功能并将该功能放在一个单独的对象中,但我还没有找到一个好方法,因为几乎所有功能都依赖于常见数据。即,我可以将一些代码移动到另一个对象,但它需要返回到大型复杂层次结构以获取所需的数据,因此它不是真正的封装。

有没有人对如何使这个更容易管理有任何建议?

3 个答案:

答案 0 :(得分:2)

如果唯一的困难是找到实现的地方,也许你不需要重构。相反,寻找当前编辑器的扩展,或切换到支持跳转到定义的扩展。

例如,当光标放在对象名称上并按下Ctrl-c g时,emacs with ropemacs installed会跳转到定义。

如果你使用vi / vim我肯定会有类似的技巧。

答案 1 :(得分:1)

根据您的体系结构,

Multi-method可能是解决此类问题的另一种有效方法。我们的想法是使方法模块级别的函数可以作用于任何希望传递给它们的类实例。这是另一个将其视为alternative to multiple inheritance的链接。它称它们为通用函数,但这个想法是相似的。它还讨论了python未记录的内置概念实现。

如果您可以将与设置或获取特定实例值无关的所有内容移出类到模块级函数,并且只需要与实现状态曝光/修改接口相关的类级别代码,那么你可能甚至不需要多种方法。

答案 2 :(得分:0)

这是经典问题,所以没有普遍的答案(否则不是问题)。但有几种常用的解决方案。其中之一 - 设计中的SOLID原则。因此,您不必通过层次结构级别搜索功能,您可以在适当的单一责任代码元素中轻松查找或实现它。如果您需要访问某些常见数据,则应创建负责访问此数据的对象。

按合同设计,尤其是依赖注入技术通常需要一些框架支持,因此请搜索suitable platform