早上好,
我目前正在编写一个python库.目前,模块和类以无组织的方式部署,没有合理的设计.当我接近更正式的版本时,我想重新组织类和模块,以便他们有更好的整体设计.我绘制了一个导入依赖关系图,我计划按层级聚合类.此外,我正在考虑对类进行一些修改,以减少这些依赖性.
您对可能复杂且正在制作的python库进行良好整体设计的策略是什么?你有什么有趣的建议吗?
谢谢
更新:
我确实在寻找一个经验法则.例如,假设发生这种情况(为清楚起见,删除了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,导入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作为独立模块没有意义,例如因为你想将它保持为"私有"进入条形包,我会优先选择1).
还有许多其他类似的案例.我的经验法则是尽量减少依赖关系和交叉的数量,以防止高度分支,高度交织的设置,但我可能是错的.
"我绘制了一个导入依赖关系图,我计划按层级聚合类."
Python必须像英语(或任何其他自然语言)一样阅读.
导入是一个应具有实际意义的一流声明.按"层级"(无论是什么)组织事物应该清晰,有意义和明显.
不要将类的任意技术分组转换为模块和模块到包中.
使模块和包明显且符合逻辑,以便导入列表显而易见,简单且符合逻辑.
"另外,我正在考虑对类进行一些修改,以减少这些依赖性."
减少依赖性听起来技术性和任意性.它可能不是,但听起来就是这样.没有实际的例子,就不可能说了.
你的目标是清晰.
此外,模块和包是独立的重用单元.(不是类;类,但本身通常不可重用.)您的依赖树应该反映这一点.您的目标是可以整齐,干净地导入到您的应用程序中的模块.
如果您有许多密切相关的模块(或替代实现),那么可以使用包,但要谨慎使用.Python库相对平坦; 并且有一些智慧.
编辑
层之间的单向依赖是一个基本特征.这更多是关于正确的软件设计而不是关于Python.您应该(1)分层设计,(2)设计,以便层之间的依赖关系非常严格,然后(3)在Python中实现.
包装可能不一定精确适合您的分层.这些包在物理上可以是一个平面的目录列表,其依赖关系仅通过import
语句表示.