【问题标题】:Simplifying complex class hierarchy简化复杂的类层次结构
【发布时间】:2011-04-01 06:44:41
【问题描述】:

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

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

只有类层次结构的叶子被实例化为对象。这确实达到了最大化代码重用的目的,但是代码本身很复杂(有些类有 20 个左右的方法),并且考虑到许多级别,找到实现某些东西的位置可能很耗时。

我尝试提取大量功能并将该功能放在一个单独的对象中,但我还没有找到一个好的方法来做到这一点,因为几乎所有的功能都依赖于公共数据。即,我可以将一些代码移动到不同的对象,但它需要回溯到大型复杂层次结构以获取所需的数据,因此它不是真正的封装。

有人对如何使这更易于管理有任何建议吗?

【问题讨论】:

  • 如果不知道项目的确切细节,我们无话可说!您需要仔细检查设计并确定需要从什么继承。
  • 感谢您的建议。我得仔细看看他们是否可以为我工作。

标签: python class-hierarchy


【解决方案1】:

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

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

【讨论】:

  • 你的链接有错别字,不过,我 +1。
  • @Joe 很好看。固定的。看看 - Guido 展示了如何实现它们。
【解决方案2】:

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

契约式设计,尤其是依赖注入技术一般需要一些框架支持,所以搜索suitable platform

【讨论】:

    【解决方案3】:

    如果唯一的困难是找到实现某些东西的位置,也许您不需要重构。相反,请寻找当前编辑器的扩展,或切换到支持跳转定义的扩展。

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

    如果您使用 vi/vim,我相信会有类似的技巧。

    【讨论】:

    • @~unutbu 我的想法完全一样,听起来更像是文档/编辑器问题,而不是糟糕的设计问题
    • 感谢您的建议。我使用的 WingIDE 具有类似的功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多