做好软件设计让你“事半功倍”

news2025/7/14 18:01:04

文章目录

  • 一、浅谈软件设计
  • 二、什么是好的软件设计?
  • 三、如何做好软件设计?
    • 3.1 设计原则
      • 3.1.1 SOLID原则
      • 3.1.2 开放-关闭原则(Open–closed principle,OCP)
      • 3.1.3 里氏替换原则(Liskov Substitution Principle,LSP)
      • 3.1.4 接口隔离原则(Interface segregation principle,LSP)
    • 3.2 画“图”:4+1设计建模
      • 3.2.1 用例视图
      • 3.2.2 逻辑视图
      • 3.2.3 开发视图
      • 3.2.4 运行视图
      • 3.2.5 部署视图

一、浅谈软件设计

一个软件系统没有软件设计,相当于建房子没有图纸,软件系统越复杂越庞大,“图纸”的重要性越大,本篇博客将简单聊聊我对软件设计的思考。

一个软件系统由N个组件构成, 一个组件又由N个模块构成。(随便举个例子:支付宝这个软件系统有理财组件、支付组件等等,理财组件又有基金理财、余额宝理财等模块,有些大模块还能再细分出子模块)

因此,一个全新的软件系统就需要从上往下地去设计,大概对应职责分工如下:

架构设计
组件/微服务设计
特性设计
架构师
软件总工/committer
开发
稳定的
较稳定的
灵活易改的

在有些比较庞大的团队,有可能会将特性设计的活安排给一些开发经验比较丰富的人进行专门负责,开发只负责开发,或者只承担一部分的设计,这样的好处是保证大家工作的内容更加聚焦,产出的代码可靠性更高。缺点也是比较明显,个人觉得是有两点:

  1. 随着技术的快速更新迭代,设计人员脱离代码开发容易导致设计浮于业务表面,设计的东西在技术上的落实不可靠或者落后;
  2. 对于开发人员来讲,只会编码不懂设计,容易思维固化,对问题的思考会缺乏深度和广度。

因此,软件设计人员一般还是编写对应的核心代码,保持对软件系统整个“生命周期”的高感知度。

二、什么是好的软件设计?

为啥要做好软件设计呢?首先要明白,软件实现是啥,其实就是将需求描述映射成代码实现,这个过程会遇到下面的问题:

  1. 软件实现了基本的功能,可靠性、可维护、可扩展等DFX属性缺乏;
  2. 需求不断变化,不仅仅是考虑实现了当前的需求,还需要考虑未来的变化;
  3. 需求的开发是不同的人共同完成的,相互沟通和自己的理解都可能存在偏差,容易导致结果跟预期不一致。

所以,能解决这些问题的设计就是好的软件设计。

三、如何做好软件设计?

3.1 设计原则

3.1.1 SOLID原则

S(Single Responsibility Principle,SRP):单一职责原则;
O(Open–closed principle,OCP):开放-关闭原则;
L(Liskov Substitution Principle,LSP):里氏替换原则;
I(Interface segregation principle,LSP):接口隔离原则;
D(Dependency inversion principle, DIP):依赖倒置原则。

3.1.2 开放-关闭原则(Open–closed principle,OCP)

对扩展开放,对修改关闭。简而言之: 不修改已有代码(尽可能不更改已有代码的情况下),新需求用新代码实现。

3.1.3 里氏替换原则(Liskov Substitution Principle,LSP)

子类必须能够替换其父类,并保证原来程序的逻辑行为不变及正确性不被破坏。

3.1.4 接口隔离原则(Interface segregation principle,LSP)

不应强迫使用者依赖于它们不用的方法。通俗的理解:对接口设计应用单一职责,根据调用者设计不同的接口。

我这里就不展开讲这些原则,这些需要结合具体的代码去理解去体会。

3.2 画“图”:4+1设计建模

为保证从软件设计到软件实现整个过程中能够“一致性”,准确的用画图的方式承载这些设计思路就很重要,4+1视图就是这么一个东西。

4+1视图这个概念最早是1995年被一个叫Philippe Kruchten提出来的,作者提出应该用多个视图来描述一个软件系统,每个视图聚焦于说明软件的某个方面。

  • 用例视图:上下文用于开发者测试数据打桩、安全暴露边界分析、系统测试、威胁分析
  • 逻辑视图:用户描述模块划分、模块依赖关系、开发顺序,开发人员可以细化到模块功能多元
  • 运行视图:用于描述模块与模块之间、节点与节点之间、线程与线程之间的关系
  • 物理视图(部署视图):展现软件到硬件的映射,以及软件的分布式部署
  • 开发视图:描述软件在开发环境中的静态组织方式,开发人员可以细化到代码目录

