2009-02-09 89 views
2

早上好,如何正确组织一个包/模块依赖关系树?

我目前正在写一个python库。目前,模块和类以无组织的方式部署,没有合理的设计。当我接近更正式的版本时,我想重新组织类和模块,以便它们具有更好的总体设计。我绘制了一个导入依赖关系图,并且我计划按层级聚合类。另外,我正在考虑对类进行一些修改,以减少这些依赖关系。

对于一个潜在的复杂和潜在的Python库的良好整体设计,你有什么策略?你有没有有趣的建议?

感谢

更新:

我确实是在寻找一个经验法则。例如,假设这种情况发生(初始化的.py为了清楚起见移除)

foo/bar/a.py 
foo/bar/b.py 
foo/hello/c.py 
foo/hello/d.py 

现在,如果你碰巧有d.py进口bar.b和a.py进口的hello.c,我会考虑这是一个糟糕的设置。另一种情况是

foo/bar/a.py 
foo/bar/baz/b.py 
foo/bar/baz/c.py 

假设a.py和b.py都导入c。你有三种解决方案:1)b进口c,a进口baz.c 2)你在foo/bar中移动c。 a.py进口c,b.py进口.c 3)你把c移到别的地方(比如foo/cpackage/c.py),然后a和b都输入cpackage.c

我倾向于选择3) ,但是如果c.py作为一个独立的模块没有意义,例如,因为你想把它保留在bar包中,那么我会优先考虑1)。

还有很多其他类似的情况。我的经验法则是至少减少依赖和交叉的数量,以防止高度分支,高度交错的设置,但我可能是错的。

回答

6

“我画了一个导入依赖关系图,我打算按层级聚合类。”

的Python必须读起来像英语(或者其他任何自然语言。)

的进口是,应该有实际意义一流的声明。按照“层级”(不管那是什么)组织事物应该清楚,有意义和明显。

请勿将任意类的技术分组转换为模块和模块。

使模块和软件包变得明显和合理,以便导入列表显而易见,简单且合乎逻辑。

“另外,我正在考虑对类进行一些修改,以减少这些依赖关系。”

减少依赖关系听起来是技术性和任意性的。它可能不是,但听起来就是这样。没有实际的例子,这是不可能的。

您的目标是清晰。

此外,模块和软件包是重用的独立单元。 (不是类;一个类,但本身通常不可重用。)您的依赖关系树应该反映这一点。您正瞄准可以整洁,干净地导入到应用程序中的模块。

如果您有许多与模块密切相关的模块(或替代实现),那么可以使用软件包,但要谨慎使用。 Python库相对平坦;那里有一些智慧。


编辑

单向层之间的依赖关系是一个基本特征。这更多的是关于正确的软件设计,而不是关于Python。您应该(1)分层设计,(2)设计以便各层之间的依赖性非常严格,然后(3)在Python中实现它。

这些软件包可能不一定适合您的分层。这些包实际上可能是一个平坦的目录列表,其依赖关系仅通过import语句表示。

+0

对于层,我的意思是组织我的软件包,以便它们的类/模块依赖于该软件包的内容或另一个包含“较低”服务的软件包。我会将每个软件包视为一个“独立库”,最终依赖于其他软件包,因此不会产生循环依赖。 – 2009-02-09 13:18:48

0

这个问题非常模糊。

您可以通过让base/core的东西从库的其余部分不导入任何东西,以及从这里导入具体的实现来实现这一点。除了“在导入时没有两个模块相互导入”,你应该没问题。

module1.py:

import module2 

module2.py:

import module1 

这样可不行!

+0

其实,你的例子是/将/工作。我不会低调,因为你的方法是一个很好的经验法则:没有两个模块相互导入,如果他们这样做,修复你的设计。 – Yonatan 2012-11-14 20:15:33

0

这取决于该项目,对吧?例如,如果您使用的是模型 - 视图 - 控制器设计,那么您的软件包的结构将使3组代码无关。

如果您需要一些想法,请打开您的站点包目录,并查看这些模块中的一些代码以了解它们的设置方式。

没有更多关于模块的知识,没有正确的方法;正如阿里所说,这是一个模糊的问题。你真的只需要分析你面前的东西,并找出更好的方法。