1.软件工程
1.软件工程的定义
软件工程是指应用计算机科学、数学及管理科学等原理,以工程化的原则和方法来解决软件问题的工程,其目的是提高软件生产率、提高软件质量、降低软件成本。
2.软件的生命周期
- 可行性研究与项目计划:确定软件项目的目标和范围,进行可行性分析,包括技术可行性、经济可行性和社会可行性等方面的研究。制定可行性分析报告和项目开发计划
- 需求分析:与用户沟通,深入了解用户对软件的功能、性能、可靠性等方面的需求,形成需求规格说明书。功能需求和非功能需求
- 概要设计:明确软件是由哪些模块组成的,每个模块主要要实现哪些功能
- 详细设计:每个模块如何来实现这一功能,实现细节是什么
- 编码:根据软件设计文档,选择合适的编程语言和开发工具,将设计转化为计算机可执行的代码。在编码过程中,需要遵循一定的编程规范和风格,以提高代码的可读性和可维护性。
- 测试:通过各种测试方法,如单元测试、集成测试、系统测试和验收测试等,检查软件是否满足需求规格说明书的要求,发现软件中的缺陷和错误。测试是保证软件质量的重要环节,能够有效降低软件的故障率和维护成本。
- 软件维护:软件交付使用后,需要对其进行维护,以修正错误、改进性能、适应环境变化等。维护活动包括改正性维护、适应性维护、完善性维护和预防性维护等。软件维护是一个长期的过程,贯穿于软件的整个生命周期。
3.软件过程模型
软件过程模型也叫软件开发模型,它是软件开发全部过程、活动和任务的结构框架。
1.瀑布模型

以文档为指导
优点:管理成本低
缺点:客户必须完整、准确表达需求;直到项目结束之前,都不能演示系统;风险控制能力差
- 特点:按照线性顺序依次进行需求分析、设计、编码、测试、维护等阶段,如同瀑布流水一样,每个阶段都有明确的输入和输出,前一个阶段完成后才进入下一个阶段。
- 适用场景:适用于需求明确、稳定,技术成熟,项目规模较大且对文档要求较高的软件开发项目。
2.增量模型

每一个增量可以分别开发
优点:第一个版本交付时间少,风险小,可有效应对需求变更
缺点:开发周期长,项目管理复杂;增量可能对之前工作带来影响
- 特点:将软件项目划分为多个增量,每个增量都包含软件的一部分功能,按照一定的顺序逐步开发和交付这些增量,每次交付一个增量,让用户能够逐步使用软件的功能,同时根据用户反馈对后续增量的开发进行调整。
- 适用场景:适用于项目工期较长、用户对软件功能有逐步增加或改进需求的情况,能够在一定程度上降低项目风险,提高用户满意度。
3.演化模型
1.原型模型

适用于对软件需求缺乏认识的情况,不适合大型系统
原型模型,又叫快速原型,是预期系统的一个可执行版本,反映了系统性质的一个选定的子集。
一个原型不必满足目标软件的所有约束,其目的是快速、低成本的构建原型
探索型、实验型、演化型
2.螺旋模型

螺旋模型是将瀑布模型和演化模型结合起来,加入了两者都忽略的风险分析。螺旋模型将开发过程分为几个螺旋周期,每个周期大致跟瀑布模型相符。每个周期又分为:制定计划、风险分析、实施工程、用户评估4步
特点:强调风险分析,适用于庞大复杂风险高的系统
缺点:周期长开发难度大
4.喷泉模型(没人用)
- 特点:是一种以用户需求为动力,以对象为驱动的模型,主要用于面向对象的软件开发。该模型认为软件开发过程中的各个阶段是相互重叠和迭代的,就像喷泉中的水一样,各个阶段之间没有明显的界限,可以在不同阶段之间频繁地切换和交互。
- 适用场景:适用于面向对象的软件开发项目,特别是那些需要高度的灵活性和可维护性,以及对软件的复用性有较高要求的项目,如大型的企业级应用系统、分布式系统等。
- 缺点:人员多,管理难度大,版本控制难度大
5.基于构件的开发模型(不重要)
- 特点:将软件系统看作是由一系列可复用的构件组成,通过对这些构件的组装和集成来构建软件系统。在开发过程中,首先需要对软件系统进行构件化分析和设计,确定系统中可以复用的构件,并开发或获取这些构件。然后,根据系统的需求,将这些构件进行组装和集成,形成完整的软件系统。同时,还需要建立构件库和相应的管理机制,以便对构件进行有效的管理和维护。
- 适用场景:适用于软件系统中存在大量可复用构件的情况,如企业信息系统、电子商务系统等,这些系统中通常有许多通用的功能模块,如用户管理、数据访问、报表生成等,可以通过构件化的方式进行开发和复用,提高软件开发效率和质量。
6.形式化方法模型(不重要)
- 特点:使用严格的数学和逻辑方法来描述和验证软件系统的规格说明和设计。通过形式化的语言和工具,将软件系统的需求和设计转化为数学模型,然后运用数学推理和验证技术来证明软件系统的正确性和可靠性。形式化方法模型可以有效地避免软件系统中的模糊性和不一致性,提高软件的质量和安全性。
- 适用场景:适用于对软件系统的安全性、可靠性要求极高的领域,如航空航天、国防、金融等领域的关键软件系统。这些领域的软件系统一旦出现错误,可能会导致严重的后果,因此需要采用形式化方法来确保软件的正确性和可靠性。
7.统一过程模型
- 特点:统一过程模型是一种用例和风险驱动,以架构为中心,迭代并增量的开发过程。迭代是指将整个软件开发划分为多个小项目,每个项目均定义了4各阶段。
- 适用场景:适用于各种规模和类型的软件开发项目,特别是那些对软件质量和项目管理要求较高的项目。它提供了一套较为完整的软件开发流程和方法,可以帮助开发团队有效地管理项目风险,提高软件的可维护性和可扩展性。
- 初始阶段(Inception):也叫起始阶段,主要工作是确定项目的目标、范围和愿景,进行初步的业务需求分析,并对项目的可行性和风险进行评估 。该阶段需要明确项目的关键需求、主要用例,勾勒出候选架构,编制初始的业务案例,从业务角度指出该项目的价值,判断项目是否值得继续投入资源。比如开发一款电商 APP,此阶段会确定核心功能如商品展示、购物车、支付等,评估开发成本、技术难度等是否可行。其重要里程碑是生命周期目标。
- 精化阶段(Elaboration):对项目的问题域进行深入分析,进一步细化和明确系统需求,完善并确定系统的架构基础,识别和解决项目中的关键风险。同时,建立较为详细的项目计划,对成本和进度进行更准确的估算。继续以电商 APP 为例,会详细分析用户购物流程、界面交互等需求,确定后端数据库架构、前端技术框架等,评估如支付接口对接、数据安全等风险。该阶段的里程碑是生命周期架构。
- 构建阶段(Construction):基于精化阶段确定的架构和需求,进行系统的实际开发和构建,持续集成并实现所有功能和需求,将各个模块进行整合和测试,不断完善软件,确保产品达到可以交付的状态。对于电商 APP,开发团队会完成各个功能模块的编码、测试和集成,实现商品搜索、下单、物流跟踪等功能。此阶段的里程碑是初始运作功能。
- 移交阶段(Transition):将开发完成的软件交付给最终用户,包括软件的部署、用户培训、技术支持以及维护准备等工作。收集用户反馈,对软件进行最后的调整和优化,以确保软件能够在实际使用环境中稳定运行。如电商 APP 上线后,为商家和用户提供培训,处理使用过程中的问题和反馈。该阶段的里程碑是产品发布。
8.敏捷开发模型
不咋写文档,极限编程xp和敏捷统一过程
- 特点:强调团队合作、快速响应变化、客户参与和持续交付。采用迭代式的开发方式,每个迭代周期都包含从需求分析、设计、开发到测试的完整过程,通过频繁的沟通和反馈,及时调整项目方向和优先级,以适应不断变化的需求。
- 适用场景:适用于需求变化频繁、项目规模较小、需要快速响应市场变化的软件开发项目,能够提高软件的灵活性和可适应性。
极限编程:需求变化频繁、需要高质量代码的项目
水晶法:强调团队沟通、频繁交付和反思改进。
并列争球法:强调团队协作、迭代开发和持续改进
4.软件测试
1.软件测试步骤
单元测试、集成测试、系统测试、验收测试
记对应的箭头

