需求引起的软件复杂度
需求分为业务需求与质量属性需求,因而需求引起的复杂度可以分为两个方面:
1. 技术复杂度
技术复杂度来自需求的质量属性,诸如安全、高性能、高并发、高可用性等需求,为软件设计带来了极大的挑战,让人痛苦的是这些因素彼此之间可能又互相矛盾、互相影响
2. 业务复杂度
业务复杂度对应了客户的业务需求,因而这种复杂度往往会随着需求规模的增大而增加。由于需求不可能做到完全独立,一旦规模扩大到一定程度,不仅产生了功能数量的增加,还会因为功能互相之间的依赖与影响使得这种复杂度产生叠加,进而影响到整个系统的质量属性,比如系统的可维护性与可扩展性。
技术复杂度与业务复杂度并非完全独立,二者混合在一起产生的化合作用
更让系统的复杂度变得不可预期,难以掌控。
无序设计带来的复杂度问题
没有对行为的重用,也没有对业务问题的抽象,每当操作用到业务规则时,都要重复这些业务规则。
快速的原型建立和迭代很快会达到其极限,因为抽象的缺乏限制了重构的选择。
复杂的功能很快会让你无所适从,所以程序的扩展只能是增加简单的应用模块,没有很好的办法来
实现更丰富的功能。
控制复杂度
分而治之的思想,遵循小即是美。
清晰直观且易于理解的结构。
遵循稳定依赖原则,不对变化或易于变化的事物形成依赖。
拥抱变化
可进化性(Evolvability)
可扩展性(Extensibility)
可定制性(Customizability)
隔离业务复杂度与技术复杂度
要避免业务逻辑的复杂度与技术实现的复杂度混淆在一起,首要任务就是确定业务逻辑与技术实现的边界,
从而隔离各自的复杂度
在理想状态下,我们应该保证业务规则与技术实现是正交的。
领域驱动设计通过【分层架构】与【六边形架构】来确保业务逻辑与技术实现的隔离。