一、什么是软件复杂度?

专门从事复杂系统研究的梅勒妮 · 米切尔(Melanie Mitchell)对于软件复杂度的定义是:由大量相互作用的部分组成的系统,与整个系统比起来,这些组成部分相对简单,没有中央控制,组成部分之间也没有全局性通信,并且组成部分的相互作用导致了复杂行为。

其中组成部分可以是函数(方法)、类、模块、组件和服务等,组成部分的相互作用延展开来如下:
① 服务层面:如果一个完整系统由多个服务组成,服务与服务之间相互作用,没有约束,职责不清晰,调用方式不明确,从而导致软件架构上的混乱。
② 组件层面:每个组件职责不清晰,结构不清晰,组件与组件之间相互引用,功能重叠,从而导致软件内部结构上的混乱。
③ 类层面:类职责不单一,没有提取共用的方法,大量的重复代码和功能类似的函数,从而导致软件实现上的混乱。

衡量软件复杂度的大小,我觉得可以从理解难度出发,如果一个软件比较容易理解,其他开发者能够快速理解软件的实现,则可以认为该软件的复杂度低,反之则认为该软件复杂度高。

二、什么原因导致软件变得复杂?

1、规模

image

image-1683433093866

规模小的软件,就好比一个城市的开发区,刚开始只有几条主干道和几栋建筑,开发区规模一目了然,随着规模的增长,开发区的道路和建筑也在增加,对应的复杂度也随之增加。此时前期的规划就变得非常重要,哪些地方开发CBD、哪些地方开发学校、道路是四车道还是八车道等等,如果没有前期的良好规划,那么随着规模的增长,开发区会越来越混乱。在软件领域也是同样的道理,随着软件规模的增长,软件复杂度也随之增加,如果前期设计不合理,后期不重构,那么软件最终将成为遗留系统。

2、结构

image-1683433130485

image-1683433151517

一个结构混乱的软件将大大增加软件的复杂度,因为开发者在阅读软件内部代码时,很难遵从某一个规则,比如从上到下的分层架构去理解软件的内部实现,从而导致软件实现难以理解。

3、变化

一个软件在发展的过程中,往往伴随着需求不断的迭代和变化的,比如文件导入功能,一开始可能只需要导入Excel文件,随着业务的发展,需要增加不同文件类型的导入,比如txt文件、csv文件等等,那么如果一开始没有考虑到软件的扩展性,那么软件在功能扩展方面变得不那么容易,这就是由于设计不足而导致复杂度增加。

而如果软件在设计之初进行过度设计,比如企业内部使用的软件,并发量降低,设计的时候却围绕着高并发量的方向设计,从而导致增加很多不必要的组件,从而导致复杂度增加。

三、小结

总而言之,软件之所以复杂是因为规模庞大、结构混乱以及不能很好地应对需求的变化而导致的复杂度增加。

打赏
支付宝 微信
上一篇 下一篇