《软件工程》第 11 章 - 结构化软件开发

    结构化软件开发是一种传统且经典的软件开发方法,它强调将软件系统分解为多个独立的模块,通过数据流和控制流描述系统的行为。本章将结合 Java 代码示例、可视化图表,深入讲解面向数据流的分析与设计方法以及实时系统设计的相关内容。

11.1 面向数据流与数据字典

11.1.1 实体 - 关系图

    实体 - 关系图(ER 图)用于描述数据对象及其之间的关系,是数据库设计的重要工具。例如,一个简单的图书馆管理系统的 ER 图:

展示了图书、读者和借阅记录之间的关系。

11.1.2 数据流图的实时系统扩充

   传统数据流图(DFD)主要关注数据的流动和处理,而实时系统的 DFD 需要考虑时间约束和并发处理。例如,一个简单的温度监控系统的实时 DFD:

展示了温度监控系统的数据流和处理逻辑。

11.1.3 基于数据流的分析方法

   基于数据流的分析方法通过识别系统中的数据流和处理过程,建立系统的逻辑模型。例如,一个订单处理系统的分析过程:

  1. 顶层 DFD:展示系统与外部实体的交互,如客户、供应商。
  2. 0 层 DFD:将系统分解为主要处理过程,如订单接收、订单验证、库存检查等。
  3. 详细 DFD:进一步细化每个处理过程的输入和输出。

11.2 面向数据流的设计过程

11.2.1 基本概念和设计过程

   面向数据流的设计方法将数据流图转换为软件的模块结构,主要步骤包括:

  1. 确定数据流图的类型(变换型或事务型)。
  2. 映射数据流图到软件结构。
  3. 定义模块接口和控制关系。
  4. 优化软件结构。

11.2.2 变换分析

   变换分析适用于具有明显输入、变换和输出三个部分的数据流图。例如,一个数据处理系统的变换分析过程:

展示了变换型数据流图的结构。对应的 Java 代码示例:

public class DataProcessingSystem {// 输入处理模块public static DataObject inputProcessing(InputData input) {// 数据验证和转换DataObject data = new DataObject();data.setValue(input.getValue());return data;}// 中心变换模块public static DataObject centralTransform(DataObject data) {// 数据处理逻辑data.setValue(data.getValue() * 2);return data;}// 输出处理模块public static OutputData outputProcessing(DataObject data) {// 结果格式化OutputData output = new OutputData();output.setResult("处理结果: " + data.getValue());return output;}public static void main(String[] args) {InputData input = new InputData(10);DataObject processedData = inputProcessing(input);processedData = centralTransform(processedData);OutputData output = outputProcessing(processedData);System.out.println(output.getResult());}
}class InputData {private int value;public InputData(int value) {this.value = value;}public int getValue() {return value;}
}class DataObject {private int value;public int getValue() {return value;}public void setValue(int value) {this.value = value;}
}class OutputData {private String result;public String getResult() {return result;}public void setResult(String result) {this.result = result;}
}

11.2.3 事务分析

   事务分析适用于具有多个事务类型的数据流图,每个事务可能有不同的处理路径。例如,一个银行系统的事务分析过程:

展示了事务型数据流图的结构。对应的 Java 代码示例:

public class BankingSystem {// 事务处理器接口public interface TransactionHandler {void processTransaction(Transaction transaction);}// 存款处理器public static class DepositHandler implements TransactionHandler {@Overridepublic void processTransaction(Transaction transaction) {System.out.println("处理存款事务: " + transaction.getAmount());// 存款处理逻辑}}// 取款处理器public static class WithdrawalHandler implements TransactionHandler {@Overridepublic void processTransaction(Transaction transaction) {System.out.println("处理取款事务: " + transaction.getAmount());// 取款处理逻辑}}// 事务分发器public static class TransactionDispatcher {public void dispatchTransaction(Transaction transaction) {TransactionHandler handler;switch (transaction.getType()) {case "DEPOSIT":handler = new DepositHandler();break;case "WITHDRAWAL":handler = new WithdrawalHandler();break;default:throw new IllegalArgumentException("未知事务类型: " + transaction.getType());}handler.processTransaction(transaction);}}public static void main(String[] args) {Transaction transaction = new Transaction("DEPOSIT", 1000.0);TransactionDispatcher dispatcher = new TransactionDispatcher();dispatcher.dispatchTransaction(transaction);}
}class Transaction {private String type;private double amount;public Transaction(String type, double amount) {this.type = type;this.amount = amount;}public String getType() {return type;}public double getAmount() {return amount;}
}

11.3 实时系统设计

11.3.1 实时系统性能要求

   实时系统需要满足严格的时间约束,其性能要求包括:

  • 响应时间:系统对外部事件的响应速度。
  • 吞吐量:系统在单位时间内处理的任务数量。
  • 截止时间:任务必须完成的时间点。