在这里插入图片描述

3.2.1 用例视图

描述组件上下文模型的依赖关系

3.2.2 逻辑视图

逻辑模型:包括组件、模块、子模块、功能单元,将业务进行抽象,分离系统的复杂度,做到可扩展性

数据模型:包括数据表、数据表间关联关系

3.2.3 开发视图

对逻辑架构的进一步展开和细化,侧重开发内部的细化,对标准目录进行确定和规范,对一些核心的文件进行明确

3.2.4 运行视图

  • 时序图:描述实体之间基于时间维度的懂爱关系和交互内容,明确运行形式、交互协助形式

  • 状态机:有限状态自动机,需要具备完备性,跟业务解耦,标注稳态还是非稳态,建议不超过7个

  • 数据流图:描绘系统中数据流动和处理的过程,表达数据交互和依赖关系

3.2.5 部署视图

描述组件、微服务的部署环境,集群方式,描述部署节点(环境)/进程 / 编译目标的关系和操作方式

以上这些视图,基本都是可以在一些比较有名的画图软件找到,我本人现在用亿图绘画这些比较多,大家找一个自己熟悉的软件系统赶紧试试吧~~

(以上为DreamKite本人原创,转载请附上原文链接)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/36778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构与算法之让我们种下一棵字典树(Java/C++双语言实现)

⭐️前面的话⭐️ 本篇文章将介绍一种经常使用的数据结构——字典树,它又称Tire树,前缀树,字典树,顾名思义,是关于“字典”的一棵树。这个词典中的每个“单词”就是从根节点出发一直到某一个目标节点的路径&#xff0…

四川省部分地区经济发展水平的统计分析

四川省部分地区经济发展水平统计 摘 要 区域经济差异是经济发展过程中的一个普遍问题。区域经济的发展水平不仅影响到政府对各地的管理,也直接影响着社会的安定和人民的生活水平。而四川省区域经济差异更是表现明显,合理分析差异是政府行政管理的一个重…

系统设计-文本内容保存之XSS过滤

点击上方名片关注我,为你带来更多踩坑案例- 引言 -如果你是一个摸爬滚打几年的开发者,那么这个阶段,对系统设计的合理性绝对是衡量一个人水平的重要标准。一个好的设计不光能让你工作中避免很多麻烦,还能为你面试的时候增加很多谈…

【科学文献计量】RC.networkMultiLevel()中的参数解释

RC.networkMultiLevel中的参数解释 1 数据2 RC.networkMultiLevel()中的参数解释2.1 测试*modes参数2.2 测试nodeCount参数2.3 测试edgeWeight参数2.4 测试stemmer参数2.5 测试edgeAttribute参数2.6 测试nodeAttribute参数2.7 测试_networkTypeString参数1 数据 RC.networkMul…

QT学习笔记(四)——在QLabel显示的影像上画图形,并和影像同步放大缩小

实现在QLabel显示的影像上画图形,并和影像同步放大缩小 关于影像在QLabel的显示,如何随鼠标滚轮实现放大缩小,可以参考我的上一篇博客 QT学习笔记(三)——vs2019Qt实现打开影像并以鼠标为中心用滚轮控制图片缩放 本篇…

[每周一更]-(第22期):什么是gRPC?

gRPC 是Google发起的一个开源远程过程调用 系统。 该系统基于HTTP/2 协议传输,使用Protocol Buffers 作为接口描述语言。 其他功能: 认证 双向流 流控制 超时 最常见的应用场景是: 微服务框架下,多种语言服务之间的高效交互。 …

app发布前要做的几件事

最近把一个小东西做完了,想上架让大家用一下。在上架之前关于app需要做的几件事在此备忘一下。 1、app签名。 我用的是android studio 21.2.1版,签名跟之前的版本可能不同(我之前用的是3.5),但也大同小异。21.2.1版的…

蓝桥杯刷题四

1.激光炸弹 二维前缀和的模板题 这里注意一下边长是R 矩形是(R-1)*(R-1) 并且坐标最大是5000 所以5001的轰炸就能炸完整个图了 所以要对这个做优化 不然会各种错误 #include <bits/stdc.h> using namespace std; const int N5e310; int sum[N][N]; int main() {int n…

学生个人网页设计作品 HTML+CSS+JavaScript仿小米商城(8页) 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计