2.软件测试方法
白盒测试
- 定义:白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。它是一种测试方法,通过检查软件的内部结构和代码实现来验证软件的功能和逻辑是否正确。
- 测试方法
- 语句覆盖:设计足够的测试用例,使得程序中的每一条语句至少被执行一次。(最弱)
- 判定覆盖:设计足够的测试用例,使得程序中的每个判定的取真分支和取假分支至少被执行一次。
- 条件覆盖:设计足够的测试用例,使得程序中每个判定条件的所有可能结果至少被执行一次。
- 判定 - 条件覆盖:设计足够的测试用例,使得程序中的每个判定和判定中的每个条件的所有可能结果至少被执行一次。
- 条件组合覆盖:设计足够的测试用例,使得程序中每个判定的所有可能的条件取值组合至少被执行一次。
- 路径覆盖:设计足够的测试用例,使得程序中的每一条可能的执行路径至少被执行一次。
- 适用场景:适用于软件开发的早期阶段,如单元测试、集成测试等。开发人员可以通过白盒测试来检查自己编写的代码是否符合设计要求,是否存在逻辑错误和漏洞。
黑盒测试
- 定义:黑盒测试又称功能测试、数据驱动测试或基于规格说明的测试。它是一种从用户角度出发的测试方法,通过检查软件的功能和行为是否符合需求规格说明书的要求来验证软件的正确性。
- 测试方法
- 等价类划分:将输入数据划分为若干个等价类,从每个等价类中选取一个代表性的数据作为测试用例,以减少测试用例的数量。
- 边界值分析:选取输入数据的边界值作为测试用例,因为边界值往往是程序容易出现错误的地方。
- 适用场景:适用于软件测试的各个阶段,尤其是在系统测试和验收测试阶段。测试人员可以通过黑盒测试来验证软件是否满足用户的需求,是否存在功能缺陷和易用性问题。
5.软件维护
1.软件维护的定义
软件维护是在软件已经交付使用之后为了改正错误或满足新的需求而修改软件的过程,即软件在交付使用后对软件所做的一切改动。
2.文档
- 用户文档描述系统功能和使用方法,并不关心技术实现。
- 系统文档描述系统设计、实现和测试等各方面的内容。
文档是软件可维护性的决定因素,必须完整、准确维护阶段对软件的任何修改都必须反映在用户文档和系统文档中
3.软件系统维护
- 硬件维护:定期的设备保养型维护,突发性故障维护
- 软件维护
- 正确性维护是指改正在系统开发阶段已发生而系统测试阶段尚未发现的错误。
- 适应性维护是指使应用软件适应信息技术变化和管理需求变化而进行的修改。
- 完善性维护是指为扩充功能和改善性能而进行的修改,主要是指对已有软件系统增加一些在系统分析设计阶段没有的功能与性能特征。
- 预防性维护是指为了改进应用软件的可靠性和可维护性为了适应未来的软/硬件环境的变化,主动增加预防性的新功能。
- 数据维护:数据库的日常运维,包括数据库代码维护(也可以是文件)
4.软件质量特性
- 功能性:
- 适应性:强调软件为规定任务提供合适功能的属性。例如办公软件能针对不同办公场景提供相应功能。
- 准确性:关乎软件输出结果的正确性。如财务软件计算数据的精准度。
- 互用性:体现软件与其他系统交互操作的能力。像不同银行系统间的数据交互。
- 依从性:指软件遵循相关标准法规等的属性。比如医疗软件要符合医疗行业法规。
- 安全性:重点在保护程序和数据不被非授权访问。如支付软件对用户资金信息的保护。
- 可靠性:
- 成熟性:通过软件故障引发失效的频度衡量。成熟的操作系统,故障引发失效的频率低。
- 容错性:表示软件在出现错误或违反接口规定时维持性能的能力。例如数据库软件在数据异常输入时仍能稳定运行。
- 易恢复性:涵盖故障后恢复性能和数据的能力及所需时间精力。如电商系统在服务器故障后能快速恢复正常交易功能 。
- 易使用性:
- 易理解性:衡量软件让用户理解其逻辑概念及应用的难易程度。比如一款简单直观的绘图软件,用户能轻松明白各工具的用途。
- 易学性:指用户学习软件操作(如控制、输入输出)的难易情况。像新推出的手机 APP,若新手能快速上手,就说明易学性好。
- 易操作性:此处对易操作性的定义有误,易操作性应是指软件让用户易于操作和控制的属性,而不是与其他系统交互操作的能力 。例如办公软件的界面布局合理,操作按钮便捷,方便用户使用。
- 效率:
- 时间特性:涉及软件响应、处理速度及执行功能时的吞吐量。如搜索引擎,快速给出搜索结果体现良好的时间特性。
- 资源特性:关注软件执行功能时使用资源的量和时长。像一些轻量级的杀毒软件,占用系统资源少,运行时间长也不卡顿。
- 可维护性:
- 易分析性:指软件便于开发人员找出缺陷或失败原因,以及确定需要修改部分的程度。比如代码结构清晰、注释完备的软件,更易分析问题。
- 易改变性:表示软件在修改、排错或适应环境变化时的难易程度。模块化设计的软件,修改和调整相对容易 。
- 稳定性:体现软件在修改后出现意外不良后果的风险大小。经过充分测试和严格版本控制的软件,修改后稳定性更高。
- 易测试性:说明确认修改后的软件是否符合预期所花费精力的多少。具备完善测试框架的软件,更易进行测试 。
- 可移植性:
- 适应性:指软件在不同环境(如不同操作系统、硬件平台)中正常运行并处理相关事务的能力。例如跨平台的办公软件。
- 易安装性:衡量在指定环境中安装软件的便捷程度。如一些绿色免安装软件,易安装性就很高。
- 一致性:强调软件遵循可移植性相关标准和约定的程度,这有助于软件在不同环境下保持行为的一致性。
- 易替换性:涉及一个软件在特定环境中替代其他指定软件的可能性和所需付出的努力。如功能类似的数据库软件之间的替换 。
5.软件度量-McCabe
判断节点数+1


