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

news2025/5/30 16:12:20

    结构化软件开发是一种传统且经典的软件开发方法,它强调将软件系统分解为多个独立的模块,通过数据流和控制流描述系统的行为。本章将结合 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 {
        @Override
        public void processTransaction(Transaction transaction) {
            System.out.println("处理存款事务: " + transaction.getAmount());
            // 存款处理逻辑
        }
    }

    // 取款处理器
    public static class WithdrawalHandler implements TransactionHandler {
        @Override
        public 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.coloradmin.cn/o/2386717.html

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

相关文章

Neo4j(三) - 使用Java操作Neo4j详解

文章目录 前言一、创建项目二、导入依赖三、节点和关系数据打印四、创建节点与关系五、查询数据方法六、更新数据方法七、删除节点与关系方法八、合并数据方法九、完整代码1. 完整代码2. 项目下载 前言 本文介绍通过 Java 操作 Neo4j 图数据库的完整流程。主要涵盖开发环境搭建…

蓝桥杯3503 更小的数

问题描述 小蓝有一个长度均为 n 且仅由数字字符 0∼9 组成的字符串,下标从 0 到 n−1,你可以将其视作是一个具有 n 位的十进制数字 num,小蓝可以从 num 中选出一段连续的子串并将子串进行反转,最多反转一次。 小蓝想要将选出的子…

算法-全排列

1、全排列函数的使用 举例&#xff1a;{1,2,3}的全排列 #include<iostream> #include<bits/stdc.h> using namespace std; typedef long long ll; int main(){ll a[3] {1, 2, 3};do{for (ll i 0; i < 3;i){cout << a[i] << " ";}cout…

最好用的wordpress外贸主题

产品展示独立站wordpress主题 橙色的首页大banner外贸英文wordpress主题&#xff0c;适合用于产品展示型的外贸网站。 https://www.jianzhanpress.com/?p8556 Machine机器wordpress模板 宽屏简洁实用的wordpress外贸建站模板&#xff0c;适合工业机器生产、加工、制造的外贸…

2025 河北ICPC( D. 金泰园(二分)-- C.年少的誓约(公式转化))

文章目录 2025 河北ICPCD. 金泰园&#xff08;二分&#xff09;C.年少的誓约(公式转化)总结 2025 河北ICPC 题目链接&#xff1a; Attachments - The 9th Hebei Collegiate Programming Contest - Codeforces sdccpc20250522 - Virtual Judge 赛时&#xff1a;5道 D. 金泰…

mongodb语法$vlookup性能分析

1 场景描述 mongodb有两个表department和user表&#xff0c; department表有_id,name,level&#xff0c;表有记录169w条 user表有_id,name,department_id&#xff0c;表有记录169w条&#xff0c;department_id没有创建索引&#xff0c;department_id是department的_id。 现…

晶圆隐裂检测提高半导体行业效率

半导体行业是现代制造业的核心基石&#xff0c;被誉为“工业的粮食”&#xff0c;而晶圆是半导体制造的核心基板&#xff0c;其质量直接决定芯片的性能、良率和可靠性。晶圆隐裂检测是保障半导体良率和可靠性的关键环节。 晶圆检测 通过合理搭配工业相机与光学系统&#xff0c…

在 LangChain 中集成 Mem0 记忆系统教程

目录 简介环境准备基础配置核心组件说明1. 提示模板设计2. 上下文检索3. 响应生成4. 记忆存储 工作流程解析使用示例关键特性完整代码与效果 简介 Mem0 是一个强大的记忆系统&#xff0c;可以帮助 AI 应用存储和检索历史对话信息。本教程将介绍如何在 LangChain 应用中集成 Me…

华润电力招聘认知能力测评及性格测评真题题库考什么?

华润电力招聘测评包含逻辑推理、数字推理、语言理解三大类型的问卷。共计58题。测评限时60分钟。其中逻辑推理、数字推理、语言推理分别限时20分钟&#xff0c;如逾时未完成相关测试&#xff0c;测试将自动终止&#xff0c;请注意测评时间。为了确保测评的连贯性&#xff0c;建…

Maven Profile在插件与依赖中的深度集成

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

手机平板等设备租赁行业MDM方案解析

目录 引言&#xff1a;MDM 在租赁行业的重要性日益凸显 用户场景&#xff1a;租赁公司面临的主要挑战 1. 设备丢失、逾期未还 2. 手动配置和恢复效率低 3. 非授权使用频繁 4. 时区设置混乱影响运维 5. 缺乏实时监管能力 EasyControl MDM&#xff1a;租赁设备的远程管控…

如何调试CATIA CAA程序导致的CATIA异常崩溃问题

问题背景&#xff1a;我采用CATIA CAA编写了一个界面的小程序&#xff0c;功能运行成功&#xff0c;但是每次运行完&#xff0c;关闭CATIA的时候&#xff0c;都会弹出这个对话框&#xff0c;这个对话框的意思是CATIA运行崩溃&#xff0c;点击确定后&#xff0c;CATIA就会意外关…

SQL查询效率以及索引设计

1. SQL 查询效率与数据库缓冲池机制 1.1. 数据库缓冲池&#xff08;Buffer Pool&#xff09; 磁盘 I/O 需要消耗的时间很多&#xff0c;而在内存中进行操作&#xff0c;效率则会高很多&#xff0c;为了能让数据表或者索引中的数据随时被我们所用&#xff0c;DBMS 会申请占用内…

day37打卡

知识点回顾&#xff1a;浙大疏锦行 过拟合的判断&#xff1a;测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint&#xff0c;还包含训练状态 早停策略 作业&#xff1a;对信贷数据集训练后保存权重&#xff0c;加载权重后继续训练50…

分布式缓存:证明分布式系统的 CAP 理论

文章目录 Pre一、分布式系统背景与特点二、CAP 三要素详解三、CAP 定理的反证证明四、CP 架构与 AP 架构对比典型场景 五、CAP 理论在系统设计中的应用六、总结 Pre 分布式缓存&#xff1a;CAP 理论在实践中的误区与思考 分布式缓存&#xff1a;BASE理论实践指南 分布式 - 从…

软件设计师“面向对象设计”真题考点分析——求三连

一、考点分值占比与趋势分析 综合知识历年考察统计 年份考题数分值占比考察重点2018334%继承类型、设计原则2019445.3%多态实现、类关系2020556.7%设计模式应用、接口隔离2021334%消息通信、封装特性2022668%开闭原则、组合模式2023556.7%模板方法、适配器模式2024445.3%单一…

AI大模型学习二十八、ACE-Step:生成式AI音乐大模型简介与安装(一)

一、说明 先来一首创作的歌&#xff1a; 在大模型和生成式AI模型大规模发达的今天&#xff0c;利用大模型生成音乐也是其中一个重要的发展方向。今天我们就介绍一个这样的音乐生成模型ACE-Step&#xff0c;可基于关键字和歌词生成歌曲&#xff1b;基于歌曲生成伴奏等等功能。 …

接口性能测试-工具JMeter的学习

接口登录链接http://111.230.19.204:8080/blog_login.html 一、JMeter基本使用流程 1、启动Jmeter 2、在“测试计划”下添加线程组 3、在“线程组”下添加“HTTP”取样器 4、填写“HTTP请求”的相关请求数据 5、在“线程组”下添加“查看结果树”监听器 6、点击“启动”按钮…

python如何离线安装pandas,numpy

1.首先在有网的电脑上正常安装python&#xff08;和离线环境一样的版本&#xff09; 然后 pip install pandas &#xff08;不嫌麻烦的话也可以自己手动去pandas PyPI​​​​​​​ 一个个下载&#xff09; 安装好后导出相关包&#xff0c;使用如下指令 2.然后相关依赖包就…

Java Swing 自定义JOptionPane

运行后的样式 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;public class demoB {public static void main(String[] args) {SwingUtilities.invokeLater(() -> {JFrame jf new JFrameDemo();jf.se…