怎么做软件设计才美

简介: 之前学习了极客时间上的一个专栏《软件设计之美》,作者对软件设计、编程范式、设计原则与模式、设计方法进行了讲解,内容全面。专栏里面的一些内容,也有些接触,但认知还不够深,比如面向对象。而且专栏把这些内容都串联起来,跟着专栏内容总结梳理一下。

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

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

软件设计是什么

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

image.png

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

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

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

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

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

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

架构会关注两点:

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

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

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

软件设计重要因素?

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

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

image.png

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

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

软件设计的三个部分

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

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

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

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

编程范式

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

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

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

设计原则与模式

这部分内容,主要介绍SOLID原则,在《SOLID系列》[2]中已经总结的差不多了。

对于遵守原则,在《架构与架构师》[3]中提出,原则是指导原则,不是必须遵守的规则。

因为任何投入都是需要成本的,都需要考虑投入产出比。我们需要容忍灰色地带。

image.png

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

设计方法

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

软件建模方法其实有很多种,并不是只有领域驱动,我们可以有很多种选项。未来也会有更多选项。

image.png

总结

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

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

References

[1] 《架构专栏》: https://www.zhuxingsheng.com/tags/%E6%9E%B6%E6%9E%84/

[2] 《SOLID系列》: https://www.zhuxingsheng.com/tags/SOLID/

[3] 《架构与架构师》: https://www.zhuxingsheng.com/blog/architecture-and-architect-3.html

[4] 《DDD》专栏: https://www.zhuxingsheng.com/tags/DDD/

目录
相关文章
|
存储 安全 Shell
深入浅出操作系统:从原理到实践
【9月更文挑战第21天】在数字时代的浪潮中,操作系统扮演着至关重要的角色。本文将深入探究操作系统的奥秘,从其基本概念和核心原理出发,逐步引导读者理解操作系统的工作机制。我们将通过生动的例子和实用的代码片段,揭示操作系统如何管理计算机硬件资源、提供用户接口以及确保系统安全与性能优化。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇通往操作系统深层世界的大门。准备好跟随我们的脚步,一起探索这个让计算机变得生动起来的神奇软件吧!
354 8
|
JavaScript Java 测试技术
基于Java的用户画像的设计与实现(源码+lw+部署文档+讲解等)
基于Java的用户画像的设计与实现(源码+lw+部署文档+讲解等)
158 1
|
Unix Linux Shell
groups 命令
`groups` 命令在类 Unix 系统(如 Linux 或 macOS)中非常有用,它用于显示用户所属的所有组。每个用户都可以是零个或多个用户组的成员,这些组用于管理对系统资源和文件的访问权限。 ### 基本用法 ```bash groups [用户名] ``` - 如果不指定用户名,`groups` 命令将显示当前用户所属的所有组。 - 如果指定了用户名,它会显示该用户名所属的所有组。 ### 示例 1. **显示当前用户所属的所有组** ```bash groups ``` 假设输出是 `user1 adm dialout cdrom su
571 14
|
前端开发 JavaScript CDN
React 安装(CDN)
10月更文挑战第6天
312 2
|
数据可视化 搜索推荐 JavaScript
pyecharts模块的几个经典案例(python经典编程案例)
文章提供了多个使用pyecharts模块创建数据可视化的Python编程案例,展示如何生成各种类型的图表并进行定制化设置。
470 0
|
Web App开发 测试技术 Shell
确保您已经安装了Selenium和ChromeDriver。您可以使用pip来安装Selenium:
确保您已经安装了Selenium和ChromeDriver。您可以使用pip来安装Selenium:
|
JavaScript
【vue】 vue2 监听滚动条滚动事件
【vue】 vue2 监听滚动条滚动事件
234 1
|
网络协议 安全 Linux
在Linux中,什么是端口扫描?如何使用工具如nmap进行端口扫描?
在Linux中,什么是端口扫描?如何使用工具如nmap进行端口扫描?
|
自然语言处理 Kubernetes jenkins
devops-k8s部署jenkins和动态创建slave节点
1. K8S部署jenkins 2. 动态创建slave集群节点 3. 使用PodTemplate构建流水线
devops-k8s部署jenkins和动态创建slave节点
|
编解码 开发者 Python
【Python】已解决:SyntaxError: (unicode error) ‘unicodeescape’ codec can’t decode bytes in position 2-3: t
【Python】已解决:SyntaxError: (unicode error) ‘unicodeescape’ codec can’t decode bytes in position 2-3: t
3569 0
下一篇
oss教程