2.数据库
1.数据模型
1.E-R模型
- 实体:是现实世界中具有独立存在意义的事物,如一个人、一个部门、一本书等。在 ER 模型中,实体通常用矩形框表示,框内写上实体的名称。
- 属性:是实体所具有的特征或性质,用来描述实体的各个方面。例如,学生实体可能具有学号、姓名、年龄等属性。属性通常用椭圆形表示,并用连线与相应的实体连接起来。
- 联系:表示实体之间的关联关系。例如,学生与课程之间存在 “选修” 联系,教师与课程之间存在 “教授” 联系。联系用菱形框表示,框内写上联系的名称,并用连线将相关的实体连接起来。
- 一对一联系(1:1):实体集 A 中的一个实体至多与实体集 B 中的一个实体相对应,反之亦然。例如,一个班级只有一个班主任,一个班主任只负责一个班级。
- 一对多联系(1:n):实体集 A 中的一个实体与实体集 B 中的多个实体相对应,而实体集 B 中的一个实体至多与实体集 A 中的一个实体相对应。例如,一个教师可以教授多门课程,而一门课程只能由一个教师教授。
- 多对多联系(m:n):实体集 A 中的多个实体与实体集 B 中的多个实体相对应。例如,一个学生可以选修多门课程,一门课程也可以有多个学生选修。


2.关系模型

3.数据库模式
外模式:视图层(最抽象,接近用户的一层)用户视图
概念模式:逻辑层(基本表)
内模式:物理层(存储文件)
2.关系代数
1.并∪

2.交∩

3.差-

4.选择σ

5.投影π

6.笛卡尔积×

7.连接⊳⊲

8.例题


3.函数依赖
1.完全函数依赖

2.部分函数依赖

3.传递依赖

4.码,主属性、非主属性、外码、关键字



5.Armstrong定理
Armstrong 公理是一种用于关系数据库中函数依赖推理的公理系统,由 W. W. Armstrong 于 1974 年提出。它包含以下三条基本公理:

- 自反律(Reflexivity):若Y⊆X,则X→Y。也就是说,一个属性集总是能够函数决定它的任何子集。例如,在学生表中,学生的学号ID可以决定其所在的班级Class,那么ID和Class的组合(ID,Class)必然也能决定Class。
- 增广律(Augmentation):若X→Y,则XZ→YZ。其中XZ和YZ分别表示在X和Y的基础上增加属性集Z。例如,已知学生学号ID可以决定学生姓名Name,那么在增加了课程号CourseID这个属性后,(ID,CourseID)就能决定(Name,CourseID)。
- 传递律(Transitivity):若X→Y且Y→Z,则X→Z。例如,学生的学号ID决定了其所在班级Class,而班级Class又决定了班主任Teacher,那么通过传递律可以得出学号ID决定班主任Teacher。
从这三条基本公理还可以推导出以下三条推论:
- 合并规则(Union Rule):若X→Y且X→Z,则X→YZ。例如,学号ID既能决定学生姓名Name,又能决定学生年龄Age,那么学号ID就能决定(Name,Age)这个属性集。
- 分解规则(Decomposition Rule):若X→YZ,则X→Y且X→Z。这是合并规则的逆过程,例如学号ID能决定(Name,Age),那么学号ID必然能分别决定Name和Age。
- 伪传递规则(Pseudotransitivity Rule):若X→Y且WY→Z,则WX→Z。例如,若学号ID决定学生姓名Name,而学生姓名Name和课程名CourseName一起决定成绩Grade,那么学号ID和课程名CourseName就能决定成绩Grade。

6.求码




7.冲突
- 属性冲突:包括类型冲突,如年龄在不同 E - R 图中分别为整数型和日期型;取值范围冲突,像员工工资在不同部门 E - R 图中范围不同。
- 命名冲突:同名异义,即相同名字含义不同,如不同部门 “订单号” 指代不同;异名同义,不同名字指同一事物,如 “产品编号” 和 “货品编码” 。
- 结构冲突:同一对象不同抽象,如教师在不同系统分别被视为独立实体和职工子集;同一实体属性差异,如不同部门对职工实体的属性定义不同;实体间联系冲突,如客户与商品在不同系统联系类型不同。
- 实体冲突:严格来说它并非标准冲突类型。一般可理解为不同 E - R 图中对同一实体的定义、角色认知等存在矛盾,比如不同部门对 “供应商” 实体,在业务中的重要性和关联业务理解不同 。

