软件工程第四周

模型建立的基本理念

模型是对现实世界复杂系统的简化和抽象,目的是为了更好地理解、分析和预测系统的行为。它能够真实反映研究对象的整体结构 or 某一侧面(功能、反应)的本质特征和变化规律可以建立不同的子模型用于反应系统不同的侧面。同时,也可以使用不同的方法学:结构化方法学Structured和面向对象方法学Object-Oriented。


结构化需求分析方法

结构化方法学是一种逻辑过程,它按照顺序、选择和迭代的方式来定义。其特点为:

  • 突出过程和步骤。
  • 适用于简单、线性和有明确定义的任务。

自顶向下,逐步求精。一定对应着迭代的过程!

对于逻辑模型(WHAT,我要做什么?),构建以下三个子模型:

数据层面:信息域的概念模型。ER。就是建立数据库的ER图。

功能层面:使用数据流图。DFD。数据的流动能够体现模型的功能。

行为层面:状态-迁移图。实时监控,自动化系统。STD。系统对外部事件的响应情况。

数据模型 

行为模型

功能模型

数据流出现的地方,一定有加工部分。数据流流动的动力来自于加工部分。可以是加工与加工部分,也可以是加工与存储部分,也可以是加工与源点、终点的部分,但不能脱离加工。

注意数据流的命名要明确、规范,便于存储固定成分。

可以简单记为:*代表&&,+代表&&和||, \oplus代表限流(只能允许选择一个进入或产出)。

数据的源点终点主要作用是确定系统边界。告诉我们用户是谁,便于访谈等需求分析的实施。

基本思想

搞好了,就能够交给开发者了。

上图中的事务就相当于mysql中的changelog,作为更新过程经过处理可以变成实际操作——更新库存信息,并且从数据库中提取库存信息,包括库存信息临界值。

注意事项

可以把同一层分成若干个子图有所侧重扩展具体的加工过程,最后再合并。

画图有一个7+-2法则,涉及到认知科学,超过这个法则就使得读者难以理解。

结构化方法中的子图

在结构化设计和分析中,为了更清晰地展示和理解系统的各个部分,通常会将大的、复杂的系统分解成多个更小、更简单的部分或子系统。这些子系统可以通过子图来表示。

  1. 子图的目的

    • 简化复杂性:大型系统可以非常复杂,将其分解成小的子系统或组件可以使设计和分析过程更容易进行。
    • 便于管理:当处理大型项目时,子图允许团队成员在不同的部分上并行工作
    • 重用和模块化:子系统或子图中的某些部分可能在其他项目中重用。
  2. 合并:一旦各个子图或子系统已经被定义和设计,它们可以被组合或集成到一个完整的系统中,保证整体功能和性能。

7±2法则

7±2法则是认知科学中的一个概念,它指的是人类短期记忆的容量大约在5到9个信息项之间,平均为7个。这是乔治·A·米勒在1956年的一篇文章中首次提出的。

  1. 应用

    • 界面设计中,为了保持用户界面简洁和易于理解,通常建议一次只显示7±2个选项或信息项
    • 在教育和培训中,为了确保学员能够有效地吸收和记住信息,内容通常被分为5到9个部分。
  2. 扩展理解:尽管7±2法则被广泛引用,但后续的研究表明,实际的数字可能更接近4。然而,这个原则的关键点是,人们的短期记忆容量是有限的,设计时应尽量简化信息和任务,以避免超出这个容量。

结合这两方面的内容,当使用结构化方法创建子图或设计系统时,应考虑7±2法则,以确保每个子图或组件不会过于复杂或包含过多的信息,从而确保易于理解和管理。

1. 当我们在DFD中解释或描述某个概念时,如果需要使用“”、“”、“以及”、“或者”这样的连词,很有可能表示这个概念或主题并没有被适当地分解或结构化。

这在写作、报告撰写、教程制作等多个领域都是一个常见的现象。

2. 千万不要有加工条件(如果……就这么加工),否则会带来控制流。

SRS(需求分析规格说明书)

