13005 软件工程 第三章 面向对象的软件开发方法

2 阅读13分钟

hello 大家好,由于作者25年10月份考期去参加习思想考试了,所以没有更新现在已经通过了《习思想》开始13005 软件工程的资料更新,献给每一位拥有梦想的"带专人",

每一章节中的练习部分中的标有 2504 的题是25年4月考期的真题希望可以帮到大家~

ps:有不正确的地方麻烦更新在评论区,我会一一修复 😅

第三章 面向对象的软件开发方法

面向对象的基本概念

  1. 对象

    image.png

    1. 构成:封装 “属性(数据)+ 操作(方法 / 成员函数)” 的统一体;
    2. 规则:属性仅能通过对象自身的操作修改;
    3. 操作作用:描述对象能实现的功能(C++ 中称成员函数)
  2. :同数据结构 + 同操作的对象集合,含属性 + 合法操作,对象是类的实例;

  3. 封装:属性 + 服务封装为独立单元(信息隐藏),外部可见特征、隐蔽内部细节。

    image.png

  4. 继承:子类由父类派生,自动继承父类全部属性和服务

  5. 多态性:子类可当父类用(C++ 靠虚函数实现),即 “一种方法,多种实现”。

    image.png

  6. 重载:函数重载与运算符重载。C++中,函数重载通过静态联编实现

    1. 函数重载

      // 模拟 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);      // 报错:参数类型不匹配(无对应重载)
      
    2. 运算符重载

      // 定义一个「坐标类」(类似 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(统一建模语言)是通用可视化建模语言,用于软件系统的描述、可视化、构造与文档化,覆盖需求分析、设计、维护等全生命周期,适用于计算机软件、固件或数字逻辑构成的离散系统建模。

用例图

用于表示系统的功能

image.png

时序图

用于表示业务过程的细节

只显示对象不显示类

image.png

协作图

用于显示对象间处理过程的分布

image.png

类图

显示系统中类与类之间的相互关系。提供了类及其相互关系的静态图形

每个类用方框表示,分成三部分

  1. 类名
  2. 类包含的属性
  3. 类的操作

image.png

状态图

显示对象的功能

为对象的各种状态提供了建模方式

对系统的动态功能进行建模

image.png

组件图

显示模型的物理视图

显示系统中的软件组件及其相互关系

有两种组件: 执行组件、代码库

image.png

部署图

显示网络的物理布局和各种组件的位置

image.png

上下文模型

表示目标系统与其他外部系统的关系,外部系统可能产生数据供目标系统使用,同时也使用该系统产生的数据

image.png

面向对象的需求分析

面向对象分析与设计中,通过抽取、整理用户需求建立多维度问题域精确模型,常用 UML 作为建模语言。主要使用以下五种图

  1. 活动图
  2. 用例图
  3. 时序图
  4. 类图
  5. 状态图

面向对象的建模步骤

基于用例实现的面向对象的建模由以下几个步骤组成:

  1. 沟通用户,明确核心需求
  2. 界定系统边界与外部交互,建立上下文模型;
  3. 梳理业务流程,构建活动图;
  4. 从用户交互视角提炼功能,建立用例模型;
  5. 识别实体对象 / 类(属性、方法、层次关系),搭建静态结构模型;
  6. 基于用例,用时序图描述对象交互关系;
  7. 分析对象行为与状态变化(状态图),完善类图;
  8. 迭代上述步骤,直至模型闭环

基于业务流程的活动图

image.png

用例图与系统功能

每一个信息系统的用例代表着一个完整的功能

用例图规范

  1. 用例:椭圆形表示
  2. 执行者:棒状小人图形
  3. 关联:执行者和用例之间带箭头的线 【实线】
  4. 用例间的包含关系:用例与用例之间带箭头的线 【虚线】

从业务流程到用例图建模

  1. 利用与用户的对话找出系统的用例
  2. 画用例图
  3. 完成用例的描述

image.png

类图与静态结构

类图用于描述系统的静态结构,可以自动转换为程序代码

