2010-08-19 105 views
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多个方法),并且考虑到许多级别,可能会耗费时间来查找实现的地方。

我试过拔出大块的功能并将该功能放入单独的对象中,但是我没有找到一个好方法来做到这一点,因为几乎所有的功能都取决于公用数据。也就是说,我可以将一些代码移动到不同的对象上,但它需要引用大型复杂层次结构来获取所需的数据,因此它不是真正的封装。

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

+1

如果不知道项目的具体细节,我们可以说不多。你需要仔细检查设计,找出需要继承的东西。 – katrielalex 2010-08-19 17:56:46

+0

感谢您的建议。我将不得不仔细观察一下,看看他们是否能为我工作。 – 2010-08-20 12:56:56

回答

1

Multi-method根据您的体系结构,这可能是解决这类问题的另一种有效方法。这个想法是使方法模块级别的函数可以作用于任何需要传递给它们的类实例。这是另一个链接,将其作为alternative to multiple inheritance进行检查。它称它们为通用函数,但这个想法是相似的。它还讨论了python的未记录内置实现概念。

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

+0

尽管如此,您的链接有一个错字,顺便说一句,来自我的+1。 – 2010-08-19 19:51:31

+0

@Joe好看。固定。看看它 - Guido展示了如何实现它们。 – aaronasterling 2010-08-19 20:02:48

2

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

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

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

+0

@〜unutbu我的想法,听起来更像是一个文档/编辑器问题,而不是一个糟糕的设计问题 – Chris 2010-08-19 18:41:47

+0

感谢您的建议。我使用具有相似功能的WingIDE。 – 2010-08-19 19:02:49

0

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

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