SRS(软件需求规格说明书)是一个详细的文档,它描述了系统应该如何运行和功能。在功能需求部分,有必要进行详细的需求规约。

  1. 假定的输入方式

    • 这部分详细描述了用户如何与系统交互。这可能包括:键盘输入、鼠标点击、触摸屏手势、语音指令等。
    • 需要明确指出可以输入什么类型的数据,例如:文本、数字、日期等。
  2. 响应异常条件

    • 这部分描述了系统在遇到异常或错误输入时的行为。例如:如果用户输入了无效的日期,系统应该如何响应?
    • 可能包括错误消息、警告、日志记录等。
  3. 考虑系统的内部状态

    • 这部分描述了系统在不同状态下的行为。比如“老师-学生”在系统中的不同用户角色,要区分他们的相应权限和功能。
    • 例如,老师可能能够发布作业,而学生只能提交作业。当系统识别用户角色为“老师”时,应该提供发布作业的功能。

除了上述内容,SRS还可能包括其他关键部分,如:

  • 系统的总体描述:简要描述系统的目的、范围和用户。
  • 性能需求:描述系统的性能指标,如响应时间、处理能力等。
  • 设计约束:可能涉及到的技术、法律或合同约束。
  • 接口需求:描述系统与其他系统或硬件的交互。

确保SRS是完整的、一致的和无歧义的,因为它通常作为开发团队和客户之间的正式协议,并指导整个开发过程。


虚拟仿真实验最后一个图要保存在大作业的附录


系统流程图

包含物理部件的数据流动情况。图题一定要准确,一定要明确自己画的是流程图还是系统流程图还是数据流图,明显区别在于是数据流还是控制流。

  • 描述系统中各个物理部件之间的互动和流动,既可以是数据流也可以是控制流。
  • 它更偏重于表示系统的物理组件(如硬件设备)和这些组件之间如何交互。
  • 例如,在计算机网络中,系统流程图可能会显示路由器、交换机、服务器以及它们之间的数据包流动情况。

需求分类

在软件工程中,需求是系统应有的特性、功能和性能等方面的描述。根据其性质和描述的内容,需求可以被分类为以下几类:

  1. 功能需求(Functional Requirements,需求主体)

    • 定义:描述了系统应当执行的任务或功能。
    • 内容:它们指定了系统能够提供的服务,例如:“系统应该允许用户注册新账号”或“系统应能处理在线支付”。
    • 用户方面的需求可能会出现描述不严密的情况,所以往往采用系统需求。
  2. 非功能性需求(Non-Functional Requirements)

    • 定义:描述了系统的性能、可靠性、安全性等质量属性,而不是具体功能。
    • 内容:例如,数据备份频率、系统的可用性标准、数据加密方法等。
    • (大作业中增加一到两个)
  3. 性能需求(Performance Requirements)

    • 定义:描述了系统的性能标准。
    • 内容:例如,系统的响应时间、处理能力、用户并发数等。
    • 解决方法:为了确保明确性,常常需要对这些需求进行量化,例如:“95%的请求应在2秒内得到响应”。
  4. 环境需求(Environmental Requirements)

    • 定义:描述了系统运行的硬件、软件、网络和其他环境条件
    • 内容:例如,服务器的硬件配置、操作系统版本、支持的浏览器类型等。
  5. 质量属性(Quality Attributes)

    • 定义:描述了与系统整体质量相关的需求。
    • 内容:例如,可维护性、扩展性、可靠性、安全性等。

需求分类的意义

需求分类的主要目的是帮助项目团队更好地理解、沟通和满足客户的期望。明确分类可以:

  • 确定需求获取方法:不同类型的需求可能需要不同的获取方法,如访谈、观察、问卷调查等。
  • 明确访谈对象:例如,性能需求可能需要与系统管理员沟通,而功能需求可能需要与终端用户沟通。

通过这种方式,需求分类确保了项目团队可以全面、准确地收集和记录所有相关的需求,从而为项目的成功奠定坚实的基础。


面向数据流与快速原型法

面向数据流的分析方法与快速原型法是两种不同的需求分析和获取方法。面向数据流分析法,是比快速原型更精细的需求获取方法。

