《软件规划哲学》本书作者斯坦福教授 John Ousterhout,旨在告诫咱们 杂乱度是引发软件开发或维护bug的根本问题。

软件为何越来越难维护?甚至于不想去维护?

在软件迭代中,不关注软件体系结构,导致软件杂乱度累加,软件缺少体系规划,模块紊乱,一旦需求添加、修正或优化,改动的代价无法评价,甚至于为了处理一个bug或优化,引入一个新的bug。【高耦合低内聚,下降杂乱度】。

咱们需求下降软件体系的杂乱度。

1. 杂乱度本质

杂乱度与软件体系结构息息相关。杂乱度越大,修正或理解体系的难度也越大。

杂乱度一般的三种症状:

  • 变化放大,需求修正一个当地,却发现改动的点涉及全站,导致难度倍增;
  • 认知负荷,开发者需求完成一项使命的知识量;
  • 未知,开发者在修正代码后,不知道它的实际影响面。

杂乱度的原因:

  • 依靠性,模块的相互依靠联系(模块间过度依靠);
  • 含糊性,重要信息含糊不清(例如:变量名、体系文档、代码注释等)。

简化模块依靠 和 削减含糊性 能够有效下降软件杂乱度

2. 战略编程

在现代商业软件开发中,通常选用增量开发(敏捷开发),不断的迭代开发,添加新的功用,好像堆积木一般。

以最快的速度,完成开发使命,崇尚战术编程思维,进行软件开发编程。由于是以完成使命导向,在开发进程,不会过多考虑软件体系规划,导致杂乱度累加,迭代难度加大。

那么如何防止?

经过战略编程思维,在每次迭代中,尽量规划通用性的接口,花必定的时间修正或调整体系规划,让后期迭代更加顺利。(任何体系都不是一蹴即至)

3. 模块规划

深模块规划,简略的接口和杂乱的实现别离。

每一个模块都会提供笼统的接口,运用者并不需求知道内部实现,只需求调用接口,传递对应的参数运用即可。

关于杂乱的深模块,只需求露出简易的接口即可;

4. 体系分层

软件体系是分层构成的,高层运用低层提供的办法。

例如:TCP/IP协议

不要进行简略的参数传递,一个办法只是作为简略的传参运用,这样反而提升杂乱度。

5. 如何兼并和别离

组件别离的条件是:组件是真实独立的。

假如组件之间依然存在依靠联系,别离是不合适的。

组件模块是否兼并,以结果为导向:当两个或多个组件模块被兼并时,接口运用更简略、便利。

6. 定义过错

代码中反常问题的兼容,通常需求很多代码支撑。

关于这种状况,能够经过合理的反常提示来完成,例如:window体系中,关于正在敞开的文件进行删除操作,体系就会提示你,操作反常。

在一般状况下,咱们就能够采纳以上的办法,防止过多的代码兼容,直接提示反常。不过相对抱负的状况便是,尽量削减代码,编写通用的反常处理模块,经过通用性来下降反常处理杂乱度。

7. 两次规划

并不是真的要去做两次规划,而是希望,在规划一个模块或组件功用时,细心的考虑一下是否有更好的规划计划。

考虑多种规划,考虑这种规划和比照缺点,将有益的它们具有其他规划的功用。在对备选计划进行粗略规划后,列出每个利弊。

“两次规划”办法不只能够改善您的规划,而且还能够提高您的规划技术。规划和比较多个项意图进程办法将教您有关使规划更好或更坏的因素

8. 为什么写注释

注释是笼统的根底,笼统的意图是躲藏杂乱性:笼统是简化的实体视图,其中保留了基本信息。假如用户必须阅读办法的代码,那么注释能够协助它了解实体笼统。

说服你注意的三件事:

  1. 好的谈论能够在总体上发生很大的不同软件质量
  2. 写好谈论并不难;
  3. 而且(这可能很难相信)写注释实际上很有趣;

文档能够经过为开发人员提供他们所需的信息来削减认知负担进行更改,并使开发人员易于疏忽以下不相关的信息。好的文档能够说明依靠联系,而且它填补了空白以消除不流畅之处。

9. 注释应该描绘代码中没有显着的内容

编写注释的原因是,运用编程言语编写的语句,无法捕捉到编写代码的开发人员头脑中的重要信息,而将其写在注释中,即可让后来的开发者更快了解功用代码,也能够提醒现有开发人员。

10. 挑选命名

给变量,类,模块,文件起名字很难,真的很难。好的命名能使得软件规划更简单理解,差的命名更简单发生Bug。

11. 注释先行

在实现进程中,把接口和注释先准备好。

12. 修正现有代码

关于修正代码,同样面临着“战术性编程”和“战略性编程”的应战,是以最少的修正完成使命,还是以重新规划使得体系更合理的视点进行长线投资,需求细心考虑。

13. 一致性

一致性在软件规划里很重要,包含:

  1. 命名
  2. 代码风格
  3. 接口
  4. 规划模式
  5. 常量

能够运用以下的办法来保证一致性:

  1. 文档
  2. 使用工具/代码审查来强制
  3. 入乡随俗
  4. 不要随便改动命名约好

结束!!