简化复杂的类层次结构

0 投票
3 回答
688 浏览
提问于 2025-04-16 03:02

为了让代码能被多次使用,我创建了一个比较复杂的类结构来写我的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

这是一个经典的问题,所以没有一个通用的答案(否则就不是问题了)。不过,有几种常用的解决方案。其中之一就是设计中的 SOLID 原则。这样,你就不需要在层级结构中到处寻找功能,而是可以轻松地在适当的单一职责代码元素中找到或实现它。如果你需要访问一些公共数据,应该创建专门负责访问这些数据的对象。

设计契约和特别是依赖注入技术通常需要一些框架的支持,所以可以搜索一下 合适的平台

2

如果你遇到的唯一问题是找不到某个东西是在哪里实现的,也许你不需要重构代码。你可以试着寻找你当前编辑器的扩展功能,或者换一个支持跳转到定义的编辑器。

比如,安装了 ropemacs 的 emacs 编辑器,当光标放在一个对象名称上并按下 Ctrl-c g 时,就可以直接跳转到这个对象的定义。

如果你使用 vi/vim,肯定也有类似的技巧可以用。

2

根据你的系统架构,多方法可能是解决这类问题的另一种有效方案。这个想法是把方法变成模块级别的函数,这样它们就可以作用于任何你想传递给它们的类实例。这里还有一个链接,讨论了它们作为多重继承的替代方案。虽然它们被称为通用函数,但想法是相似的。这个链接还讨论了Python中未公开的内置实现。

如果你能把所有与设置或获取特定实例值无关的内容移出类,放到模块级别的函数中,那么类中的代码就只需要关注如何实现状态的暴露和修改接口,这样你可能甚至不需要多方法了。

撰写回答