文章目录
- [一、09.16 周一](#一、09.16 周一)
-
- [1.1)问题01: 软件质量属性中"质量属性场景"、"质量属性环境分析"、"质量属性效用树"、"质量属性需求用例分析"分别是什么?](#1.1)问题01: 软件质量属性中"质量属性场景"、"质量属性环境分析"、"质量属性效用树"、"质量属性需求用例分析"分别是什么?)
- [1.2)问题02: 软件质量属性中 ATTM(架构权衡分析方法)介绍?](#1.2)问题02: 软件质量属性中 ATTM(架构权衡分析方法)介绍?)
-
- [ATAM 的主要目标](#ATAM 的主要目标)
- [ATAM 的核心概念](#ATAM 的核心概念)
- [ATAM 的评估流程](#ATAM 的评估流程)
-
- [1. **阶段 0:准备工作**](#1. 阶段 0:准备工作)
- [2. **阶段 1:介绍与需求确认**](#2. 阶段 1:介绍与需求确认)
- [3. **阶段 2:架构驱动的评估**](#3. 阶段 2:架构驱动的评估)
- [4. **阶段 3:权衡分析与报告**](#4. 阶段 3:权衡分析与报告)
- [ATAM 的评估输出](#ATAM 的评估输出)
- [ATAM 的优点](#ATAM 的优点)
- [ATAM 的局限性](#ATAM 的局限性)
- 总结
- [二、09.19 周四](#二、09.19 周四)
-
- 2.1) 面向对象系统建模中,用例之间的关系有哪些?要怎么理解 面向对象系统建模中,用例之间的关系有哪些?要怎么理解)
- 2.2)类之间的关系及示意图
-
- [1. **关联(Association)**](#1. 关联(Association))
- [2. **聚合(Aggregation)**](#2. 聚合(Aggregation))
- [3. **组合(Composition)**](#3. 组合(Composition))
- [4. **依赖(Dependency)**](#4. 依赖(Dependency))
- [5. **继承/泛化(Generalization/Inheritance)**](#5. 继承/泛化(Generalization/Inheritance))
- [6. **实现(Realization)**](#6. 实现(Realization))
- 关系的总结与应用
- [三、09.21 周六](#三、09.21 周六)
- [四、06.22 周日](#四、06.22 周日)
-
- 4.1) 问题01: 数据库理论中的关系代数表达式 问题01: 数据库理论中的关系代数表达式)
一、09.16 周一
1.1)问题01: 软件质量属性中"质量属性场景"、"质量属性环境分析"、"质量属性效用树"、"质量属性需求用例分析"分别是什么?
在软件工程中,为了确保软件产品的质量,通常会采用多种技术和方法来描述和评估软件的质量属性。以下是对"质量属性场景"、"质量属性环境分析"、"质量属性效用树"以及"质量属性需求用例分析"的解释:
-
质量属性场景 (Quality Attribute Scenarios):
- 质量属性场景是一种用来描述软件在特定条件下表现的技术。
- 通常包括三个主要组成部分:刺激(stimulus)、操作(operator)和响应(response)。
- 刺激是指外部输入或触发事件;操作是系统内部的处理逻辑;响应是系统对外部刺激的输出或反应。
- 通过构建具体的情景来评估软件在不同条件下的行为,以确保其满足预期的质量要求。
-
质量属性环境分析 (Environmental Analysis for Quality Attributes):
- 这一术语可能并不常见,但它可以理解为对软件运行环境的分析,目的是确定环境因素如何影响软件的质量属性。
- 分析的内容可能包括硬件平台、操作系统版本、网络条件等,这些都可能对软件的性能、可靠性、安全性等产生影响。
- 环境分析有助于识别潜在的风险,并提前采取措施进行规避。
-
质量属性效用树 (Utility Tree for Quality Attributes):
- 效用树是一种图形化的表示方法,用来描述软件质量属性及其子属性之间的层次关系。
- 通过构建一棵树形结构,可以帮助团队理解不同质量属性之间的相互依赖关系,以及这些属性是如何共同影响用户体验的。
- 树形结构中,顶层节点通常是软件的总体目标,中间层节点代表具体的质量属性(如性能、可用性、安全性等),而底层节点则可能是具体的度量指标或实现细节。
-
质量属性需求用例分析 (Use Case Analysis for Quality Attribute Requirements):
- 用例分析是软件工程中常用的一种需求捕获方法,主要用于描述系统的行为以及它如何与外部参与者(如用户)互动。
- 在这个上下文中,质量属性需求用例分析是指通过用例来捕捉和分析软件需要满足的质量属性要求。
- 通过定义涉及质量属性的用例,可以确保系统设计和开发过程中充分考虑这些非功能性需求,并在实施过程中进行验证。
这些技术和方法帮助软件开发团队更好地理解、描述和评估软件的质量属性,从而确保最终产品能够满足用户的需求和期望。
1.2)问题02: 软件质量属性中 ATTM(架构权衡分析方法)介绍?
ATAM (Architecture Tradeoff Analysis Method,架构权衡分析方法)是由**SEI(Software Engineering Institute)**提出的一种用于评估软件架构质量的系统化方法。它通过分析架构设计中的质量属性(如性能、可用性、安全性、可修改性等)来识别潜在的架构风险和权衡点,从而帮助利益相关方更好地理解架构的优缺点,确保架构能够满足系统的需求。
ATAM 的主要目标
- 识别架构中的风险和权衡:在不同的质量属性之间找到平衡点,比如性能与安全性、可修改性与性能之间的权衡。
- 提高架构的质量:通过分析架构设计的决策是否支持系统的目标质量属性,改进架构设计,提高其质量。
- 确保满足需求:验证架构是否能够满足关键的功能性和非功能性需求(质量属性)。
ATAM 的核心概念
-
质量属性(Quality Attributes)
- ATAM 关注的质量属性是系统的非功能性需求,如性能、可用性、安全性、可修改性、可扩展性等。这些属性通常在设计决策中相互影响,需要在它们之间做出权衡。
-
架构决策(Architectural Decisions)
- 架构决策是指在架构设计中做出的关于模块划分、接口定义、技术选型、模式应用等方面的决定。这些决策直接影响系统的质量属性表现。
-
权衡分析(Tradeoff Analysis)
- 不同的质量属性往往相互制约。例如,为了提升性能,可能会牺牲安全性;提高可修改性可能会降低系统的效率。ATAM 通过权衡分析来帮助利益相关方理解这些影响并做出合理的架构选择。
ATAM 的评估流程
ATAM 的评估流程通常分为四个阶段,每个阶段都有特定的活动,评估的参与者包括架构师、开发团队、利益相关方等。
1. 阶段 0:准备工作
- 组建评估团队,确定评估范围和目标。
- 收集并准备与架构相关的背景资料。
2. 阶段 1:介绍与需求确认
- 架构介绍:由架构师介绍系统的架构设计,包括架构风格、设计决策等。
- 业务需求确认:确定系统的业务需求和关键的质量属性,了解系统需要解决的核心问题。
- 利益相关方参与:包括客户、项目经理、开发人员等,明确他们对系统质量属性的关注点。
3. 阶段 2:架构驱动的评估
- 场景驱动分析:根据系统的使用场景,分析架构设计是否能够支持关键的质量属性。场景可以是用例、非功能需求场景或架构变更场景。
- 质量属性效用树:通过效用树分析不同质量属性的优先级和重要性,明确哪些质量属性对系统最关键。
- 架构敏感点分析:识别出那些对质量属性有显著影响的架构决策(即敏感点),以及这些决策对不同属性的影响。
- 架构风险识别:根据敏感点的分析,发现潜在的架构风险,如某些设计决策可能影响性能或扩展性。
4. 阶段 3:权衡分析与报告
- 权衡分析:识别和讨论不同质量属性之间的权衡,并提出解决方案或改进建议。
- 总结与报告:编写评估报告,记录发现的风险、建议的改进点和设计权衡,并提供给项目团队和利益相关方。
ATAM 的评估输出
ATAM 的最终结果包括:
- 关键的质量属性需求:明确系统最重要的质量属性,并通过效用树显示其优先级。
- 架构风险:识别在当前设计中存在的架构风险。
- 权衡决策:展示在不同质量属性之间需要做出的权衡,并提供详细的分析。
- 改进建议:针对风险提出具体的改进建议,优化架构设计。
ATAM 的优点
- 系统化评估架构质量:ATAM 提供了一种结构化的方式,帮助架构师识别并解决架构中的潜在问题。
- 支持利益相关方参与:通过让利益相关方参与评估过程,ATAM 能够确保架构决策符合项目的业务需求和技术要求。
- 识别权衡和风险:ATAM 强调在不同质量属性之间做出合理的权衡,帮助团队在早期发现并解决设计中的潜在问题。
ATAM 的局限性
- 时间与成本较高:ATAM 评估过程比较复杂,涉及到多个利益相关方,通常需要较长的时间和较高的成本来完成。
- 依赖架构师的经验:ATAM 的评估结果在很大程度上依赖于架构师的经验和对系统的理解,不同的评估团队可能产生不同的评估结果。
总结
ATAM 是一种用于评估软件架构质量的有效方法,重点在于通过对质量属性的分析和权衡,帮助项目团队识别架构中的潜在风险并提出改进建议。通过系统化的评估过程,ATAM 能够确保架构设计不仅满足功能需求,还能在性能、可用性、可修改性、安全性等非功能需求上表现优异,从而支持系统的长期演进和稳定运行。
二、09.19 周四
2.1) 面向对象系统建模中,用例之间的关系有哪些?要怎么理解
在面向对象系统建模中,用例之间的关系主要有以下几种类型:
用例之间的关系类型:
-
包含关系(Include)
- 一个用例包含了另一个用例的行为。被包含的用例是必要的步骤,必须执行。
- 表示法:
<<include>>
- 示例:在一个"注册用户"用例中,可能包含"验证用户信息"的用例。
-
扩展关系(Extend)
- 一个用例在特定条件下可能扩展另一个用例的行为。扩展的用例是可选的,只有在某些条件下才会执行。
- 表示法:
<<extend>>
- 示例:在一个"提交订单"用例中,可能扩展"使用优惠券"的用例。
-
泛化关系(Generalization)
- 用例之间具有继承关系,子用例继承父用例的行为。子用例可以增加或覆盖父用例的部分行为。
- 表示法:实线三角箭头
- 示例:一个"支付"用例可以泛化为"信用卡支付"和"网上银行支付"两个具体子用例。
题目中"选择专业"与"登录系统"用例之间的关系:
包含关系(Include)
-
解释:用户必须先登录系统,才能执行"选择专业"的操作。也就是说,"选择专业"用例依赖于"登录系统"用例的执行。因此,"选择专业"用例包含了"登录系统"用例,这是一个强制性的操作。
-
描述:在需求建模时,"选择专业"用例包含了用户"登录系统"的操作,这是必需的步骤,用户不可能在未登录的情况下直接选择专业。
题目中"参加模拟考试"与"批阅答卷"用例之间的关系:
扩展关系(Extend)
-
解释:学生参与"模拟考试"后,教师才能进行"批阅答卷"。但从系统角度看,批阅答卷的行为是独立的,它不是"参加模拟考试"用例的必要步骤,只有在考试结束后,教师需要时才会进行批阅。因此,"批阅答卷"用例扩展了"参加模拟考试"用例。
-
描述:学生提交答卷后,教师可以选择批阅或不批阅。批阅答卷作为可选的操作,依赖于"参加模拟考试"的完成。
2.2)类之间的关系及示意图
类之间的关系有 关联、聚合、组合、依赖、泛化(继承)、实现6种关系,示意图如下:
在面向对象系统建模中,类之间的关系是系统设计的关键部分,类之间的关系通常反映对象之间的交互和依赖。主要有以下几种类型:
1. 关联(Association)
- 描述:关联表示两个类之间存在某种联系,它们可以互相访问。关联可以是单向的或双向的。
- 表示法:实线连接两个类,通常带有方向箭头(单向)或无箭头(双向)。可以在关联线旁标注角色名称和多重性(如 1:N)。
- 示例:学生与课程的关系,一个学生可以选修多门课程,课程可以被多个学生选修。
2. 聚合(Aggregation)
- 描述:聚合是关联的一种特殊形式,表示"整体-部分"的关系。聚合表示部分可以独立于整体存在,生命周期上不依赖于整体。
- 表示法:带空心菱形的实线连接,菱形在"整体"类一侧,另一端是"部分"类。
- 示例:一辆汽车与轮胎的关系,轮胎是汽车的一部分,但即使汽车不存在,轮胎仍可以单独存在。
3. 组合(Composition)
- 描述:组合也是"整体-部分"的关系,但它比聚合更强,表示部分完全依赖于整体,不能单独存在。整体的生命周期决定了部分的生命周期。
- 表示法:带实心菱形的实线连接,菱形在"整体"类一侧,另一端是"部分"类。
- 示例:一本书与章节的关系,如果书不存在,章节也不存在。章节是书的组成部分,无法独立于书存在。
4. 依赖(Dependency)
- 描述:依赖表示一个类依赖于另一个类,意味着一个类使用到另一个类,通常体现在类的方法中使用另一个类作为参数或局部变量。依赖关系通常是临时的,生命周期上不绑定。
- 表示法:虚线带箭头的连接线,箭头指向被依赖的类。
- 示例:方法调用的关系,比如一个打印机驱动类依赖于打印机类,来执行打印操作。
5. 继承/泛化(Generalization/Inheritance)
- 描述:继承表示子类继承父类的属性和方法,子类是父类的特殊化。继承是"is-a"关系,表示某个类是另一个类的子类或派生类。
- 表示法:实线三角箭头,箭头指向父类。
- 示例:学生类继承了"人类",学生是人类的子类,继承了人类的共性属性。
6. 实现(Realization)
- 描述:实现表示一个类实现了接口中的方法。接口是定义类行为的抽象,而实现类提供了具体的实现。
- 表示法:虚线三角箭头,箭头指向接口类。
- 示例:假设有一个"可打印"接口,类"文档"实现了该接口的具体打印方法。
关系的总结与应用
- 关联关系用于描述类之间相对松散的联系,适合表示具有可互相访问行为的类。
- 聚合 与组合用于描述整体与部分的关系,聚合表示部分可以独立存在,组合表示部分依赖于整体。
- 依赖用于表示临时的、弱耦合的依赖关系,通常体现在类的行为中。
- 继承用于表示类之间的继承关系,子类继承父类的特征。
- 实现用于类实现接口的情况,通常用于多态性设计。
每种关系都有其适用场景,在面向对象设计中根据需求选择合适的类之间的关系非常重要。
三、09.21 周六
3.1)问题01: resx文件是什么文件,有什么作用?
.resx
文件是用于在.NET应用程序中存储资源的XML文件。它的全称是"XML Resource File"。这些文件通常包含字符串、图像、图标和其他类型的数据,可以在应用程序运行时加载和使用。
.resx
文件的主要作用包括:
-
本地化和全球化 :通过将不同语言的资源存储在不同的
.resx
文件中,可以轻松实现应用程序的多语言支持。根据用户的区域设置,应用程序可以选择加载相应的资源文件。 -
资源管理:将资源文件与代码分离,有助于更好地管理和维护。资源文件可以独立于代码进行修改,而不需要重新编译整个应用程序。
-
简化开发 :开发工具(如Visual Studio)提供了对
.resx
文件的良好支持,使得开发者可以通过图形界面轻松编辑资源内容。
示例
一个简单的.resx
文件可能如下所示:
xml
<?xml version="1.0" encoding="utf-8"?>
<root>
<data name="HelloWorld" xml:space="preserve">
<value>Hello, World!</value>
</data>
<data name="AppTitle" xml:space="preserve">
<value>My Application</value>
</data>
</root>
在这个例子中,HelloWorld
和AppTitle
是资源的键,它们对应的值分别是"Hello, World!"
和"My Application"
。
使用方法
在C#代码中,可以通过ResourceManager
类来访问.resx
文件中的资源。例如:
csharp
using System;
using System.Resources;
class Program
{
static void Main()
{
ResourceManager rm = new ResourceManager("MyNamespace.MyResource", typeof(Program).Assembly);
string hello = rm.GetString("HelloWorld");
string title = rm.GetString("AppTitle");
Console.WriteLine(hello);
Console.WriteLine(title);
}
}
在这个例子中,MyNamespace.MyResource
是资源文件的命名空间和名称,GetString
方法用于获取字符串类型的资源。
通过使用.resx
文件,可以显著提高应用程序的可维护性和扩展性,特别是在需要支持多语言和多区域设置的情况下。
四、06.22 周日
4.1) 问题01: 数据库理论中的关系代数表达式
关系代数是一种形式化的查询语言,用于描述如何从一个或多个关系数据库中检索数据。它由一系列的操作符组成,可以组合起来形成复杂的查询表达式。在关系代数中,基本操作包括选择(Selection)、投影(Projection)、并(Union)、差(Difference)以及笛卡尔积(Cartesian product)。此外,还有几个导出的操作,如交集(Intersection)、连接(Join)、自然连接(Natural Join)、除法(Division)等。
下面是一些基本的关系代数表达式的例子:
-
选择(Selection)
- 表示为 σ<条件>®,其中 R 是关系名。<条件> 可以是基于关系的属性的逻辑表达式。
- 示例:σ年龄 > 30(员工) 表示选择所有年龄大于30岁的员工。
-
投影(Projection)
- 表示为 π属性列表®,属性列表指定了需要保留的列。
- 示例:π姓名, 年龄(员工) 表示只保留员工表中的姓名和年龄两列。
-
并(Union)
- 表示为 R ∪ S,其中 R 和 S 都必须具有相同的模式(即相同数量及类型的属性)。
- 示例:σ部门='销售'(员工) ∪ σ部门='市场'(员工) 表示选择属于销售部门或市场部门的所有员工。
-
差(Difference)
- 表示为 R - S,结果是 R 中有而 S 中没有的元组。
- 示例:σ部门='销售'(员工) - σ性别='女'(员工) 表示选择属于销售部门但不是女性的员工。
-
笛卡尔积(Cartesian product)
- 表示为 R × S,返回两个集合中每个元组的配对。
- 示例:员工 × 部门 表示列出每一名员工与每一个部门的配对。
-
连接(Join)
- 连接操作结合了选择和笛卡尔积的功能。表示为 R ⋈ S,其中 R 和 S 是关系,并且连接条件用于过滤笛卡尔积的结果。
- 示例:员工 ⋈ σ员工.部门号 = 部门.部门号(部门) 表示将员工与部门表通过部门号关联起来。
-
自然连接(Natural Join)
- 自然连接仅在两个关系中有相同名称的属性上进行连接。
- 示例:员工 ⨝ 部门 表示在员工与部门表之间共享的属性上自动执行连接。
-
除法(Division)
- 除法用于找到第一个关系中的元组,这些元组与第二个关系中的每个元组都有匹配项。
- 示例:供应商 ÷ 零件 表示找到供应所有列出零件的供应商。
关系代数表达式可以组合使用上述操作来构建更复杂的查询。例如,要找出所有销售部的男性员工的名字,可以这样写:
π姓名 (σ性别='男' ∧ 部门='销售'(员工))
这会先选择所有性别为"男"并且部门为"销售"的员工,然后从中提取他们的名字。