4.范式
不存在传递依赖

5.数据库设计
1.数据库设计步骤
需求分析
需求分析是在项目确定之后,用户和设计人员对数据库应用系统所要涉及的内容(数据)和功能(行为)的整理和描述,是以用户的角度来认识系统。
数据字典、数据流图(DFD)
概念结构设计
概念结构设计是依照需求分析中的信息要求对用户信息加以分类、聚集和概括,建立信息模型,并依照选定的数据库管理软件转换为数据的逻辑结构。
用E-R图建立概念模型
逻辑结构设计
逻辑结构设计即是在概念结构设计的基础上进行的数据模型设计。
- E-R模型转换为关系模型
- 关系模型规范化
- 确定完整性约束
- 确定用户视图
物理结构设计
- 选择存储结构:根据数据库管理系统的特点和应用需求,选择合适的存储结构,如堆文件、索引文件、散列文件等。例如,对于经常需要按照某个字段进行快速查询的数据,可以选择建立索引文件来提高查询效率。
- 设计索引:分析应用程序的查询模式,确定需要创建的索引。索引可以加快数据的查询速度,但也会增加存储空间和维护成本。一般选择在经常用于查询条件、连接条件以及排序的字段上创建索引。
- 分配存储空间:根据数据量的大小和增长趋势,估算数据库所需的存储空间,并合理分配磁盘空间。考虑到未来数据的增长,要预留一定的扩展空间。
3.结构化
1.系统分析
系统分析是一种问题求解技术,它将一个系统分解为各个组成部分,目的是研究各部分如何工作、交互,以实现其系统目标。
2.系统设计
1.基本概念
- 抽象:是一种设计技术,重点说明一个实体的本质方面,而忽略或掩盖非本质的方面。
- 模块化:是指将一个待开发的软件分解为若干小的简单的部分模块,每个模块可独立开发、测试,最后组装为完整的程序。
- 信息隐藏:将每个程序的成分隐蔽或封装在一个单一的设计模块中,在定义每个模块时尽可能少的显露其内部的处理
- 模块独立:每个模块完成一个相对独立的特定子功能,并且与其它模块之间的联系简单。衡量独立性有两个标准:耦合性、内聚性
1.耦合
耦合:是模块之间相对独立性(互相连接的紧密程度)的度量

- 无直接耦合:两个模块无直接的关系,相互不传递任何消息。(耦合度最低)
- 数据耦合:两个模块间有调用关系,传递的是简单的数据值。
- 标记耦合:两个模块间传递的是数据结构。
- 控制耦合:一个模块调用另一个模块时,传递的是控制变量
- 被调用模块通过该控制变量的值有选择的执行模块内的某一功能
- 外部耦合:模块通过软件之外的环境链接。
- 公共耦合:指通过一个公共的数据环境相互作用。
- 内容耦合:一个模块直接使用另一个模块内部数据;或通过非正常入口转入另一个模块。(耦合度最高)
2.内聚

内聚:对一个模块内部各个元素彼此结合的紧密程度的度量。(内聚度越高越好)
- 偶然内聚:模块内各处理元素之间没有任何联系(内聚度最低)
- 逻辑内聚:模块内执行若干个逻辑上相似的功能,通过参数确定完成哪一个
- 时间内聚:把需要同时执行的动作组合在一起形成的模块
- 过程内聚:一个模块完成多个任务,必须按指定过程进行。
- 通信内聚:模块内所有元素都在同一个数据结构上操作,或者各处理使用相同的输入数据或产生相同的输出数据。
- 顺序内聚:模块内各元素都密切相关于同一功能且必须按顺序执行,前一个的输出是下一个的输入。
- 功能内聚:最强的内聚,指模块内的所有元素共同作用完成个功能,缺一不可。(内聚度最高)
2.系统设计的原则
1.总体结构设计原则
- 分解-协调原则
- 自顶向下原则
- 信息隐蔽、抽象原则
- 一致性原则
- 明确性原则
- 模块间耦合尽可能小,内聚尽可能高
- 模块的扇入、扇出系数要合理
- 模块规模要适当
2.子系统划分原则
- 子系统要具有相对独立性
- 子系统之间的数据依赖性尽量小
- 子系统划分的结果应使数据冗余小
- 子系统的设置应考虑今后发展的需要
- 子系统的划分应便于系统分析阶段的实现
- 子系统的划分应考虑各类资源的充分利用
3.模块设计原则
- 模块内部凝聚性要强,模块间联系要少
- 模块之间的连接只能存在上下级调用关系,不能有同级间联系
- 整个系统呈树状结构,不允许网状结构或交叉调用
- 所有模块必须严格分类编码并建立归档文件
3.结构化方法
系统分析阶段使用数据流图和数据字典
结构化方法是一种面向数据流的传统软件开发方法,它以数据流为中心构建软件模型。
结构化分析的结果包括:一套分层的数据流图、一本数据字典、一组加工逻辑说明、补充材料。
- 黑洞:加工只有输入
- 奇迹:加工只有输出
- 灰洞:加工的输入不足以产生输出
1.DFD图(数据流图)

1.组成元素
1.数据流
![]()
数据流由一组固定成分的数据组成,表示数据的流向,分为:从一个加工流向另一个加工;从加工流向存储(写)
从数据存储流向加工(读);从外部实体流向加工(输入);
从加工流向外部实体(输出)
除了流向数据存储的或从数据存储流出的,每个数据流必须有个明确的名字。
DFD图描述数据流,不是控制流。
2.加工

加工描述了输入数据流到输出数据流之间的变换,也就是输入数据流经过什么处理变成了输出数据流。每个加工都有一个名字和编号。
一个加工可以有多个输入、输出数据流,但必须至少有一个输入和一个输出数据流
3.数据存储

数据存储用来存储数据,分为:数据流入存储(写操作);
数据流出存储(读操作);
双向箭头指向存储(修改操作)
4.外部实体

外部实体指存储在软件系统之外的人员或组织,它指出系统所需数据的发源地(源)或系统所产生数据的归宿地(宿)。
数据流出实体为源,数据流入实体为宿,二者皆有表示既是源又是宿。
2.层次结构

