4 软件工程——总体设计
一、设计过程
1.两个主要阶段
- 系统设计阶段:确定系统的具体实现方案
- 结构设计阶段:确定软件结构
2.九个步骤
- 设想供选择的方案
- 选取合理的方案
- 推荐最佳方案
- 功能分解
- 设计软件结构
- 设计数据库
- 制定测试计划
- 书写文档
- 审查和复审
二、设计原理
1.模块化
模块化是由边界元素限定的相邻程序元素的序列,而且有一个实体标识符代表着它。
模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体。
2.抽象
把相似的方面集中和概括起来,暂时忽略它们之间的差异,这就是抽象。 抽象就是抽出职务的本质特性而暂时不考虑它们的细节
3.逐步求精
为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。
逐步求精可以看座是一项把一个时期内必须解决的种种问题按优先级排序的技术。
4.信息隐藏和局部化
把一些关系密切的软件元素物理地放得彼此靠近。在模块中使用局部数据元素是局部化的一个例子,显得局部化有助于实现信息隐藏。
5.模块独立
开发具有独立功能而且和其他模块之间没以后过多的相互作用的模块,就可以做到模块独立。换句话说,希望这样设计软件结构,使得每个模块完成一个相对独立的特定子功能,并且和其他模块之间的关系很简单。为什么说模块的独立性很重要呢?
- 有效的模块化的软件比较容易开发出来
- 独立的模块比较容易测试和维护
(1)耦合
耦合是对一个软件结构内模块之间互连程度的度量。耦合度越高,模块之间的依赖关系越紧密,系统的灵活性和可维护性越差。理想的设计是尽量减少耦合,使得模块之间相对独立。
排序(低到高):
非直接耦合<数据耦合<标记耦合<控制耦合<外部耦合<公共耦合<内部耦合
尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境耦合的范围,完全不用内容耦合。
1.1 非直接耦合:
- 定义:模块之间存在间接依赖,即一个模块通过其他模块或中介进行交互,而不是直接依赖于另一个模块的内部实现。
- 特点:通过引入中介或抽象层减少模块间的直接依赖,提高模块的独立性。
- 示例:模块A通过接口或服务与模块B进行交互,而不是直接调用模块B的内部方法。
1.2 数据耦合(低耦合):
- 定义:两模块彼此通过参数交换数据信息,模块之间没有控制依赖。
- 特点:数据耦合度最低,模块间通过数据交换而不影响彼此的实现,能有效减少模块间的依赖关系。
- 示例:模块A将一个数据对象传递给模块B,模块B仅使用数据,不控制模块A的行为。
1.3 控制耦合(中等耦合):
- 定义:传递的信息中带有控制信息,控制信息用来控制模块内部的行为。
- 特点:模块之间存在控制依赖,即模块通过参数来控制其他模块的行为,耦合度中等。
- 示例:模块A传递一个控制标志(如布尔值)给模块B,来决定模块B执行不同的操作。
1.4 公共环境耦合:
- 定义:两个或多个模块共享相同的全局数据(通常是全局变量、常量、配置文件等)。
- 特点:公共环境耦合度较高,因为多个模块共享同一全局数据,可能会导致数据污染或意外的依赖关系。
- 示例:模块A和模块B共享一个全局变量
counter
,任何一个模块对它的修改都会影响到另一个模块。
1.5 内容耦合(最高耦合):
- 定义:一个模块直接访问另一个模块的内部数据或实现细节,甚至直接修改另一个模块的代码。
- 特点:内容耦合是耦合度最高的类型,模块之间高度依赖,修改一个模块的内部实现可能会影响到多个模块。
- 示例:模块A直接修改模块B的内部数据或访问模块B的私有字段和方法。
(2)内聚
内聚是衡量一个模块内部各个部分之间紧密程度的度量。内聚度越高,模块内部的元素协同工作,功能越专一,系统的可维护性和可理解性越强。
排序(低到高):
偶然内聚<逻辑内聚<时间内聚<过程内聚<通信内聚<顺序内聚<功能内聚
尽量追求高内聚,确保模块的功能明确且专一。
2.1 功能内聚(Functional Cohesion):
- 定义:功能内聚是指模块内部的所有元素都紧密地协作以完成同一个功能或任务。
- 特点:功能内聚性最强,模块的每个部分都朝着一个明确的目标协作,符合单一职责原则。
- 示例:一个处理用户注册的模块,所有代码都围绕着处理用户注册的具体任务展开。
2.2 顺序内聚(Sequential Cohesion):
- 定义:顺序内聚是指模块内部的各个部分按顺序执行,每个部分的输出是下一个部分的输入。
- 特点:操作有序,前一个操作的结果是下一个操作的输入。
- 示例:数据处理模块,先进行数据格式化,再进行数据分析,最后输出结果。
2.3 通信内聚(Communicational Cohesion):
- 定义:通信内聚是指模块内部的各个部分共同操作同一组数据。
- 特点:虽然模块内部的操作功能不同,但它们都操作相同的数据。
- 示例:一个模块内的数据处理操作,操作相同的数据集(例如,同一个用户对象的多个属性)。
2.4 过程内聚(Procedural Cohesion):
- 定义:过程内聚是指模块内的各个部分执行的任务虽然不同,但执行顺序上的相关性较强,必须按特定的顺序来执行这些任务。
- 特点:模块内的操作是为了完成一个大任务的几个步骤。
- 示例:一个模块负责验证输入数据、读取数据库、格式化输出等任务,这些任务在流程上有先后顺序。
2.5 时间内聚(Temporal Cohesion):
- 定义:时间内聚是指模块内的各个部分需要在同一时间点执行,但这些操作的功能没有直接关系。
- 特点:模块内的各部分功能不同,但它们在时间上被安排为同时执行。
- 示例:一个系统初始化模块,在系统启动时执行多个初始化任务,如加载配置文件、初始化连接池等。
2.6 逻辑内聚(Logical Cohesion):
- 定义:逻辑内聚是指模块内的各个部分负责处理同一类任务,但每个任务执行的功能不同。
- 特点:模块内的操作虽然属于同一类别,但功能不同,通常通过一些条件判断来决定具体执行哪一部分任务。
- 示例:一个模块根据不同的用户请求类型(如:打印、计算、存储)执行不同的功能。
2.7 偶然内聚(Coincidental Cohesion):
- 定义:偶然内聚是指模块内的各个部分没有共同目标,它们的功能完全不相关,只是偶然地被放在同一个模块中。
- 特点:内聚性最差,模块内的各个部分之间没有任何联系,模块功能不明确。
- 示例:一个模块同时处理输入、输出、日志记录和网络通信等任务,它们之间没有任何相关性。
三、启发规则
- 改进软件结构提高模块独立性
- 模块规模应该适中
- 深度、宽度、扇入和扇出都应适当
- 模块的作用域应该在控制域之内
- 力争降低模块接口的复杂程度
- 设计单入口单出口的模块
- 模块功能应该可以预测
四、面向数据流的设计方法
1.变换流
有明显的输入输出。
根据基本系统模型,信息通常以“外部世界”的形式进入软件系统,经过处理以后再以“外部世界”的形式离开系统。
2.事务流
数据沿输入通路到达一个处理,这个处理根据输入数据的类型在若干动作系列中选出一个来执行。这类数据流应该划为一类特殊的数据流,称为事务流。
有事务中心:
- 接收输入数据(输入数据又称为事务)
- 分析每个事务以确定它的类型
- 根据事务类型选取一条活动通路
相关文章:
4 软件工程——总体设计
一、设计过程 1.两个主要阶段 系统设计阶段:确定系统的具体实现方案结构设计阶段:确定软件结构 2.九个步骤 设想供选择的方案选取合理的方案推荐最佳方案功能分解设计软件结构设计数据库制定测试计划书写文档审查和复审 二、设计原理 1.模块化 模块…...

