为了最大化代码重用,我为Python代码创建了一个相当复杂的类层次结构。它是这样的:
class ElectionMethod
class IterativeMethod
class SNTV
...
class NonIterativeMethod
class OrderDependent
class CambridgeSTV
...
class OrderIndependent
class WIGM
class ERS97STV
...
class Recursive
class MeekSTV
...
只有类层次结构的叶被实例化为对象。这确实有助于最大限度地提高代码重用率,但代码本身很复杂(有些类有20个左右的方法),而且考虑到许多级别,查找某个东西的实现位置可能会非常耗时。在
我尝试过提取功能块并将其放到一个单独的对象中,但由于几乎所有的功能都依赖于公共数据,所以我没有找到一个好的方法来实现这一点。一、 例如,我可以将一些代码移到另一个对象,但它需要引用回大型复杂的层次结构以获取所需的数据,因此它不是真正的封装。在
有没有人对如何使之更易于管理有什么建议?在
根据您的体系结构,Multi-methods可能是此类问题的另一种有效解决方案。其思想是使方法模块级函数可以作用于任何希望传递给它们的类实例。这是另一个将它们作为alternative to multiple inheritance进行检查的链接。它称之为泛型函数,但想法是相似的。它还讨论了python对这个概念的未文档化的内置实现。在
如果您可以将与设置或获取特定实例值无关的所有内容从类移到模块级函数,并且只需要类级代码来实现状态公开/修改接口,那么您甚至可能不需要多个方法。在
这是一个经典的问题,所以没有普遍的答案(否则就不是问题)。但有几种常用的解决方案。其中之一-SOLID设计原则。因此,您不必通过层次结构的级别来搜索功能,您可以轻松地在适当的单个负责的代码元素中找到或实现它。如果您需要访问一些公共数据,您应该创建负责访问这些数据的对象。在
契约式设计,特别是依赖注入技术,通常需要一些框架支持,所以要搜索suitable platform。在
如果唯一的困难是找到实现的位置,也许您不需要重构。相反,寻找当前编辑器的扩展,或者切换到支持跳转到定义的扩展。在
例如,当光标放在对象名上并按下
Ctrl-c g
时,emacs with ropemacs installed跳转到定义。在我相信如果你使用vi/vim,也有类似的技巧。在
相关问题 更多 >
编程相关推荐