- 顶层图:又叫上下文关系图,只有一个加工,代表整个软件系统,该加工描述了软件系统与外界之间的数据流。(输入输出)
- 0层图:顶层图中的加工经分解后的图。
- 底层图:处于分层数据流图最底层的图,图中的加工不再分解。
- 中间层:至少有一个加工被分解为一张子图
2.数据字典

数据字典就是为数据流图中的每个数据流、文件、加工,以及组成数据流或文件的数据项做出的说明。
- 数据项:不可再分的数据单位。
- 数据流:该数据流的各组成数据项。
- 数据存储条目:对数据存储的定义。
- 基本加工条目:描述DFD图基本加工的处理逻辑
3.判定表

4.结构化系统的分析与设计的步骤
- 理解用户需求
- 确定系统边界,画出顶层图
- 自定向下画出各层DFD图
- 定义数据字典
- 定义加工说明
- 设计系统整体结构
- 详细设计模块
4.面向对象
1.面向对象设计原则
- 单一职责原则
- 开闭原则
- 里氏替换:子类型必须能够替换掉他们的基类型(在任何父类出现的地方,都可以用子类型替换)
- 依赖倒置原则:抽象不应该依赖细节,细节应该依赖抽象(面向接口编程,不是面向实现编程)
- 接口分离原则
- 重用发布等价原则:重用的粒度既是发布的粒度。
- 共同封闭原则:变化若对一个包产生影响,则会对包中所类产生影响。
- 共同重用原则:如果重用了包中的一个类,就要重用包中所有的类。
- 无环依赖原则:在包的依赖关系中不允许存在环。
- 稳定依赖原则:朝着稳定的方向进行依赖。
- 稳定抽象原则:包的抽象程度应该跟其稳定程度一致
2.面向对象的测试
- 单元测试:系统构件的分体测试。
- 综合测试:将测试好的构件连接起来看他们之间相互作用的正确性。
- 系统测试:软件系统所在相关环境的测试,
面向对象测试的层次
- 算法层:测试类中定义的每个方法,相当于传统软件测试的单元测试。
- 类层:测试封装在同一个类中的所有方法和属性间的相互作用可认为是面向对象特有的模块测试。
- 模板层:测试一组协同工作的类之间的相互作用,相当于传统软件测试的集成测试。
- 系统层:把各个子系统装成完整的面向对象的软件系统,在组装过程中同时进行测试,相当于传统软件测试的系统测试。
3.面向对象分析的基本步骤
- 根据需求文档建立需求模型(用例图)
- 设计系统基本结构模型(类图)
- 设计系统动态行为(时序图、状态图、活动图)
- 设计系统静态辅助结构(部署图)
4.需求建模的基本步骤
- 确定系统边界
- 识别参与者
- 定义用例
- 设计用例图
5.系统基本结构建模的步骤
- 发现对象/类
- 定义类的属性和操作
- 确定类之间的关系
3.UML图(统一建模语言)
1.组成
- 事物:结构事物、行为事物、分组事物、注释事物
- 关系:依赖、关联、泛化、实现、聚合、组合
- 图:类图、对象图、用例图、序列图、通信图、状态图、活动图、构件图、组合结构图、部署图、包图、交互概览图、计时图
1.事物
1.结构事物
定义:UML中的名词,通常是模型的静态部分,描述概念或物理元素,包括:类、接口、协作、用例、主动类、构件、制品、节点。

2.行为事物
定义:UML模型的动态部分,他们是模型中的动词,描述了跨越时间和空间的行为,包括:消息、状态机、活动。

3.分组事物
定义:UML模型的组织部分,是一些由模型分解成的盒子,包括:包。

4.注释事物
定义:UML模型的解释部分,用来描述、说明和标注型的任何元素。

2.关系
1.依赖
定义:两个事物之间的语义关系,一个事物发生变化会影响另个事物的语义。

2.关联
定义:一种结构关系,它描述了一组链,链是对象之间的连接

3.泛化
继承

4.实现

5.聚集/聚合
定义:一个类的某些对象实例是另一个类的某些对象实例的组成部分,且整体和部分之间具有各自不同的生命周期。

6.组合
定义:一个类的某些对象实例是另一个类的某些对象实例的紧密而固定的组成部分,且整体和部分之间具有完全相同的生命周期,

7.三大关系
- include:包含关系,多个用例中提取出的公共行为,用例执行时公用行为同时被触发。
- extend:扩展关系,一个用例明显混合了两种或两种以上场景,根据据场景可能发生多种不同分支,则可以表示为一个基本用例和若干个扩展用例。
- generalize:泛化关系,子用例将继承基用例所有行为关系和通信关系,任何使用基用例的地方都可以用子用例代替。
2.图
1.类图
定义:展现了一组对象、接口、协作和他们之间的关系。类图给出系统的静态结构。
2.用例图
定义:展现了一组用例、参与者以及他们之间的关系扩展关系(《extend》)、包含关系(《include》)、泛化关系
3.序列图(时序图)
定义:描述了以时间顺序组织的对象之间的交互活动,主要组成元素包括:参与者、对象、激活期、生命线、消息。
4.状态图
定义:展现了一个状态机,它由状态、转换、事件和活动组成:强调对象行为的事件顺序

5.活动图
定义:展现了系统内从一个活动到另一个活动的流程,它强调对象间的控制流程,包括:状态、动作、转换和对象。(对象的操作复杂时)

6.对象图
定义:展现了某一时刻一组对象以及他们之间的关系,描述了类1图中建立的事物的实例的静态快照:

7.部署图
定义:展现了运行时处理节点及其中间构件(制品)的配置

8.通信图
定义:强调收发消息的对象的组织结构,着重表现通信对象的静态链接关系。

9.构件图
定义:展现了一组构件之间的组织和依赖,专注于系统静态实现视图

10.包图
定义:把模型本身组织成层次结构的通用机制,不能执行,展现由模型本身分解而成的组织单元及其依赖关系。
一个元素只能被一个包拥有

11.pert图

12.甘特图

5.设计模式
1.创建型模式
定义:抽象了实例化过程,他们帮助一个系统独立于如何创建组合和表示他的那些对象
1.单例模式
定义:确保某一个类只有一个实例,并提供一个访问他的全局访问点。
2.原型模式
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
3.工厂模式
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类,降低了客户端与具体产品类之间的耦合度
不用工厂模式

