《軟件工程》第 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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82495.shtml
英文地址,請注明出處:http://en.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. 來源…