Elasticsearch:确保业务规则与语义搜索无缝协作
作者:来自 Elastic Kathleen DeRusso 利用查询规则与语义搜索和重新排序相结合的强大功能。 更多阅读: Elasticsearch 8.10 中引入查询规则 - query rules Elasticsearch 查询规则现已正式发布 - query rules 你是否知道查询规则(query ru…...

【大语言模型】ACL2024论文-33 Johnny 如何说服大型语言模型越狱:通过人性化 LLMs 重新思考挑战 AI 安全性的说服技巧
【大语言模型】ACL2024论文-33 Johnny 如何说服大型语言模型越狱:通过人性化 LLMs 重新思考挑战 AI 安全性的说服技巧 目录 文章目录 【大语言模型】ACL2024论文-33 Johnny 如何说服大型语言模型越狱:通过人性化 LLMs 重新思考挑战 AI 安全性的说服技巧目…...

【LuaFramework】LuaFramework_UGUI_V2框架学习
GitHub - jarjin/LuaFramework_UGUI_V2: 基于tolua的热更新框架V2 旧版本是Unity 5.0,这个是新版本支持更高版本的 导入工程后先清除wrap 然后重新生成wrap,你会发现有个报空null,框架的问题总结下所有的框架wrap相关报错问题和修复方法&…...
使用 AOP 在 Spring Boot 中实现跟踪和日志记录
在现代应用程序中,尤其是使用微服务构建的应用程序,跟踪和日志记录在跟踪流经各种服务的请求方面起着至关重要的作用。跟踪可帮助开发人员诊断问题、监控性能并了解用户在多个系统中的旅程。 在此博客中,我们将介绍如何使用traceId从前端生成…...

如何永久解决Apache Struts文件上传漏洞
Apache Struts又双叒叕爆文件上传漏洞了。 自Apache Struts框架发布以来,就存在多个版本的漏洞,其中一些漏洞涉及到文件上传功能。这些漏洞可能允许攻击者通过构造特定的请求来绕过安全限制,从而上传恶意文件。虽然每次官方都发布补丁进行修…...

FPGA远程升级 -- FLASH控制
简介 前文讲到如何实现XILINX芯片程序跳转,但升级程序是事先通过VIVADO工具将两个程序合成一个BIN文件实现升级的,并不能在线更新升级。要实现远程升级的能力需要对FPGA的FLASH进行在线写入升级程序。 FLASH介绍 本次设计FLASH选用的是S25FL128芯片&…...

企业内训|高智能数据构建、Agent研发及AI测评技术内训-吉林省某汽车厂商
吉林省某汽车厂商为提升员工在AI大模型技术方面的知识和实践能力,举办本次为期8天的综合培训课程。本课程分为两大部分:面向全体团队成员的AI大模型技术结构与行业应用,以及针对技术团队的高智能数据构建与Agent研发。课程内容涵盖非结构化数…...

ARM异常处理 M33
1. ARMv8-M异常类型及其详细解释 ARMv8-M Exception分为两类:预定义系统异常(015)和外部中断(1616N)。 各种异常的状态可以通过Status bit查看,获取更信息的异常原因: CFSR是由UFSR、BFSR和MMFSR组成: 下面列举HFSR、MMFSR、…...

(补)算法刷题Day24: BM61 矩阵最长递增路径
题目链接 思路 方法一:dfs暴力回溯 使用原始used数组4个方向遍历框架 , 全局添加一个最大值判断最大的路径长度。 方法二:加上dp数组记忆的优雅回溯 抛弃掉used数组,使用dp数组来记忆遍历过的节点的最长递增路径长度。每遍历到已…...
探索 Bokeh:轻松创建交互式数据可视化的强大工具
探索 Bokeh:轻松创建交互式数据可视化的强大工具 在数据科学和数据分析领域,交互式数据可视化是一项不可或缺的技能。Bokeh 是一个强大的 Python 库,它可以帮助我们快速构建高质量的交互式图表和仪表盘,同时兼具高性能和灵活性。…...
【Rust自学】6.1. 定义枚举
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 6.1.1. 什么是枚举 枚举允许我们列举所有可能的值来定义一个类型。这与其他编程语言中的枚举类似,但 Rust 的枚举更加灵活和强…...

【Java基础面试题035】什么是Java泛型的上下界限定符?
回答重点 Java泛型的上下界限定符用于对泛型类型参数进行范围限制,主要有上界限定符和下届限定符。 1)上界限定符 (? extends T): 定义:通配符?的类型必须是T或者T的子类,保证集合元素一定是T或者T的子类作用&…...