用了工厂模式
客户端通过工厂中的参数可以灵活创建对象

4.抽象工厂模式
定义:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。
- 普通工厂模式:如果要切换到另一种类型的产品创建,可能需要对工厂类进行较大的修改,违反了开闭原则(对扩展开放,对修改关闭)。
- 抽象工厂模式:可以通过切换具体的工厂类来轻松地改变整个产品族,而不需要修改客户端代码。例如,在一个图形界面库中,要从 Windows 风格的界面切换到 Mac 风格的界面,只需要更换对应的工厂类即可,系统的其他部分可以保持不变。
5.建造者模式/生成器模式
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
压缩构造函数
2.结构型模式
定义:如何组合类和对象以获得更大的结构。

1.适配器模式
定义:将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
2.桥接模式
桥接模式是一种结构型设计模式,它的核心作用是将抽象部分与实现部分分离,使它们能够独立地变化。这种模式有助于降低抽象和实现之间的耦合度,让系统更加灵活、易于扩展和维护。
多重继承使用
3.组合模式
组合模式是一种结构型设计模式,它允许你将对象组合成树形结构以表示 “部分 - 整体” 的层次关系。组合模式使得用户对单个对象和组合对象的使用具有一致性,也就是说,你可以用相同的方式处理单个对象和由多个对象组成的组合对象。
4.装饰模式
装饰模式通过将对象包装在装饰器中,在不改变原对象结构的情况下,为对象添加新的行为或职责。动态代理则是在运行时创建一个代理对象,代理对象可以在调用目标对象的方法前后添加额外的外观逻辑,从而实现对目标对象功能的增强。
5.外观/门面模式
定义:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。外观模式提供一个高层次的接口,使得子系统更易于使用。
6.享元模式
其核心目的是借助共享技术,尽可能地减少需要创建的对象数量,以此降低内存占用并提升性能。
7.代理模式
定义:为其他对象提供一种代理以控制对这个对象的访问。
3.行为型模式
定义:涉及算法和对象间职责的分配,不仅描述对象或类的模式,还描述他们之间的通信模式。

1.责任链、职责链模式
责任链模式允许你将请求沿着处理者链进行发送。发送者无需知道请求会被哪个处理者处理,请求会在链上的处理者之间传递,直到有一个处理者能够处理它。
处理ifelse
2.命令模式
命令模式是一种行为设计模式,它将请求封装成一个对象,从而让你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
3.解释器模式
4.迭代器模式
5.中介者模式
中介者模式是一种行为设计模式,它允许你减少对象之间混乱无序的依赖关系。该模式将对象之间的交互封装在一个中介者对象中,使得各个对象不需要显式地相互引用,而是通过中介者来进行通信,从而降低了对象之间的耦合度。
6.备忘录模式
备忘录模式是一种行为设计模式,它允许在不破坏对象封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后可以将对象恢复到先前保存的状态。
7.观察者模式
观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。在这个模式中,被观察的对象称为主题(Subject),依赖于主题的对象称为观察者(Observer)。
8.状态模式
状态模式(State Pattern)是一种行为型设计模式,它允许对象在其内部状态改变时改变自身的行为,看起来就像修改了类一样。
当对象行为依赖于内部状态,且状态改变会导致行为变化时适用。比如游戏中角色有 “正常”“受伤”“无敌” 等状态,不同状态下攻击、防御等行为表现不同。它将状态相关行为封装到各自类中,避免大量臃肿的条件判断语句(如if - else或switch - case ),使代码结构更清晰。
9.策略模式
策略模式是一种行为设计模式,它定义了一系列的算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户端,从而提高了代码的可维护性和可扩展性。
定义一系列算法,把他们封装起来,并可以相互替换
10.模板模式
定义:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
11.访问者模式
访问者模式是一种行为设计模式,它允许你在不改变对象类的前提下,为对象添加新的操作。
6.算法与数据结构
1.树
度:子树的个数

叶子节点数=度为2的节点数+1
度之和=2*边数
总节点数=边数+1
1.完全二叉树


2.前中后序遍历


从左到右,从下到上(左中右)

左右中
3.哈夫曼树
哈夫曼编码不能是一个码是另一个码的前缀,必须要两个叶子节点构造一棵子树



4.树转二叉树

5.森林转二叉树



6.二叉树转树

7.二叉树转森林

8.树的遍历


9.森林的遍历


2.图
有向图 n+e,无向图n2
在数据结构中,图(Graph)是一种复杂的数据结构,用于表示对象(顶点)之间的关系(边)。图由顶点(Vertex)集合和边(Edge)集合组成
- 有向图。若图中每条边都有方向,那么顶点之间关系用<Vi,Vi>表示,也称为弧。Vi为起点,称为弧尾。Vi为终点,称为弧头。所有边都有方向的图称为有向图。
- 无向图。图中每条边都没有方向,V和Vi之间的边用(Vi,Vi)表示
- 完全图。无向图有个顶点,每个顶点与其他n-1个顶点都有边,则称为无向完全图,共有n(n-1)/2条边;类似有n个顶点的有向完全图共有n(n-1)条边。
- ·度、出度、入度。
- 顶点V的度指关联于顶点的该顶点的边的数目,记作D(V)。有向图的度表示为顶点的入度和出度之和。
- 入度指以该顶点为终点的有向边数目,记为ID(v);
- 出度指以该顶点为起点的有向边数目,记为OD(v)。
- 每一个顶点的度加一起除以二就是边数
- 子图。若有两个图G=(V,E)和G’=(V’,E’),如果V’∈V且E’∈E则称G’为G的子图。
- 连通图与连通分量。无向图G中,Vi和Vj间有路径,则称两个顶点是连通的。若任意两个顶点都连通,则称为连通图。无向图G的极大连通子图称为G的连通分量。
- 强连通图与强连通分量。在有向图G中,若对每一对顶点Vi和Vi(二者互不相同),从Vi到Vi和从Vi到Vi都存在路径,则称图G为强连通图。有向图中的极大连通子图称为有向图的强连通分量网。
- 边(或弧)带权值的图称为网。
- 有向树。如果一个有向图恰有一个顶点的入度为0,其余顶点的入度均为1,则是一棵有向树。
1.存储结构
通过元素在存储空间的相对位置来表示数据元素之间的逻辑关系,是顺序存储的特点
1.邻接矩阵