面向数据流的分析方法(Data Flow Oriented Analysis)

  • 定义:面向数据流的分析方法是一种系统分析方法,它侧重于捕获、表示和分析在系统中流动的数据的过程。通常使用数据流图(DFD)来描述系统的数据流、过程、数据存储和外部实体。

  • 优点

    • 结构化:提供了一种系统的层次化和模块化表示,使其更易于理解。
    • 专注于数据:这种方法强调了数据在系统中的流动和处理,这对于数据密集型的应用尤其重要。
    • 清晰地定义界限:通过明确的外部实体和数据存储,可以明确地界定系统的范围和边界。
  • 缺点

    • 可能不足以捕获某些复杂的用户交互或界面元素。
    • 可能需要多轮迭代来完善和细化。

应用场景

  • 当系统的核心是数据流和数据处理时。
  • 当项目的需求比较明确,且对数据流和数据交互有明确的要求时。

快速原型法(Rapid Prototyping)

  • 定义:快速原型法是一种需求获取和验证方法,它侧重于快速创建系统的工作模型或原型,以便用户能够看到和与其交互。

  • 优点

    • 直观:用户可以实际看到和体验原型,这有助于消除歧义和误解。
    • 快速反馈:开发人员可以迅速获得用户的反馈,并相应地进行调整。
    • 适应性:允许在开发过程中进行迭代和更改,这特别适用于需求不明确或可能发生变化的项目。
  • 缺点

    • 原型可能被错误地视为最终产品,导致关键需求或结构问题被忽视。
    • 如果不适当地管理,可能会导致项目范围的膨胀。

应用场景

  • 当项目的需求不是很明确或可能会发生变化时。
  • 当需要快速地收集用户反馈和调整需求时。

总结

数据流分析方法通常更细致,而快速原型法更加灵活和迭代。在实际的项目环境中,这两种方法可以结合使用,以确保需求的完整性和准确性。

  • 对于数据密集型的应用或需求明确的项目,可以首先使用面向数据流的分析方法定义和描述系统的数据流,然后使用快速原型法验证这些数据流与实际的用户交互和界面是否一致。

  • 对于需求不明确或可能会发生变化的项目,可以首先使用快速原型法收集和验证用户需求,然后使用面向数据流的分析方法为已验证的需求提供更细致的描述。


第四章 系统设计

体系结构的起源——软件系统的复杂性

能否通过复用的方式降低软件开发的复杂性?

很多非功能需求来自于软件本身的体系结构,规格说明和结构设计大于数据结构算法。体系结构能够提升我们对于非功能性需求的要求。


软件开发阶段

软件开发经历了许多发展阶段,从简单的函数编程到现代的面向服务设计。这个演变的过程中,主要的目标是提高软件的可维护性、可复用性、可扩展性和可靠性。

以下是各个发展阶段介绍: 

函数(Function)

  • 早期的软件设计主要基于函数和过程。每个函数具有特定的任务或功能。
  • 信息隐藏: 每个函数内部的实现细节对外部是隐藏的。
  • 接口简单: 通过参数传递数据并返回结果。
  • 低耦合: 通过模块化和适当的函数设计,可以实现函数之间的低耦合。

对象(Object)

  • 在面向对象的设计中,软件被视为对象的集合,这些对象可以代表现实世界中的实体或概念。
  • 信息隐藏: 通过私有变量和公有方法实现。
  • 接口简单: 对象提供的方法定义了它与外部世界的交互方式。
  • 低耦合: 通过继承、多态和封装,对象可以独立于其他对象。

构件(Component)

  • 构件是独立的、可重用的模块化软件单位。它们封装了特定的功能或服务,并通过定义好的接口与其他构件交互。这些构件可以被看作是软件中的积木,它们可以组合在一起创建更大的系统或应用。
  • 信息隐藏: 构件的内部实现被完全封装,用户只能看到其接口。
  • 接口简单: 构件的接口应当简洁明了,提供明确的功能或服务。
  • 低耦合: 通过明确定义的接口和消息传递,构件之间的交互可以降低耦合。