对象模型的类包括

  1. 实体类:问题域中的核心类
  2. 边界类
  3. 控制类

类图规范

  1. (Class)

    1. 类名

    2. 属性

    3. 操作

      image.png

  2. 关联:类与类之间最基本的关系

    image.png

  3. 泛化:两个类之间一般特殊的关系(子类与父类的关系)

    Saler 与 Customer 是一般

    sysUser 是特殊

    image.png

  4. 整体-部分关系

    1. 聚合:类可以独立存在

      image.png

    2. 组合:类之间只能共存,不可以相互独立

      image.png

  5. 依赖关系:没有结构上的关联,一般称为弱相关

    提交页面管收集用户输入,订单管业务数据和规则,俩是各干各的,就提交时传个数据,内部怎么变互相不影响,所以是弱相关。

    image.png

  6. 多重性:通常在关联或整体-部分关系中会加以使用,代表着对象关系结构中,彼此能够允许的最少及最多的数量

    一辆汽车最少要有4个论讨,最多可以有8个轮胎,汽车与轮胎间的多重性就是4~8

    image.png

类图与静态结构

类图建模基本步骤

  1. 识别类与对象
  2. 识别属性
  3. 识别操作
  4. 识别关联

时序图与交互模型

时序图的主要任务

  1. 画清程序运行时,各个对象怎么配合干活;
  2. 检查类图设计对不对(时序图里的东西都得在类图里有);
  3. 给程序员铺路,按时间顺序写代码就行

时序图规范

  1. 对象
  2. 消息
  3. 生命线

每个对象生命线上的狭长矩形是活动棒,在活动棒内的所有消息之间存在清晰时序关系

image.png

状态图与事件驱动模型

事件驱动模型表示系统内对外部事件的响应方式,事件引起一种状态向另一种状态的转变

状态图规范

  1. 起始状态:用实心黑色圆形表示

  2. 结束状态:用空心黑色圆形表示

  3. 状态:圆角矩形

  4. 迁移:箭头

  5. 事件触发器:箭头上的文字

    image.png 识别对象状态空间的步骤

  6. 明确对象从创建到消亡的完整生命周期;

  7. 确定按什么规则划分生命周期;

  8. 按规则拆分阶段,得到初步候选状态;

  9. 梳理各状态下的对象动作,调整状态(合并 / 拆分);

  10. 明确是什么数据属性决定了对象处于该状态;

  11. 校验:每个状态都能明确判定,且状态之间互不冲突。

面向对象软件设计概述

面向对象软件设计需要完成的工作

  1. 数据/类设计
  2. 体系结构设计
  3. 接口设计
  4. 构件设计

面向对象软件设计的基本步骤

  1. 建模系统 / 产品的整体体系结构
  2. 设计各类接口(连接用户、外部系统、内部构件);
  3. 详细设计软件构件的实现细节。

面向对象的设计准则

  1. 模块化
  2. 抽象
  3. 信息隐蔽
  4. 低耦合
  5. 高内聚
  6. 可复用

体系结构设计

  1. 分层体系结构:局部修改不影响整体系统,低耦合;

  2. 三层架构:界面层、业务逻辑层、数据访问层

  3. 采用MVC模式的Web体系结构

    核心:按业务逻辑、数据、界面显示分离组织代码,核心部件为视图(界面)、控制器(交互调度)、模型(数据 / 业务逻辑);

    MVC优点:耦合低、重用性高、开发效率高、可维护性强。

体系结构设计

系统逻辑结构与类包图:

包图规范

  1. 依赖关系

    image.png

系统物理体系结构与构件图

image.png

物理体系结构与部署图

部署图规范

  1. 节点:运行时,计算机物理元素

  2. 构件

    image.png

构件级设计

数据、体系结构和接口设计构成了构建级设计的基础

  1. 从分析类到设计类

  2. 从用例场景到设计类

    分析类 + 设计模式 = 设计类

  3. 构件详细类图建模

用户界面设计

界面设计的规则

  1. 控制权交给用户
  2. 减轻用户记忆负担
  3. 保持界面一致