2.邻接链表


2.遍历
深度优先搜索:栈
广度优先:队列,时间复杂度O(n+e)

3.最小生成树
克鲁斯卡尔算法:时间复杂度是Onlogn
普利姆算法:时间复杂度On2
4.拓扑排序


3.排序算法


1.冒泡
0~1位置上谁大往右移,1~2位置上谁大往右移,直到最后,每轮排序都会把最大的放到右边
2.选择
在0~n-1位置上,找到最小值,把最小值放在0位置上去。再遍历一遍。。。
3.插入
先在让0~0范围上有序,0~1范围上有序,0~2范围上有序。。。0~n-1范围上有序。每次都把为排序的那个数都插入到正确的位置上去。
4.希尔
希尔排序是插入排序的一种改进算法,分组插入。希尔排序的基本思想是:先将整个数组分成若干个子序列,对每个子序列进行插入排序,然后逐步缩小子序列的间隔,直到整个数组变为一个序列,再对该序列进行插入排序。
O(n1.3)
5.归并 适合要求稳定性的场景
先找中点,让左边有序,再让右边有序,最后merge到一起,整体就有序了
merge过程:
-
创建一个临时数组,用于存储合并后的数组。
-
定义三个指针,分别指向左边子数组的第一个元素、右边子数组的第一个元素和临时数组的第一个元素。
-
比较左右子数组的第一个元素,将较小的元素放入临时数组中,然后将指向该元素的指针向后移动一个位置。
-
重复步骤3,直到左右子数组中的一个为空。此时,将另一个子数组中剩余的元素全部放入临时数组中。
-
将临时数组中的元素复制回原数组的对应位置。
6.快排 适合大多数不要求稳定性的场景

时间复杂度:nlog2 n
1.0 partition:三个指针ijk,i代表当前位置,j=0和k=length-1代表小于区域和大于区域
[i]<num那么swap(i,j) i++ j++,如果[i]=num,i不动,j++(小于区域向右扩)
,如果[i]>num,那么swap(i,k),i不动k--。当i=k时,也就是撞上大于区域时,循环结束。
之后就在小于num的区域做递归,大于区域做递归。一次搞定一批数,所以快。
但他这个时间复杂度是n2,因为我能找到最差的例子。123456。每次的划分值都在最右侧,每次partition都搞定一个数。快排算法快不快主要是看你划分值找的谁,我故意找最差的他就是On2级别。所以就有了2.0版本
2.0 1.0版本问题就是划分值大的很偏,如果随机划分值,那么他就是一个On logn级别的算法
7.堆排 适合找前k大的场景
把数组变为大根堆,然后一直做heapify
什么是heapify,就是拿掉一个最大的数,之后把最右侧的数放到树头。重新把这棵树变成大根堆
4.二分查找/折半查找
对某有序表进行二分查找时,进行比较的关键字序列不可能是

9-2. 对于下列关键字序列,不可能构成某二叉排序树中一条查找路径的是()。【2011 统考真题】 A. 95, 22, 91, 24, 94, 71 B. 9_哔哩哔哩_bilibili

5.哈希表
哈希表通过计算一个以记录的关键字为自变量的函数(哈希函数)来得到该记录的存储地址,用哈希表进行查找操作时需用同一哈希函数计算得到待查记录的存储地址,然后到相应存储单元去获得有关信息。
同义词:经过哈希函数相同的值
哈希冲突
- 开放定址法:H=(H(key)+d)%mi=1,2,...k (k<=m-1)
- 线性探测:发生冲突时,顺序的到存储区域的下一个单元。
- 优点:实现简单。
- 缺点:溢出处理需另编译程序;易产生聚集现象。
- 链地址法:一种经常使用且很有效的方法,它在查找表的每个记录中增加一个链域,其中存放具有相同哈希函数值的记录把若干个发生冲突的记录链接在一个链表内。
6.其他算法
- 动态规划:动态规划算法适用于解决具有最优子结构和重叠子问题的问题。最优子结构意味着问题的最优解可以由其子问题的最优解得到;重叠子问题表示在求解过程中,很多子问题会被重复计算。动态规划通过保存子问题的解(如使用表格存储 ),避免重复计算,从而高效地得到问题的最优解。
- 分治:分治法是将一个问题分解为若干个规模较小、相互独立的子问题,分别求解子问题,再将子问题的解合并得到原问题的解,并不强调重叠子问题和最优子结构的利用方式与动态规划一致。
- 贪心:贪心算法在每一步都做出在当前看来是最好的选择,只考虑局部最优,不考虑子问题重叠情况,不一定能得到全局最优解。
- 回溯:回溯算法是通过深度优先搜索,在搜索过程中尝试各种可能,当发现不满足条件时回溯到上一步继续尝试,主要用于遍历解空间,不是针对最优子结构和重叠子问题。
7.计算机组成原理
1.数据表示
原码:数的二进制表示
反码:正数反码为原码本身,负数反码为符号位不变,其余取反
补码:正数补码为原码本身,负数补码为反码+1

阶码越长,表示范围就越大,精确度就越低


浮点数相加要对阶,阶码小的向大的对阶

2.码距
在一个简单的编码系统中,有两个编码 “00” 和 “10”,它们之间只有一位不同(第一位),所以它们的码距是 1。而编码 “00” 和 “11” 之间有两位不同(第一位和第二位),码距就是 2。
码距越大,检测错误的能力越强
3.奇偶校验码
- 奇校验:在奇校验里,要让编码后码字里 “1” 的个数为奇数。比如原始数据是 “1010”,其中 “1” 的个数为 2,是偶数,那么添加的校验位就为 “1”,最终编码后的码字是 “10101”,这样 “1” 的个数就变成了 3(奇数)。
- 偶校验:偶校验要求编码后码字中 “1” 的个数为偶数。假设原始数据是 “1100”,“1” 的个数为 2,已经是偶数,此时添加的校验位就是 “0”,编码后的码字为 “11000”。
4.海明码
设数据位的位数为 n,校验位的位数为 k,则需要满足不等式 2k≥n+k+1。通过这个不等式可以计算出最少需要的校验位数量。

