怎么做软件设计才美

之前学习了极客时间上的一个专栏《软件设计之美》,作者对软件设计、编程范式、设计原则与模式、设计方法进行了讲解,内容全面。

专栏里面的一些内容,我也有些接触,但认知还不够深,比如面向对象。而且专栏把这些内容都串联起来,跟着专栏内容总结梳理一下。

软件设计是什么

软件设计:依据需求分析结果转化为软件设计模型与技术文档

Design is there to enable you to keep changing the software easily in the long term –Kent Beck

设计是为了让软件在长期更容易适应变化。

相对于软件设计,现在人好像更喜欢说架构。它们俩有什么区别,是不是本质上是同一件事,只是称呼不同而已?

以前有人总结:从0到1是架构,从表到里是抽象,从粗到细是设计

两者似乎是一样的,只是一个相对宏观,一个相对微观。

架构,之前已经写过很多,可以参考《架构专栏》

架构会关注两点:

一是软件提供功能:作者上升为模型,一个软件之所以是这个软件的核心。

二是架构特征,也就是架构质量:各种约束规范。

软件设计学习的难度,不在于一招一式,而在于融会贯通。

软件设计重要因素?

软件设计为了什么?为了更加容易地扩展软件能力。再深一层,软件开发为了什么?当然是为了解决由需求带来的问题,而解决的结果则是一个可以运行的交付物。

那么什么制约了软件的扩展能力,是现实需求的复杂性。之前总结过复杂性的来源:

如何解决复杂性:分而治之。一是把整体软件分解成粒度大小适合的模块功能;二是分解不同层次的东西,也就是分离关注点。如把技术与业务拆解。

除了分解,还有一个常被忽略的重要因素:可测试性。当一个软件拆分成一个一个的小模块后,如果不尽可能地保证每个小模块的正确性,就没法保证软件整体的正确性。如同盖楼一样,不保证钢筋、水泥、砖土质量合格,却想盖出合格大楼是荒谬的。

软件设计的三个部分

要了解一个软件设计,可以从三个部分入手:模型、接口和实现

模型:这个系统与其它系统有所区别的关键,理解整个软件设计最核心的部分

接口:通过怎么样的方式将模型提供的能力暴露出去,以及我们与这个软件交互的入口

实现:软件提供的模型和接口在内部是如何实现的软件能力得以发挥的根基

编程范式

编程范式:程序的编写模式,意味着主要使用的是什么样的代码结构。

由最经典的结构化编程,限制goto语句,它对程序控制权的直接转移施加约束;再到面向对象编程,限制使用函数指针,它是对程序控制权的间接转移施加了约束;再到最新的函数式编程,限制使用赋值语句,它是对程序中的赋值施加了约束。

每种范式在现代语言都看到它的影子,因此现在像混合格斗,不再是独门独派。我们吸取百家之长,采用面向对象来组织程序中的各个模块,采用函数式编程指导类的接口设计,在具体的实现中使用结构化编程提供的控制结构。

设计原则与模式

这部分内容,在《SOLID系列》中已经总结的差不多了。

当然还有很多原则,我们重要的是如何在各个原则之间追求平衡。

设计方法

这一部分也是我们常讨论的DDD了,详细的可以查看《DDD》专栏

总结

怎么才能做好软件设计,从文中内容推断软件架构师犹如软件体系里面的全能神。

所以难点不在于一招一式,而在于融会贯通。吸百家之精华,大成也!

公众号:码农戏码
欢迎关注微信公众号『码农戏码』