0基础学前端系列 -- 深入理解 HTML 布局
在现代网页设计中,布局是至关重要的一环。良好的布局不仅能提升用户体验,还能使内容更具可读性和美观性。HTML(超文本标记语言)结合 CSS(层叠样式表)为我们提供了多种布局方式。本文将详细介绍流式布局、Fl…...
【python高级】342-TCP服务器开发流程
CS模式:客户端-服务端模式 TCP客户端开发流程介绍(五步)(C端) 1.创建客户端套接字对象 2.和服务端套接字建立连接 3.发送数据 4.接收数据 5.关闭客户端套接字 TCP服务端开发流程(七步)…...

《计算机组成及汇编语言原理》阅读笔记:p48-p81
《计算机组成及汇编语言原理》学习第 4 天,p48-p81 总结,总计 34 页。 一、技术总结 1.CISC vs RISC p49, complex instruction set computing For example, a complex instruction set computing (CISC) chip may be able to move a lar…...

AI在传统周公解梦中的技术实践与应用
本文深入探讨了人工智能在传统周公解梦领域的技术实践与应用。首先介绍了传统周公解梦的背景与局限性,随后详细阐述了 AI 技术如何应用于梦境数据的采集、整理与分析,包括自然语言处理技术对梦境描述的理解,机器学习算法构建解梦模型以及深度…...

GIS数据处理/程序/指导,街景百度热力图POI路网建筑物AOI等
简介其他数据处理/程序/指导!!!(1)街景数据获取(2)街景语义分割后像素提取,指标计算代码(绿视率,天空开阔度、视觉熵/景观多样性等)(3…...
ssr实现方案
目录 序言 一、流程 二、前端要做的事情 三、节点介绍 四、总结 序言 本文不是详细的实现过程,是让你最快最直接的理解ssr的真正实现方法,有前端经验的同学,能够很好的理解过程,细节根据具体项目实现 一、前端要做的事情 1.…...
手动修改nginx-rtmp模块,让nginx-rtmp-module支持LLHLS
文章目录 1. 背景2. 开发环境搭建2.1 ffmpeg在ubuntu上安装2.2 nginx-rtmp-module在ubuntu上安装2.3 安装vscode环境2. 修改nginx-rtmp-module2.1 主要更新内容2.2 新增配置项2.3 代码更新3. LLHLS验证方法3.1 配置验证3.2 功能验证4. 注意事项5. 已知问题6. 后续计划1. 背景 …...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...