5.指令系统
- CISC:复杂指令系统,基本思想是进一步增强原有指令的功能,用更为复杂的新指令取代原先由软件子程序完成的功能,普通个人电脑的CPU多用。
- CISC使用微程序控制
- CISC的指令种类和寻址方式多
- RISC和CISC都使用流水线技术
- CISC采用很少通用寄存器
- CISC时钟周期长
- RISC:精简指令系统,基本思想是通过减少指令总数和简化指令功能降低硬件设计复杂度,并通过优化编译器提高指令执行速度,工控机和手机多用
- RISC大多数指令在一个时钟周期内完成
- RISC使用硬布线逻辑控制
- RISC的指令种类和寻址方式少
- RISC采用很多通用寄存器

6.存储器
高速缓存和主存之间的映射由硬件自动完成
控制器中有pc寄存器
RAM:随机存储器,可以读可以写,用户的数据。断电遗失
ROM:只读存储器,厂家的数据。断电不丢失
- 读写存储器:
- SRAM(静态随机存储器):CPU缓存,集成度低,速度快,不需要周期性刷新
- DRAM(动态随机存储器):主存,使用电容存储信息,需要周期性刷新,集成度高,速度慢
- 只读存储器:
- ROM(固定只读存储器)
- PROM(可编程只读储存器)
- EPROM(可擦除可编程储存器)
- EEPROM(电擦除可编程储存器)
- Flash(闪存)
映射方式
- 直接映射:直接映射将主存中的每个块固定映射到 Cache 的一个特定位置。查找速度快但冲突率可能较高。嵌入式可能使用直接映射,实现简单,减少成本。
- 全相联映射:全相联映射允许主存的任意块加载到 Cache 的任何行。Cache 使用效率较高,冲突率为0,但查找速度和复杂度较高,不适合大容量
- 组相连映射:组相联映射是直接映射和全相联映射的折中方案,将 Cache 分为多个组,每组中的行允许灵活映射。冲突率较低,查找速度稳定,是主流 Cache 结构。
7.IO
1.中断
中断的实现:中断向量法,提供中断服务程序的入口地址
2.DMA
DMA 通常指直接内存访问,是一种允许特定硬件子系统独立于中央处理器(CPU)访问主系统内存的特性,每传输一个数据占一个存储周期
把程序按块处理
直接内存访问, 是一种计算机数据传输技术,允许外设直接与内存交换数据,而无需经过CPU持续的干预,从而提高数据传输效率,降低延迟,减少CPU的负担。尤其是大规模的数据传输时。
电脑的接口通常支持DMA,音频、视频数据的实时处理也与DMA技术的参与
8.磁盘

8.操作系统
1.存储管理
1.分页存储管理
全硬件实现
将一个进程的地址空间划分为若干大小相等的区域,称为页。相应地,将主存空间划分成与页面大小相同的若干物理块,称为块或页框。在为进程分配主存时,将进程中若干页分别装入多个不相邻的块中。
当多个页面离散的分配到主存的多个物理块时,系统应能保证在主存中找到进程要访问的页面对应的物理块。为此,系统为每个进程建立了一张页面映射表,记录每一页在主存中对应的块号。

2.分段存储
为每个段分配一个连续的分区,而进程中的各个段可以离散的分配到主存的不同分区中。在系统中为每个进程建立一张段映射表简称“段表”。每个段在表中占有一个表项,在其中记录了该段在主存中的起始地址和段的长度


3.段页式
段页式存储的基本原理是先将整个主存划分成大小相等的存储块(页框/块),将用户程序按程序的逻辑关系分为若干段,并为每个段赋予一个段名,再将每个段划分成若干页,以页框为单位离散分配。
4.页面置换算法

2.缓冲技术


3.磁盘调度

1.磁盘调度算法
- 先来先服务(FCFS):按照请求到达的先后顺序进行处理,新请求随时可能到达,若新请求磁道位置与当前移动臂运行方向不同,就会改变移动臂运行方向 。比如当前移动臂向里移动,若新到达请求在外侧磁道,移动臂就需改变方向向外移动。
- 最短寻道时间优先(SSTF):优先处理距离当前磁头位置最近的请求。当新的近磁道请求出现,且其方向与当前移动臂运行方向相反时,移动臂就会改变运行方向去处理该请求。
- 电梯调度(SCAN):磁头在一个方向上移动,处理途中请求,直到一端后才反向,不是随时改变方向。
- 单向扫描(CSCAN) :磁头固定一个方向扫描,到达一端后快速返回起始端,不随时改变运行方向。
4.进程
栈不能共享


5.字

9.计算机网络


POP3 协议默认使用的端口号是 110 。52 端口不是与 POP3 相关的端口;25 端口是 SMTP(简单邮件传输协议)用于发送邮件时,邮件服务器之间通信的默认端口;119 端口是 NNTP(网络新闻传输协议)的默认端口 。

对称型加密AES,DES是分组加密
9.编译原理


1.编译全过程
- 预编译:处理以
#开头的预处理指令,进行宏替换、文件包含与条件编译,生成待编译代码。 - 编译:对预编译后的代码做词法、语法、语义分析和优化,将其转化为汇编代码。
- 汇编:把汇编代码翻译成机器代码,生成目标文件。
- 链接:合并多个目标文件和库文件,解析符号引用,重定位地址,最终生成可执行文件。



2.正规式

3.语法树


4.自动机

5.加密算法
对称加密:DES
非对称加密:DSA,ECC
散列
软件署名权不能继承
大题
1.数据流图
1.几个功能代表几个加工

2.存储
就写什么什么信息存储就行

3.补图
注意父子平衡

加工必有输入和输出

4.组成
找原文
5.结构化语言

2.数据库
写出关系模式,完整性约束

3.UML图
包含include:一个用例包含另一个用例,当基本用例执行时,被包含用例一定会执行。包含关系由基本用例指向被包含用例关系是一条带箭头的虚线,虚线上包含<include>>
扩展extend:当一个用例执行时,可能会出现特殊情况和可选情况,这个时候就会执行扩展用例。扩展关系由扩展用例指向基本用例,关系是一条带箭头的虚线,虚线上包含<extend>>
泛化generalize:父用例泛化子用例,子用例继承父用例的所有属性和行为,并且父用例可以出现的地方,子用例都可以将其替换。
16万+

被折叠的 条评论
为什么被折叠?



