在实际开发中,关键在于:每增加一个新的功能,整个应用程序的复杂度不应该明显上升,这样才能保证应用程序始终可扩展,可维护。
软件复杂度的根源:复杂的依赖关系
按领域组织文件夹结构
通常在开发中会从技术角度对文件夹进行拆分,而不是按照业务功能组织在一起,这样会导致无法直观的知道一个功能的相关代码在哪些文件夹,还有开发一个功能时需要频繁切换源代码目录。
我们可以从领域角度出发组织源代码,自身就包含需要的所有技术模块。
并且需要尽量扁平化地组织所有代码,而不要按小功能去增加嵌套的文件夹。
处理模块间的依赖:模块间的交互
把依赖从技术层面提升到业务层面。
- 硬依赖:功能 A 地实现必须基于功能 B
- 软依赖:功能 B 扩展了功能 A
开发需要达到的目标是:删除一个功能像删除一个文件夹那么简单,这才是真正的松耦合的系统。
所以需要做的就是让模块之间的交互不在通过硬依赖。
扩展点机制:在任何可能产生单点复杂度的模块中,通过扩展点的方式允许其他模块为其增加功能。
http://github.com/rekit/js-plugin
利用类似事件的订阅和发布模型去建立这样一个机制。
思考题
如果使用了 Redux,如何在采用按领域组织时让业务功能的 Redux 在各自的文件夹下呢?