面向服务(Service Oriented)

  • 面向服务的架构(SOA)视应用程序为一组提供特定功能的服务集合,每个服务都是独立的并专注于完成单一任务。
  • 这种架构的核心思想是提供一个灵活、可扩展和可复用的设计,其中服务通常由跨网络的不同系统提供,并通过标准化的接口进行通信。
  • 为了实现这种设计,开发者通常会依赖某种框架(如Web服务框架)来实现服务的创建、发布、发现和通信。
  • 尽管服务各自独立,但它们的设计都重视信息的隐藏、简洁的接口和低耦合性。这确保了各服务之间可以方便地进行互操作,同时还保留了各自的独立性和可维护性。

也就是说,构件思想:系统分解,每个构件包含一定的功能;而面向服务架构思想:系统分解成各个独立的服务,每个服务对应一个任务。

  1. 构件分解: 当我们说到构件,我们是指系统中的独立、可重用的模块或单位。这些构件通常会封装特定的功能或逻辑,并通过定义好的接口与其他构件或系统进行交互。构件的设计使得它们可以在不同的应用程序或系统中重复使用,从而提高开发效率和软件质量。

  2. 服务分解: 在面向服务的架构(SOA)中,系统则是由一系列服务组成,每个服务对应一个特定的任务或功能。这些服务是独立的,可以跨网络边界进行通信,并且被设计为可复用的。例如,一个服务可能处理用户认证,而另一个服务处理支付事务。服务之间通过定义明确的接口(例如APIs)进行通信,这些接口提供了一种标准化的方式来请求服务的功能。

整体上,从函数到面向服务的演变过程体现了软件设计的核心思想,即封装细节、简化接口并降低系统间的耦合。这使得软件更加模块化、可维护和可扩展。

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

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

相关文章

DP读书:《openEuler操作系统》(四)鲲鹏处理器

鲲鹏处理器 一、处理器概述1.Soc2.Chip3.DIE4.Cluster5.Core 二、体系架构1.计算子系统2.存储子系统3.其他子系统 三、CPU编程模型1.中断与异常2.异常级别a.基本概念b.异常级别切换 下面为整理的内容:鲲鹏处理器 架构与编程(一)处理器与服务器…

Leetcode290. 单词规律