11.3.2 实时系统设计要素

实时系统设计需要考虑以下要素:

  • 任务调度:确定任务执行的顺序和时间分配。
  • 资源管理:合理分配内存、CPU 等资源。
  • 可靠性设计:采用冗余、容错机制,确保系统在异常情况下正常运行。

11.3.3 实时系统设计方法

常见的实时系统设计方法有:

  • 静态优先级调度:为每个任务分配固定优先级,高优先级任务优先执行。
  • 动态优先级调度:任务优先级根据执行情况动态调整。
  • 时间触发架构:任务按预设时间点触发执行。

11.3.4 设计实例

以一个简单的交通灯控制系统为例,展示实时系统设计:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class TrafficLightSystem {// 交通灯状态public enum LightState {RED, GREEN, YELLOW}private LightState currentState = LightState.RED;private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);// 初始化系统public void initialize() {// 设置红灯持续时间为30秒scheduler.scheduleAtFixedRate(() -> changeState(LightState.GREEN), 0, 30, TimeUnit.SECONDS);// 设置绿灯持续时间为20秒scheduler.scheduleAtFixedRate(() -> changeState(LightState.YELLOW), 30, 20, TimeUnit.SECONDS);// 设置黄灯持续时间为5秒scheduler.scheduleAtFixedRate(() -> changeState(LightState.RED), 50, 5, TimeUnit.SECONDS);}// 改变交通灯状态private synchronized void changeState(LightState newState) {this.currentState = newState;System.out.println("交通灯状态变更为: " + newState);// 触发相应的硬件控制controlHardware(newState);}// 控制硬件private void controlHardware(LightState state) {// 实际项目中这里会包含控制硬件的代码System.out.println("发送信号控制硬件: " + state);}// 关闭系统public void shutdown() {scheduler.shutdown();}public static void main(String[] args) {TrafficLightSystem system = new TrafficLightSystem();system.initialize();// 运行1分钟后关闭系统try {Thread.sleep(60000);} catch (InterruptedException e) {e.printStackTrace();}system.shutdown();}
}

   本章全面介绍了结构化软件开发的核心内容,通过丰富的 Java 代码示例、可视化图表和详细的文字说明,帮助读者理解和掌握面向数据流的分析与设计方法以及实时系统设计的要点。结构化软件开发方法虽然传统,但在许多领域仍然具有重要的应用价值。如果对某个知识点有疑问,或希望补充更多案例,欢迎随时交流!

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

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

相关文章

初步尝试AI应用开发平台——Dify的本地部署和应用开发

随着大语言模型LLM和相关应用的流行,在本地部署并构建知识库,结合企业的行业经验或个人的知识积累进行定制化开发,是LLM的一个重点发展方向,在此方向上也涌现出了众多软件框架和工具集,Dify就是其中广受关注的一款&…

高阶数据结构——哈希表的实现