练习

  1. 下列关于对象与类的关系的描述中,正确的是

    1. 对象是类的一种实例 ✅
    2. 对象是类中的操作
    3. 对象是类的封装
    4. 对象是类中的属性
  2. 下列选项中,适合作为类的属性的是

    1. 学生
    2. 计算机
    3. 服装
    4. 手机型号 ✅
  3. 下列选项中,适合作为类或对象的是

    1. 员工 ✅
    2. 员工姓名
    3. 员工所属部门
    4. 员工身份证号
  4. 下列关于用例图的叙述中,正确的是

    1. 用例图用于描述系统的业务
    2. 用例图用于表示系统中类的构成
    3. 用例图用于描述系统的功能 ✅
    4. 用例图用于表示系统的状态变化
  5. 下列选项中,用于显示对象间处理过程分布的图是

    1. 协作图 ✅
    2. 部署图
    3. 时序图
    4. 状态图
  6. 在需求分析阶段表示目标系统与其他外部系统的关系的模型是

    1. 系统的静态模型
    2. 上下文模型 ✅
    3. 系统的组件模型
    4. MVC模型
  7. 下列关于MVC模式的叙述中,正确的是

    1. MVC 用视图、数据、操作三个部分组织程序
    2. MVC 模型将系统分为界面层、业务逻辑层和数据访问层
    3. MVC 将应用程序划分为视图、控制器、模型三个核心部件 ✅
    4. MVC 应用程序被分成用户界面、计算程序、输出程序三个核心部分
  8. 类图中每个类用方框表示,分成三部分,分别是 202504 ✅

    1. 类名、属性和操作
    2. 类名、对象和操作 ✅
    3. 类名、属性和对象
    4. 对象、属性和操作
  9. 下列哪项不属于时序图的元素 202504 ✅

    1. 对象
    2. 生命线
    3. 对象的属性 ✅
    4. 消息
  10. 在一个状态机或状态机图中,下列说法正确的是 202504 ✅

  11. 只能有一个起始状态 ✅

  12. 可以有多个起始状态

  13. 只能有一个结束状态

  14. 不需要结束状态

  15. 在 C++ 中,对象的操作称作成员函数 202504

  16. 在 C++ 语言中,多态性是通过虚函数函数来实现的 202504

  17. UML 中的部署图是显示网路的物理布局和各种组件的位置 202504

  18. 通常意义上的三层架构就是将整个业务应用划分为界面层、业务逻辑层和数据访问层 202504

  19. 继承是指一个类的定义中可以派生出另一个类的定义,派生出的类被称作子类 202504

  20. 封装 202504

    封装是将对象的属性与服务绑定为独立单元的信息隐藏技术,外部可访问其特征,内部细节则完全隐蔽。

  21. 简述类图中组合关系的含义 202504

    组合关系是类之间整体与部分的强依赖关联关系,部分类的实例完全隶属于整体类的实例,二者共存亡:当整体类的实例被销毁时,其包含的部分类实例也会随之消失,失去存在意义。

  22. 简述面向对象设计准则 202504

  23. 客户的网上购物用例图如题 33 图,请根据用例图完成下列任务。 202504

    image.png

    1. 图中有几个用例

      椭圆:8个用例

    2. 请给出网上购物系统的需求描述

      1. 允许用户添加商品到购物车
      2. 允许客户从购物车中移除商品
      3. 当添加商品到购物车或者从购物车中移除商品时要保存购物车
      4. 允许客户浏览购物车
      5. 允许客户生成订单
      6. 生成订单的同时需要填写收货地址、需要提交订单、需要选择支付方式
    3. 包含关系发生在哪些用例之间

      添加购物车与保存购物车

      从购物车中移除到保存购物车

      生成订单与填写收货地址

      生成订单与提交订单

      生成订单与选择支付方式

笔者观看的课程是 B 站博主小飞学长Pro 课程,前四章是免费的如果需要看后面的建议大家去购买正版课程 😊😊

🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