hello 大家好,由于作者25年10月份考期去参加习思想考试了,所以没有更新现在已经通过了《习思想》开始13005 软件工程的资料更新,献给每一位拥有梦想的"带专人",
每一章节中的练习部分中的标有 2504 的题是25年4月考期的真题希望可以帮到大家~
ps:有不正确的地方麻烦更新在评论区,我会一一修复 😅
第三章 面向对象的软件开发方法
面向对象的基本概念
-
对象:
- 构成:封装 “属性(数据)+ 操作(方法 / 成员函数)” 的统一体;
- 规则:属性仅能通过对象自身的操作修改;
- 操作作用:描述对象能实现的功能(C++ 中称成员函数)
-
类:同数据结构 + 同操作的对象集合,含属性 + 合法操作,对象是类的实例;
-
封装:属性 + 服务封装为独立单元(信息隐藏),外部可见特征、隐蔽内部细节。
-
继承:子类由父类派生,自动继承父类全部属性和服务
-
多态性:子类可当父类用(C++ 靠虚函数实现),即 “一种方法,多种实现”。
-
重载:函数重载与运算符重载。C++中,函数重载通过静态联编实现
-
函数重载:
// 模拟 add 函数重载(通过判断参数类型/数量分支执行) function add(...args) { // ...args 接收所有传入的参数(数组形式) const [a, b, c] = args; // 解构参数 // 1. 2个参数:区分整数/小数 if (args.length === 2) { // 判断是否为整数(C++ 中的 int 类型) if (Number.isInteger(a) && Number.isInteger(b)) { console.log(`整数相加:${a} + ${b} = ${a + b}`); return a + b; } // 判断是否为小数(C++ 中的 double 类型) else if (typeof a === 'number' && typeof b === 'number') { const result = (a + b).toFixed(2); // 保留 2 位小数 console.log(`小数相加:${a} + ${b} = ${result}`); return Number(result); } } // 2. 1个参数:自加 10 else if (args.length === 1 && typeof a === 'number') { console.log(`单参数自加 10:${a} + 10 = ${a + 10}`); return a + 10; } // 3. 3个参数:三数求和 else if (args.length === 3 && args.every(x => typeof x === 'number')) { console.log(`三数求和:${a} + ${b} + ${c} = ${a + b + c}`); return a + b + c; } // 不匹配的情况 else { throw new Error('参数类型/数量不匹配,无对应重载逻辑'); } } // 测试不同「重载」场景 add(1, 2); // 整数相加:1 + 2 = 3(匹配 int 类型重载) add(1.5, 2.3); // 小数相加:1.5 + 2.3 = 3.80(匹配 double 类型重载) add(5); // 单参数自加 10:5 + 10 = 15(匹配 1 个参数重载) add(10, 20, 30); // 三数求和:10 + 20 + 30 = 60(匹配 3 个参数重载) // add('a', 1); // 报错:参数类型不匹配(无对应重载) -
运算符重载:
// 定义一个「坐标类」(类似 C++ 的 class) class Point { constructor(x, y) { this.x = x; // 坐标 x 属性 this.y = y; // 坐标 y 属性 } // 模拟「+ 运算符重载」:用函数代替运算符,实现自定义相加逻辑 // 对应 C++ 中的 operator+(const Point& other) add(other) { // 自定义逻辑:两个 Point 对象的 x、y 分别相加,返回新 Point return new Point(this.x + other.x, this.y + other.y); } // 辅助方法:打印坐标(方便查看结果) toString() { return `Point(${this.x}, ${this.y})`; } } // 测试「运算符重载」效果 const p1 = new Point(1, 2); // 第一个坐标对象 const p2 = new Point(3, 4); // 第二个坐标对象 // 模拟「p1 + p2」的效果(C++ 可直接写 p1 + p2,JS 用 p1.add(p2) 模拟) const p3 = p1.add(p2); console.log(`p1 "加" p2 的结果:${p3}`); // 输出:p1 "加" p2 的结果:Point(4, 6) // 再扩展:模拟「- 运算符重载」(坐标相减) Point.prototype.subtract = function(other) { return new Point(this.x - other.x, this.y - other.y); }; const p4 = p2.subtract(p1); console.log(`p2 "减" p1 的结果:${p4}`); // 输出:p2 "减" p1 的结果:Point(2, 2)
-
统一建模语言UML
UML(统一建模语言)是通用可视化建模语言,用于软件系统的描述、可视化、构造与文档化,覆盖需求分析、设计、维护等全生命周期,适用于计算机软件、固件或数字逻辑构成的离散系统建模。
用例图
用于表示系统的功能
时序图
用于表示业务过程的细节
只显示对象不显示类
协作图
用于显示对象间处理过程的分布
类图
显示系统中类与类之间的相互关系。提供了类及其相互关系的静态图形
每个类用方框表示,分成三部分
- 类名
- 类包含的属性
- 类的操作
状态图
显示对象的功能
为对象的各种状态提供了建模方式
对系统的动态功能进行建模
组件图
显示模型的物理视图
显示系统中的软件组件及其相互关系
有两种组件: 执行组件、代码库
部署图
显示网络的物理布局和各种组件的位置
上下文模型
表示目标系统与其他外部系统的关系,外部系统可能产生数据供目标系统使用,同时也使用该系统产生的数据
面向对象的需求分析
面向对象分析与设计中,通过抽取、整理用户需求建立多维度问题域精确模型,常用 UML 作为建模语言。主要使用以下五种图
- 活动图
- 用例图
- 时序图
- 类图
- 状态图
面向对象的建模步骤
基于用例实现的面向对象的建模由以下几个步骤组成:
- 沟通用户,明确核心需求
- 界定系统边界与外部交互,建立上下文模型;
- 梳理业务流程,构建活动图;
- 从用户交互视角提炼功能,建立用例模型;
- 识别实体对象 / 类(属性、方法、层次关系),搭建静态结构模型;
- 基于用例,用时序图描述对象交互关系;
- 分析对象行为与状态变化(状态图),完善类图;
- 迭代上述步骤,直至模型闭环
基于业务流程的活动图
用例图与系统功能
每一个信息系统的用例代表着一个完整的功能
用例图规范:
- 用例:椭圆形表示
- 执行者:棒状小人图形
- 关联:执行者和用例之间带箭头的线 【实线】
- 用例间的包含关系:用例与用例之间带箭头的线 【虚线】
从业务流程到用例图建模
- 利用与用户的对话找出系统的用例
- 画用例图
- 完成用例的描述
类图与静态结构
类图用于描述系统的静态结构,可以自动转换为程序代码
对象模型的类包括
- 实体类:问题域中的核心类
- 边界类
- 控制类
类图规范
-
类(Class)
-
类名
-
属性
-
操作
-
-
关联:类与类之间最基本的关系
-
泛化:两个类之间一般与特殊的关系(子类与父类的关系)
Saler 与 Customer 是一般
sysUser 是特殊
-
整体-部分关系
-
聚合:类可以独立存在
-
组合:类之间只能共存,不可以相互独立
-
-
依赖关系:没有结构上的关联,一般称为弱相关
提交页面管收集用户输入,订单管业务数据和规则,俩是各干各的,就提交时传个数据,内部怎么变互相不影响,所以是弱相关。
-
多重性:通常在关联或整体-部分关系中会加以使用,代表着对象关系结构中,彼此能够允许的最少及最多的数量
一辆汽车最少要有4个论讨,最多可以有8个轮胎,汽车与轮胎间的多重性就是4~8
类图与静态结构
类图建模基本步骤:
- 识别类与对象
- 识别属性
- 识别操作
- 识别关联
时序图与交互模型
时序图的主要任务:
- 画清程序运行时,各个对象怎么配合干活;
- 检查类图设计对不对(时序图里的东西都得在类图里有);
- 给程序员铺路,按时间顺序写代码就行
时序图规范:
- 对象
- 消息
- 生命线
每个对象生命线上的狭长矩形是活动棒,在活动棒内的所有消息之间存在清晰时序关系
状态图与事件驱动模型
事件驱动模型表示系统内对外部事件的响应方式,事件引起一种状态向另一种状态的转变
状态图规范:
-
起始状态:用实心黑色圆形表示
-
结束状态:用空心黑色圆形表示
-
状态:圆角矩形
-
迁移:箭头
-
事件触发器:箭头上的文字
识别对象状态空间的步骤:
-
明确对象从创建到消亡的完整生命周期;
-
确定按什么规则划分生命周期;
-
按规则拆分阶段,得到初步候选状态;
-
梳理各状态下的对象动作,调整状态(合并 / 拆分);
-
明确是什么数据属性决定了对象处于该状态;
-
校验:每个状态都能明确判定,且状态之间互不冲突。
面向对象软件设计概述
面向对象软件设计需要完成的工作:
- 数据/类设计
- 体系结构设计
- 接口设计
- 构件设计
面向对象软件设计的基本步骤:
- 建模系统 / 产品的整体体系结构
- 设计各类接口(连接用户、外部系统、内部构件);
- 详细设计软件构件的实现细节。
面向对象的设计准则
- 模块化
- 抽象
- 信息隐蔽
- 低耦合
- 高内聚
- 可复用
体系结构设计
-
分层体系结构:局部修改不影响整体系统,低耦合;
-
三层架构:界面层、业务逻辑层、数据访问层
-
采用MVC模式的Web体系结构
核心:按业务逻辑、数据、界面显示分离组织代码,核心部件为视图(界面)、控制器(交互调度)、模型(数据 / 业务逻辑);
MVC优点:耦合低、重用性高、开发效率高、可维护性强。
体系结构设计
系统逻辑结构与类包图:
包图规范:
-
包
-
依赖关系
系统物理体系结构与构件图:
物理体系结构与部署图:
部署图规范:
-
节点:运行时,计算机物理元素
-
构件
构件级设计
数据、体系结构和接口设计构成了构建级设计的基础
-
从分析类到设计类
-
从用例场景到设计类
分析类 + 设计模式 = 设计类
-
构件详细类图建模
用户界面设计
界面设计的规则:
- 控制权交给用户
- 减轻用户记忆负担
- 保持界面一致
练习
-
下列关于对象与类的关系的描述中,正确的是
- 对象是类的一种实例 ✅
- 对象是类中的操作
- 对象是类的封装
- 对象是类中的属性
-
下列选项中,适合作为类的属性的是
- 学生
- 计算机
- 服装
- 手机型号 ✅
-
下列选项中,适合作为类或对象的是
- 员工 ✅
- 员工姓名
- 员工所属部门
- 员工身份证号
-
下列关于用例图的叙述中,正确的是
- 用例图用于描述系统的业务
- 用例图用于表示系统中类的构成
- 用例图用于描述系统的功能 ✅
- 用例图用于表示系统的状态变化
-
下列选项中,用于显示对象间处理过程分布的图是
- 协作图 ✅
- 部署图
- 时序图
- 状态图
-
在需求分析阶段表示目标系统与其他外部系统的关系的模型是
- 系统的静态模型
- 上下文模型 ✅
- 系统的组件模型
- MVC模型
-
下列关于MVC模式的叙述中,正确的是
- MVC 用视图、数据、操作三个部分组织程序
- MVC 模型将系统分为界面层、业务逻辑层和数据访问层
- MVC 将应用程序划分为视图、控制器、模型三个核心部件 ✅
- MVC 应用程序被分成用户界面、计算程序、输出程序三个核心部分
-
类图中每个类用方框表示,分成三部分,分别是 202504 ✅
- 类名、属性和操作
- 类名、对象和操作 ✅
- 类名、属性和对象
- 对象、属性和操作
-
下列哪项不属于时序图的元素 202504 ✅
- 对象
- 生命线
- 对象的属性 ✅
- 消息
-
在一个状态机或状态机图中,下列说法正确的是 202504 ✅
-
只能有一个起始状态 ✅
-
可以有多个起始状态
-
只能有一个结束状态
-
不需要结束状态
-
在 C++ 中,对象的操作称作成员函数 202504
-
在 C++ 语言中,多态性是通过虚函数函数来实现的 202504
-
UML 中的部署图是显示网路的物理布局和各种组件的位置 202504
-
通常意义上的三层架构就是将整个业务应用划分为界面层、业务逻辑层和数据访问层 202504
-
继承是指一个类的定义中可以派生出另一个类的定义,派生出的类被称作子类 202504
-
封装 202504
封装是将对象的属性与服务绑定为独立单元的信息隐藏技术,外部可访问其特征,内部细节则完全隐蔽。
-
简述类图中组合关系的含义 202504
组合关系是类之间整体与部分的强依赖关联关系,部分类的实例完全隶属于整体类的实例,二者共存亡:当整体类的实例被销毁时,其包含的部分类实例也会随之消失,失去存在意义。
-
简述面向对象设计准则 202504
-
客户的网上购物用例图如题 33 图,请根据用例图完成下列任务。 202504
-
图中有几个用例
椭圆:8个用例
-
请给出网上购物系统的需求描述
- 允许用户添加商品到购物车
- 允许客户从购物车中移除商品
- 当添加商品到购物车或者从购物车中移除商品时要保存购物车
- 允许客户浏览购物车
- 允许客户生成订单
- 生成订单的同时需要填写收货地址、需要提交订单、需要选择支付方式
-
包含关系发生在哪些用例之间
添加购物车与保存购物车
从购物车中移除到保存购物车
生成订单与填写收货地址
生成订单与提交订单
生成订单与选择支付方式
-
笔者观看的课程是 B 站博主小飞学长Pro的 课程,前四章是免费的如果需要看后面的建议大家去购买正版课程 😊😊
🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