在编写了几款 Python App Engine 应用后,我发现自己在两种组织源代码树的方法之间难以抉择:
- 宽:这种方法将所有代码放在一个大的存储库中,并使用文件夹来组织代码。
- 深:这种方法将代码分散到多个存储库中,每个存储库包含一个特定的模块或组件。
为了便于理解,我们考虑一个小咨询公司内部的应用程序,该应用程序用于管理业务运营,如联系人管理、项目跟踪和报告,以及员工管理。该应用程序可能使用以下关键实体:公司、用户、联系人、客户、项目、工时表等。不难想象,这些模型在网站的功能中是相互交叉的,这意味着可能会存在一些耦合。
在这个例子中,是按照深度方式组织更好,还是按照宽度方式组织更好?
深度方式的示例:
models/
people.py
accounting.py
http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;
projects.py
foo.py
controllers/
reporting.py
employeeops.py
accounting.py
crm.py
views/
...
宽度方式的示例:
people/
models/
views/
controllers/
contact-mgmt/
models/
views/
controllers/
time-tracking/
models/
views/
controllers/
project-reporting/
models/
views/
controllers/
这里涉及到权衡取舍,因此在回答时,请说明你的偏好并给出一些理由(例如,假设、调节问题、框架限制、可伸缩性问题、代码维护考虑因素、开发团队结构的影响等)。
2、解决方案
答案1:
我更倾向于宽度方式,因为能够快速地移除东西永远不会有什么坏处。在我职业生涯中,我经常会被要求添加东西,而且通常会被分配一个相对合理的时程来完成。但当需要移除东西时,这个请求几乎从来不会附带影响分析或周转时间。当你按照主要功能模块来拆分东西时,通常最终会得到一个耦合程度低得多的设计。这有时候会很麻烦,但在那些你绝对必须在本周末关闭工作订单模块的情况下,它就是救命稻草。
答案2:
太深的文件夹结构会让人困惑,太宽的文件夹结构也会让人困惑。我更喜欢在两者之间保持平衡。在我正在进行的项目中,我们不知道需要什么,所以我们没有过早地创建一个庞大的文件夹结构。毕竟,我们一开始只有5个文件,所以我们并不真正需要文件夹结构。随着项目越来越大,我们将事情进行组织,以便在进行的过程中保持整洁;没有哪个文件夹有超过10个文件,将事情清楚地分组到文件夹中。四处移动所有这些文件可能需要几分钟时间。现在我们已经有了超过一百个文件,而且文件的存放位置都很清楚。我的建议是采取类似的做法——保持整洁,不要在深度或宽度上走得太远,否则你会使事情变得过于复杂。
答案3:
在你的例子里,我认为“宽度”模型更好。你应该尝试创建可重用的应用程序,即使你并不打算在任何地方重用它们,因为这将鼓励不同应用程序之间更松散的耦合,并从长远来看使维护变得更容易。