早上好,
我目前正在编写一个 python 库。目前,模块和类的部署方式是无组织的,没有合理的设计。当我接近更正式的版本时,我想重新组织类和模块,以便它们具有更好的整体设计。我画了一个导入依赖关系图,并计划按层级别聚合类。另外,我正在考虑对类进行一些修改,以减少这些依赖性。
对于一个潜在复杂且正在开发的 Python 库,您的良好总体设计策略是什么?您有有趣的建议吗?
Thanks
Update:
我确实在寻找经验法则。例如,假设发生这种情况(init为了清楚起见,删除了 .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) 将 c 移至 foo/bar 中。 a.py 导入 c,b.py 导入 .c
3)你将c移到其他地方(比如foo/cpackage/c.py),然后a和b都导入cpackage.c
我倾向于选择 3),但如果 c.py 作为独立模块没有意义,例如因为您想将其“私有”到 bar 包中,我会优先选择 1)。
类似的案例还有很多。我的经验法则是至少减少依赖和交叉的数量,以防止高度分支、高度交织的设置,但我可能是错的。
“我画了一个导入依赖关系图,并计划按层级别聚合类。”
Python 必须像英语(或任何其他自然语言)一样阅读。
import 是一个一流的语句,应该具有真正的含义。按“层级别”(无论是什么)组织事物应该是清晰的、有意义的和明显的。
不要将类任意技术分组为模块,并将模块分组为包。
使模块和包明显且合乎逻辑,以便导入列表明显、简单且合乎逻辑。
“此外,我正在考虑对类进行一些修改,以减少这些依赖性。”
减少依赖性听起来很技术性且任意。可能不是,但听起来是这样。没有实际的例子,这是不可能说的。
你的目标是清晰。
此外,模块和包是独立的重用单元。 (不是类;类,但它本身通常不可重用。)您的依赖关系树应该反映这一点。您的目标是可以将模块整齐干净地导入到您的应用程序中。
如果您有许多密切相关的模块(或替代实现),则可以使用包,但要谨慎使用。 Python 库相对扁平化;这其中有一些智慧。
Edit
层之间的单向依赖是一项基本功能。这更多的是关于正确的软件设计,而不是关于 Python。您应该 (1) 分层设计,(2) 设计使层之间的依赖关系非常严格,然后 (3) 在 Python 中实现。
这些包不一定完全适合您的分层。这些包在物理上可能是目录的平面列表,其依赖关系仅通过以下方式表达import
声明。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)