临近期末&#xff0c;大一新生的各种考试和专业结课作业纷至沓来。什么高数啊、线代啊、C语言、网页设计等&#xff0c;简直让人头大。你还在为网页设计老师的作业要求感到头大&#xff1f;网页作业无从下手&#xff1f;网页要求的总数量太多&#xff1f;没有合适的模板&#x…

《人月神话》(The Mythical Man-Month)4概念一致性:专制、民主和系统设计(System Design)...

主题&#xff1a;概念一致性 &#xff08;Conceptual Integrity&#xff09;4. 专制、民主和系统设计(System Design&#xff09;Chapter 4. Aristocracy, Democracy, and System Design大教堂是艺术史上无与伦比的成就。它的原则既不乏味也不混乱……真正达到了风格上的极致&a…

【蓝桥杯选拔赛真题30】python计算倒数和 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python计算倒数和 一、题目要求 1、编程实现 2、输入输出 3、评分标准

【深度学习】手写数字识别

一、机器学习问题的求解步骤 学习 使用训练数据进行权重参数的学习 推理使用学习到的参数对输入的数据进行分类 二、MNIST数据集 2.1 load_mnist(flattenTrue, normalizeFalse) flattentrue 读入的图像一维numpy数组的形式保存 2.2 函数学习 def fromarray(obj, modeNone…

第六章《类的高级特性》第2节:包的创建和使用

在一个Java工程中,往往会包含很多类。为了方便工程管理,程序员总是希望能够把这些类按照功能分开存放。为了达到这个目的,Java语言允许开发者把不同的类放入不同的包中。所谓“包”就是存放类的容器,在一个包中可以存放多个类。 6.2.1创建包 程序员使用IDEA可以很轻松的创…

开环控制(自动控制理论)

自动控制的基本原理方式 自动控制&#xff1a;是指没有人直接参与的情况下&#xff0c;利用控制装置&#xff08;称为控制器&#xff09;&#xff0c;使整个生产过程或工作机械&#xff08;称被控对象&#xff09;的某个工作状态或参数&#xff08;即被控量&#xff09;自动地按…

ubuntu 22.04 配置 Prometheus 和 Grafana 服务器监控

由于内存白菜价&#xff0c; 家里的虚拟机越来越多了。 1个是难以管理hostname 和 ip&#xff0c; 只靠/etc/hosts 去记住其实并不方便 试过宝塔linux面板&#xff0c; 可惜是单机的&#xff0c;不适用于管理集群linux服务器&#xff0c; 而且里面一股金钱气息。 至于他们另1…

李宏毅2017机器学习课程 回归

李宏毅2017机器学习课程 P3 回归 Regression 下文不区分w和ω&#xff08; 文章目录李宏毅2017机器学习课程 P3 回归 Regression回归定义举例:Pokemon精灵攻击力预测(Combat Power of a Pokemon)模型步骤Step1&#xff1a;模型假设-线性模型一元线性模型&#xff08;单个特征&…

搭建lnmp+nfs+调度器

→→→大虾好吃吗←←← 目录 搭建lnmp平台 nginx配置 mysql配置 php配置 验证 nfs调度器 安装服务 nfs配置 调度器配置 验证 →→→大虾好吃吗←←← 实验目标&#xff1a;搭建lnmp平台&#xff0c;安装wordpress论坛搭建nfs&#xff0c;客户端通过调度器访问nfs论坛。 实验拓…

pandas数据分析:十分钟快速入门重点函数速查

文章目录前言一、生成Series对象和DataFrame对象二、查看数据三、获取数据3.1 获取单列数据3.2 按照标签选择数据&#xff1a;loc函数3.2 按照位置选择数据&#xff1a;iloc函数3.3 布尔索引3.4 赋值四、缺失值五、运算六、merge&#xff1a;合并DataFrame6.1 concat函数6.2 me…

体系结构31_机群计算机

目前流行的高性能并行计算机系统结构通常可以分成五类&#xff1a;并行向量处理机&#xff08;PVP&#xff09;、对称多处理机&#xff08;SMP&#xff09;、大规模并行处理机&#xff08;MPP&#xff09;、分布共享存储&#xff08;DSM&#xff09;多处理机和机群&#xff08;…

现代密码学导论-13-归约证明

目录 3.3.2 Proofs by Reduction 最后来理一遍&#xff1a; 3.3.2 Proofs by Reduction 如果我们希望证明一个给定的构造&#xff08;例如&#xff0c;加密方案&#xff09;在计算上是安全的&#xff0c;那么——除非该方案在信息理论上是安全的——我们必须依赖于未经证明的…