写过25W行代码,3个操作系统:我如何做架构设计,来降低代码复杂度?
The following article is from 美团技术团队 Author 政华
导读:本文是作者阅读John Ousterhout的《A Philosophy of Software Design》之后,结合自己的工作经验,对“降低复杂性”做了详细总结,希望给读者朋友们带来不一样的思路。
二、如何定义复杂性
修改扩散,修改时有连锁反应。
认知负担,开发人员需要多长时间来理解功能模块。
不可知(Unknown Unknowns),开发人员在接到任务时,不知道从哪里入手。
三、解决复杂性的一般原则
4.1 拒绝战术编程
4.2 设计两次
五、解决复杂性之分层
5.1 层次和抽象
5.2 复杂性下沉
5.3 异常处理
六、解决复杂性之分模块
6.1 深模块和浅模块
BufferedInputStream bufferedStream = new BufferedInputStream(fileStream);
ObjectInputStream objectStream = new ObjectInputStream(bufferedStream);
6.2 通用和专用
void delete(Cursor cursor);
void deleteSelection(Selection selection);
//以上三个函数可以合并为一个更通用的函数
void delete(Position start, Position end);
满足当前需求最简单的接口是什么?在不减少功能的前提下,减少方法的数量,意味着接口的通用性提升了。
接口使用的场景有多少?如果接口只有一个特定的场景,可以将多个这样的接口合并成通用接口。
满足当前需求情况下,接口的易用性如何?如果接口很难使用,意味着我们可能过度设计了,需要拆分。
6.3 信息隐藏
6.4 拆分和合并
共享信息的模块应当合并,比如两个模块都依赖某个配置项。
可以简化接口时合并,这样可以避免客户同时调用多个模块来完成某个功能。
可以消除重复时合并,比如抽离重复的代码到一个单独的方法中。
通用代码和专用代码分离,如果模块的部分功能可以通用,建议和专用部分分离。举个例子,在实际的系统设计中,我们会将专用模块放在上层,通用模块放在下层以供复用。
七、解决复杂性之注释
7.1 注释的误区
7.2 使用注释提升系统可维护性
首先,推迟注释通常意味着根本就没有注释。一旦决定推迟,很容易引发连锁反应,等到代码稳定后,也不会有注释这回事。这时候再想添加注释,就得专门抽出时间,客观条件可能不会允许这么做。
其次,就算我们足够自律抽出专门时间去写注释,注释的质量也不会很好。我们潜意识中觉得代码已经写完了,急于开展下一个项目,只是象征性地添加一些注释,无法准确复现当时的设计思路。
7.3 使用注释改善系统设计
八、后记
九、参考文档
作者:政华,顺谱,陶鑫,美团打车调度系统工程团队工程师。来源:美团技术
活动推荐:
21CTO学院PHP全栈工程师训练营第六届(秋季班)热招中
21CTO学院PHP全栈开发训练营正在招生,由21CTO创始人洛逸以及技术大牛授课,课程以程序员学习曲线为出发点,以高真实的项目实践为核心,以学员能够高薪就业为目标。此次招生名额有限,报名就有机会进入一线互联网公司。