目录 1.概念引入 2.哈希的概念: 2.1 什么叫映射? 2.2 直接定址法 2.3 哈希冲突(哈希碰撞) 2.4 负载因子 2.5 哈希函数 2.5.1 除法散列法(除留余数法) 2.5.2 乘法散列法(了解&#xff09…

7.安卓逆向2-frida hook技术-介绍

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:图灵Python学院 工具下载: 链接:https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

DB-GPT扩展自定义Agent配置说明

简介 文章主要介绍了如何扩展一个自定义Agent,这里是用官方提供的总结摘要的Agent做了个示例,先给大家看下显示效果 代码目录 博主将代码放在core目录了,后续经过对源码的解读感觉放在dbgpt_serve.agent.agents.expand目录下可能更合适&…

Android 架构演进之路:从 MVC 到 MVI,拥抱单向数据流的革命

在移动应用开发的世界里,架构模式的演进从未停歇。从早期的 MVC 到后来的 MVP、MVVM,每一次变革都在尝试解决前一代架构的痛点。而今天,我们将探讨一种全新的架构模式 ——MVI(Model-View-Intent),它借鉴了…

【YOLOv8-pose部署至RK3588】模型训练→转换RKNN→开发板部署

已在GitHub开源与本博客同步的YOLOv8_RK3588_object_pose 项目,地址:https://github.com/A7bert777/YOLOv8_RK3588_object_pose 详细使用教程,可参考README.md或参考本博客第六章 模型部署 文章目录 一、项目回顾二、文件梳理三、YOLOv8-pose…

集成30+办公功能的实用工具

软件介绍 本文介绍的软件是千峰办公助手。 软件功能概述与开发目的 千峰办公助手集成了自动任务、系统工具、文件工具、PDF工具、OCR图文识别、文字处理、电子表格七个模块,拥有30余项实用功能。作者开发该软件的目的是解决常见办公痛点,把机械操作交…

IDEA启动报错:Cannot invoke “org.flowable.common.engine.impl.persistence.ent

1.问题 项目启动报错信息 java.lang.NullPointerException: Cannot invoke "org.flowable.common.engine.impl.persistence.ent 2.问题解析 出现这个问题是在项目中集成了Flowable或Activiti工作流,开启自动创建工作流创建的表,因为不同环境的数据…

网络安全--PHP第三天

今天学习文件上传的相关知识 上传的前端页面如下 upload.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…

【愚公系列】《生产线数字化设计与仿真》004-颜色分类站仿真(基础概念)

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…

基于 uni-app + <movable-view>拖拽实现的标签排序-适用于微信小程序、H5等多端

在实际业务中&#xff0c;我们经常遇到「标签排序」或「菜单调整」的场景。微信小程序原生的 movable-view 为我们提供了一个简单、高效的拖拽能力&#xff0c;结合 Vue3 uni-app 的组合&#xff0c;我们可以实现一个体验良好的标签管理界面。 核心组件&#xff1a;<movab…

一些较好的学习方法

1、网上有一些非常经典的电路&#xff0c;而且有很多视频博主做了详细的讲解。 2、有一部分拆解的UP主&#xff0c;拆解后会还原该器件的原理图&#xff0c;并一步步做讲解。 3、有两本书&#xff0c;数电、模电&#xff0c;这两本书中的内容很多都值得学习。 5、某宝上卖的…

《1.1_4计算机网络的分类|精讲篇|附X-mind思维导图》

网络相关知识 按使用范围分类 公用网 由电信部门或其他提供通信服务的经营部门组建、管理和控制&#xff0c;向全社会提供服务的网络。 专用网 由某个单位或部门组建、仅供本单位或部门内部使用的网络。 按传输介质分类 有线网络 如&#xff1a;双绞线、同轴电缆、光纤…

Git 和 GitHub 学习指南本地 Git 配置、基础命令、GitHub 上传流程、企业开发中 Git 的使用流程、以及如何将代码部署到生产服务器

Windows 上 Git 安装与配置 下载安装&#xff1a;访问 Git 官方网站下载适用于 Windows 的安装程序。运行安装包时会出现许可协议、安装目录、组件选择等界面&#xff08;如下图&#xff09;。在“Select Components”页面建议勾选 Git Bash Here 等选项&#xff0c;以便在资源…

航空航天领域对滚珠丝杆的精度要求有多高?

航空航天领域对滚珠丝杆的精度要求非常高&#xff0c;尤其是飞行器、火箭和卫星等载具的导航和定位系统都需要高精度的滚珠丝杆&#xff0c;以确保高精度的位置控制和稳定的导航性能。那么&#xff0c;航空航天领域对滚珠丝杆的精度要求有多高&#xff1f; 1、定位精度&#xf…

技术篇-2.5.Matlab应用场景及开发工具安装

Matlab 在数学建模和数值分析等领域具有无可替代的地位。它几乎涵盖所有常见数学算法的内置函数库&#xff0c;使得从数据预处理、方程求解到优化算法的实现&#xff0c;无需编写大量底层代码即可快速完成&#xff1b;同时&#xff0c;Matlab 强大的可视化能力&#xff0c;可以…

Vtk概览1

vtk环境搭建 见&#xff08;VTK开发环境配置(Visual Studio C)-详细图文教程-CSDN博客&#xff09; 在学习vtk图形图像进阶的第二章时&#xff0c;通过vs2022建的控制台程序&#xff0c;编写运行示例2.1 发现 不显示图像。 #include <iostream> #include<vtkRenderW…

【数据集】基于ubESTARFM法的100m 地温LST数据集(澳大利亚)

目录 数据概述一、输入数据与处理二、融合算法1. ESTARFM(Enhanced STARFM)2. ubESTARFM(Unbiased ESTARFM)代码实现数据下载参考根据论文《Generating daily 100 m resolution land surface temperature estimates continentally using an unbiased spatiotemporal fusion…

Lucide:一款精美的开源矢量图标库,前端图标新选择

名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、前言:为何选择 Lucide?二、Lucide 是什么?1. 基本介绍2. Lucide vs Feather三、如何在项目中使用 Lucide?1. 安装图标包(以 React 为例)2…

BeanUtil和BeanUtils有什么区别

BeanUtil 和 BeanUtils 是两个常见的工具类&#xff0c;通常用于 Java 开发中处理对象之间的属性复制或转换。它们的功能可能看起来相似&#xff0c;但实际上它们来自不同的库&#xff0c;并且在实现细节和使用方式上存在一些差异。 以下是它们的主要区别&#xff1a; 1. 来源…