0

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

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

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

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

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

4

3 回答 3

2

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

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

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

于 2010-08-19T18:39:52.927 回答
2

根据您的架构,多方法可能是此类问题的另一种有效解决方案。这个想法是使方法模块级函数可以作用于任何希望传递给它们的类实例。这是另一个链接,将它们作为多重继承的替代方法进行检查。它称它们为通用函数,但想法是相似的。它还讨论了 python 的未记录的内置实现概念。

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

于 2010-08-19T19:34:00.707 回答
0

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

契约式设计,尤其是依赖注入技术,一般需要一些框架支持,所以要寻找合适的平台

于 2010-08-19T19:12:05.993 回答