给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 解题思路:哈希 力扣(LeetCode&…

MIT 6.S081学习笔记(第二章)

〇、前言 本文主要完成MIT 6.S081 实验二:system call 一、Using gdb (easy) Question requirements In many cases, print statements will be sufficient to debug your kernel, but sometimes being able to single step through some assembly code or inspe…

【C++】运算符重载 ⑤ ( 一元运算符重载 | 使用 成员函数 实现 前置 ++ 自增运算符重载 | 使用 成员函数 实现 前置 - - 自减运算符重载 )

文章目录 一、一元运算符重载1、使用 成员函数 实现 前置 自增运算符重载2、使用 成员函数 实现 前置 - - 自减运算符重载 二、完整代码示例 一、一元运算符重载 1、使用 成员函数 实现 前置 自增运算符重载 使用 全局函数 实现 前置 自增运算符重载 : 首先 , 写出函数名 ,…

Java数据结构————优先级队列(堆)

一 、 优先级队列 有些情况下,操作的数据可能带有优先级, 一般出队列时,可能需要优先级高的元素先出队列。 数据结构应该提供两个最基本的操作, 一个是返回最高优先级对象, 一个是添加新的对象。 这种数据结构就是优…

[架构之路-228]:计算机硬件与体系结构 - 硬盘存储结构原理:如何表征0和1,即如何存储0和1,如何读数据,如何写数据(修改数据)

目录 前言: 一、磁盘的盘面组成 1.1 磁盘是什么 ​编辑1.2 磁盘存储介质 1.3 磁盘数据的组织 1.3.1 分层组织:盘面号 1.3.2 扇区和磁道 1.3.3 数据 1.3.4 磁盘数据0和1的存储方式 1.3.5 磁盘数据0和1的修正方法 1.3.6 磁盘数据0和1的读 二、…

(四)正点原子STM32MP135移植——u-boot移植

一、概述 u-boot概述就不概述了,u-boot、kernel、dtb三件套,dddd 经过国庆艰苦奋战,已经成功把所有功能移植好了 二、编译官方代码 进入u-boot的目录 2.1 解压源码、打补丁 /* 解压源码 */ tar xf u-boot-stm32mp-v2022.10-stm32mp-r1-r0.…

mysql双主双从读写分离

架构图: 详细内容参考: 结果展示: 178.119.30.16(从)- master 178.119.30.17(从)- slave 由上述结果可以看出,产生了主备节点同时抢占VIP的问题(即脑裂问题&#xff09…

React18入门(第二篇)——React18+Ts项目配置husky、eslint、pretttier、commitLint

前言 我的项目版本如下: React: V18.2.0Node.js: V16.14.0TypeScript:最新版工具: VsCode 本文将采用图文详解的方式,手把手带你快速完成在React项目中配置husky、prettier、commitLint,实现编码规范的统…

nodejs+vue养老人员活体鉴权服务系统elementui

系统 统计数据:统计报表、人员台账、机构数据、上报数据、核验报表等,养老人员活体鉴权服务是目前国家养老人员管理的重要环节,主要为以养老机构中养老人员信息为基础,每月进行活体鉴权识别并统计数据为养老补助等管理。前端功能&…

使用正则表达式批量修改函数

贪心匹配,替换中的$1代表括号中的第一组。 使用[\s\S\r]代表所有字符,同时加个问号代表不贪心匹配:

springboot学生管理系统

采用技术:springbootvue 项目亲测可以完美运行

MySql运维篇---008:日志:错误日志、二进制日志、查询日志、慢查询日志,主从复制:概述 虚拟机更改ip注意事项、原理、搭建步骤

1. 日志 1.1 错误日志 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的&a…

竞赛 机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统 -python

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 🔥 优质竞赛项目系列&#x…

【数据结构】抽象数据类型

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 🎏数据类型 🎏抽象数据类型 结语 🎏数据类型 数据类型:是指一组性质相同的值的集合及定义在此集合上的一些操作的总称. 数据类型(d…

集合原理简记

HashMap 无论在构造函数是否指定数组长度&#xff0c;进行的都是延迟初始化 构造函数作用&#xff1a; 阈值&#xff1a;threshold&#xff0c;每次<<1 &#xff0c;数组长度 负载因子 无参构造&#xff1a;设置默认的负载因子 有参&#xff1a;可以指定初始容量或…

三、thymeleaf基本语法

3.1、基本语法 3.1.1变量表达式&#xff1a;${...} 变量表达式用于在页面中输出指定的内容&#xff0c;此内容可以是变量&#xff0c;可以是集合的元素&#xff0c;也可以是对象的属性。主要用于填充标签的属性值&#xff0c;标签内的文本&#xff0c;以及页面中js变量的值等…

数学建模Matlab之基础操作

作者由于后续课程也要学习Matlab&#xff0c;并且之前也进行了一些数学建模的练习&#xff08;虽然是论文手&#xff09;&#xff0c;所以花了几天零碎时间学习Matlab的基础操作&#xff0c;特此整理。 基本运算 a55 %加法&#xff0c;同理减法 b2^3 %立方 c5*2 %乘法 x 1; …

如何利用mp进行条件查询

在mp中进行条件查询发函数是selectList(); 使用上面的方式参数容易传错&#xff0c;所以可以使用下面的方式进行条件查询&#xff1a; 但是使用这种方式可能传的值为空 使用下面的方式可以避免这种情况发生 总结

PHP8中final关键字的应用-PHP8知识详解

在PHP8中&#xff0c;final的中文含义是最终的、最后的意思。被final修饰过的类和方法就是“最终的版本”。 如果关键字final放在类的前面&#xff0c;则表示该类不能被继承。 如果关键字final放在方法的前面&#xff0c;则表示该 方法不能被重新定义。 如果有一个类的格式为…