6.1.面向对象技术-面向对象相关概念

news2024/11/24 13:23:01

在这里插入图片描述

基本概念

  • 对象:基本的运行实体,为类的实例,封装了数据和行为的整体(数据和行为就是属性和方法),如学生、汽车等真实存在的实体。对象具有清晰的边界、良好定义的行为和可扩展性。

    • 学生有张三、李四等。张三就是具体的个体,在我们生活中能够找到的存在的个体,这个在程序里叫做对象。学生、老师都是比较广泛的概念,光说学生、老师指的是类,要具体到某个学生,例如张三就是学生这个类的一个实例,是对象。
    • 将张三、李四的姓名、考号、年龄等共有的属性提取出来形成一个抽象的类。
    • 一个类可以产生N个对象,对象拥有这个类的所有共有属性和方法。
  • 类:是对象的抽象,定义了一组大体相似的对象结构,定义了数据和行为。包括实体类(用于对必须存储的信息和相关行为建模的类,是需要长久保存且一直存在的类)、边界类(系统内部与系统外部的业务主角之间进行交互建模的类)、控制类(用于对一个或几个用例所特有的控制行为进行建模,在用例执行过程中被动出现的特定行为的类)。在领域类模型中会涉及描述类自身情况的属性与操作,还会有描述类与类之间的关联(通过消息关联通信),但不会有对象层次的内容。

  • 消息:对象之间进行通信的一种构造称为消息。

  • 继承:父类和子类之间共享数据和方法的机制。是类之间的一种关系。

  • 多态:不同的对象收到同一个消息时产生完全不同的反应。包括参数多态(不同类型参数多种结构类型)、包含多态(父子类型关系)、过载多态(类似于重载,一个名字不同含义)、强制多态(强制类型转换)四种类型。多态由继承机制支持
    多态就是多种形态,比如下面的draw画,可以画圆形,可以画三角形,也可以画正方形
    在这里插入图片描述

  • 覆盖(重写):子类在原有父类接口的基础上,用适合于自己要求的实现去置换父类中的相应实现。即在子类中重定义一个与父类同名同参的方法。
    例如:上图父类draw了长方形,子类继承了父类的draw方法但是又想draw不一样的,draw一个圆形,那么子类可以重新定义一个方法覆盖父类方法

  • 重载:与覆盖要区分开,函数重载与子类父类无关,且函数是同名不同参数。
    例如下面的add方法在这里插入图片描述

  • 封装:一种信息隐蔽技术,其目的是使对像的使用者和生产者分离,也就是使其他开发人员无需了解所要使用的软件组件内部的工作机制,只需知道如何使用组件。
    从封装本身的意思去理解,封装就好像是拿一个袋子,将数据和功能一起装进去,然后将袋子封上口子。
    再比如电脑的每个单元的运行是怎么运行的,我们不知道也不需要知道,但是它对外提供了操作方法
    在这里插入图片描述

  • 静态类型是指一个对象的类型在编译时就确定;动态类型指对象类型在运行时才能确定。

  • 静态绑定(静态分配)是基于静态类型的,在程序执行前方法已经被绑定:

  • 动态绑定是基于动态类型的,运行时根据变量实际引用的对象类型决定调用哪个方法,动态绑定支持多态。

面向对象分析

面向对象分析:是为了确定问题域,理解问题。

五个活动

包含五个活动:认定对象(按自然存在的实体确定对像)、组织对象(分析对象关系,抽象成类)、对象间的相互作用(描述各对象在应用系统中的关系)、确定对象的操作(操作,如创建增加删除等)、定义对缘的内部信息(属性)。

例子:在线书店

假设我们正在开发一个在线书店的系统。以下是面向对象分析的五个活动如何应用于这个例子:

  1. 认定对象:
    • 书籍(Book)
    • 用户(User)
    • 购物车(ShoppingCart)
    • 订单(Order)
    • 支付系统(PaymentSystem)
  2. 组织对象:
    • 将对象分为几个主要的类别,如:商品(书籍)、用户、购物流程(购物车、订单)、支付流程(支付系统)。
    • 确定对象之间的层次结构,例如:书籍可以是小说(Fiction)、非小说(NonFiction)等子类的父类。
  3. 描述对象间的相互作用:
    • 用户可以添加书籍到购物车(User -> ShoppingCart)
    • 用户可以从购物车中移除书籍(User -> ShoppingCart)
    • 用户可以提交订单(User -> Order)
    • 订单会通过支付系统处理支付(Order -> PaymentSystem)
  4. 确定对象的操作:
    • 用户对象可以执行登录、注册、搜索书籍、添加书籍到购物车等操作。
    • 书籍对象可以提供信息,如作者、出版日期、价格等。
    • 购物车对象可以添加书籍、移除书籍、计算总价等。
  5. 定义对象的内部信息:
    • 书籍对象包含的信息有:书名、作者、ISBN、价格等。
    • 用户对象包含的信息有:用户名、密码、邮箱、地址等。
    • 订单对象包含的信息有:订单号、用户信息、订单日期、订单状态等。

面向对象设计和测试

面向对象设计:是设计分析模型和实现相应源代码,在目标代码环境中这种源代码可被执行。设计问题域的解决方案。需要用到UML图

面向对象程序设计:用面向对象程序设计语言实现设计方案。详见下午软件设计。

面向对象测试:与普通测试步骤并无不同。可分为四个层次:算法层(测试类中定义的每个方法,类似单元测试)、类层(测试同一个类中所有方法与属性的相互作用,特有的模块测试)、模板层(测试一组协同工作的类之间的相互作用,类似集成测试)、系统层(类似系统测试)。

面向对象的设计原则

  1. 单一责任原则:
    这个原则就是让一个类只做一件事情,不要把太多的任务放在一个类里。这样做的好处是,当你需要修改某个功能时,只需要关注一个类,而不用担心影响其他功能。
    • 举例:想象你正在开发一个学生管理系统。你有一个Student类,它负责存储学生的信息,比如姓名和年龄。你还有一个StudentManager类,它负责管理学生的添加、删除等操作。这样,每个类只负责一个特定的责任。
    • 举例:想象你是一名学生。你每天要面对多门课程,每门课程都有不同的老师和作业。如果你把所有课程的笔记、作业和书都放在一个文件夹里,当你需要找到特定课程的资料时会变得非常混乱。相反,如果你为每门课程都准备一个专用的文件夹,你就能更轻松地管理和找到所需的信息。每个文件夹就代表了一个类,它们只负责一个特定的任务,即存储与该课程相关的资料。
  2. 开放封闭原则:
    这个原则意味着你可以扩展现有的代码,但不需要修改已有的代码。你应该允许新功能的添加,而不会影响到已经运行良好的功能。对添加开放,对修改封闭
    • 举例:假设你正在编写一个图形绘制软件,你有一个Shpe类,代表各种形状。现在,你想添加一个新的形状,比如三角形。你应该能够通过创建一个新的类(例如Triangle类),而不是修改已有的Shape类。
    • 举例:想象你是一名家庭主妇,你正在准备一顿丰盛的晚餐。你已经在规划中有一些菜肴,但客人可能会有特殊的饮食要求。你可以轻松地劬加入一个新的菜肴或调整配方,而不会影响到你已经准备好的菜肴。这就是开放封闭原则,你的晚餐计划是“封闭”的,因为已经准备好了,但你可以“开放”地添加新的菜肴,以满足不同的需求。
  3. 里氏替换原则:
    这个原则强调子类应该能够替换父类而不会影响程序的正确性。换句话说,你应该能韵够使用子类的实例来替代父类的实例,而不引发错误。
    • 举例:想象你有一个Bid类,代表鸟类,其中有一个y方法。现在你派生了一个企鹅类。根据里氏替换原则,你应该能够在不引发错误的情况下使用企鹅对象来调用y方法,即使实际上企鹅不会飞。
    • 举例:想象你在一个家庭聚会上,有一个传统的糕点摊位。人们习惯了在那里购买各种类型的糕点。假设你去那里买了一个巧克力蛋糕,但是当你尝试吃它时,却发现它其实是一个水果蛋糕。这就违反了里氏替换原则,因为人们期望能够用巧克力蛋糕替代任何其他类型的蛋糕。但在这个例子中,水果蛋糕并不能真正替代巧克力蛋糕,因为它不是巧克力蛋糕的子类。
  4. 依赖倒置原则:
    这个原则强调抽象应该依赖于细节,而不是相反。高层模块不应该直接依赖于低层模块的细节,而应该通过抽象进行交互。我们在调用功能的时候尽量通过接口调用
    • 举例:假设你正在开发一个电子商务平台。你有一个OrderProcessor类负责处理订单。而这个类不应该直接依赖于具体的支付方式,而是依赖于一个抽象的PaymentGateway接口。这样,你可以轻松地更改支付方式,而不必修改
      OrderProcessor。
    • 举例:想象你是一名旅行者,你需要租一辆车去探索一个城市。你不需要亲自去了解车子的每个零件如何工作,你只需要知道如何使用它们。租车公司为你提供了一辆可用的车,而不是让你去修理引擎或更换轮胎。在这个例子中,你是高层模块,租车公司是低层模块,你依赖于租车公司提供的抽象服务,而不是直接与车辆细节打交道。
  5. 接口分离原则:
    这个原则强调客户端不应该被强制依赖它们不需要的方法。接口应该只包含客户端需要的方法,避免造成冗余和不必要的复杂性。
    • 举例:想象你正在设计一个媒体播放器。你应该根据功能拆分成不同的接口,如AudioPlayer和VideoPlayer。这样,如果你只需要一个音频播放器,你就不会被迫实现视频播放相关的方法,从而遵循了接口分离原则。
    • 举例:假设你正在考虑加入一个运动俱乐部。你有多个选项可供选择,如游泳、篮球和瑜伽。不同的人有不同的兴趣,你可能只想参加其中一种活动。运动俱乐部应该将这些活动分开成不同的项目,以便每个人只关注他们感兴趣的部分。这样,你不需要强制自己参加所有的活动,而是可以选择与你有兴趣的活动接口。

练习题

【2021】Java语言符合的特征有()和自动的垃圾回收处理
①采用即时编译
②采用静态优化编译
③对象在堆空间分配
④对象在栈空间分配
(A)①③
(B)①④
©②③
(D)②④

答案A

【2021】面向对象分析时,执行的活动顺序通常是
()
(A)认定对象、组织对象、描述对象的相互作用、确定对象的操作
(B)认定对象、定义属性、组织对象、确定对像的操作
©认定对象、描述对象间的相互作用、确定对象的操作、识别包
(D)识别类及对象、识别关系、定义属性、确定对象的操作

答案A

【2013】38-39.在面向对象技术中,38说明一个对象具有多种形态,_39定义超类与子类之间的关系。
(38)
A.继承 B.组合 C.封装 D.多态
(39)
A.继承 B.组合 C.封装 D.多态

答案D A

【2015】面向对象(0选择合适的面向对象程序设计语言,将程序组织为相互协作的对象集合,每个对象表示某个类的实例,类通过继承等关系进行组织。
A.分析
B.设计
C.程序设计
D.测试

答案C

【2015】在面向对象的系统中,对象是运行时实体,其组成部分不包括37);一个类定义了一组大体相似的对象,这些对象共享(38)。
(37)
A.消息 B.行为(操作) C.对象名 D.状态
(38)
A.属性和状态 B.对象名和状态 C.行为和多重度 D.属性和行为

答案A D
不一定有消息,只有对象与对象通信的时候才会有

参考

深入解析面向对象分析的五大活动

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

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

相关文章

Java哈希算法

哈希算法 哈希算法1.概述2.哈希碰撞3.常用的哈希算法4.哈希算法的用途4.1校验下载文件4.2存储用户密码MD5加密5.SHA-1加密小结: 哈希算法 1.概述 哈希算法(Hash)又称摘要算法(Digest),它的作用是&#xf…

OrangePi AIpro学习3 —— vscode开发昇腾DVPP程序

目录 一、VScode配置 1.1 下载和安装 1.2 安装和配置需要的插件 二、构建项目 2.1 项目架构 2.2 解决代码高亮显示 2.3 测试编译 2.4 总结出最简单的代码 2.5 vscode报错找不到头文件解决方法 三、代码简单讲解 3.1 初始化部分 3.2 拷贝数据到NPU显存中 3.3 准备裁…

Leetcode每日一题之仅仅反转字母(C++)

在学习之余对于知识的巩固也尤为重要,不论难度高低,都会对代码的理解有所加深,下面我们开始练习 思路解析 关于本题的核心思路就是如何判断字符串中元素是否为字母以及如何遍历字符串以达到仅反转的目的,这里用到的知识就是关于 s…

【数据结构与算法 | 二叉树篇】AVL树

1. 前言 AVL树是一种自平衡的二叉搜索树。为什么会出现AVL树。众所周知,虽然普通的二叉搜索树的平均时间复杂度为O(logn),但最差的情况的时间复杂度为O(n)。为了避免最差的这种情况,出现了AVL树。 我们规定:如果树有个节点它的左…

大模型LLM——微调的七种方法

大模型的七种微调方法 文章目录 大模型的七种微调方法1. LoRA2. QLoRA3. 适配器调整4. 前缀调整5. 提示调整6. P-Tuning7. P-Tuning v2 1. LoRA LoRA的主要步骤包括: 选择微调目标权重矩阵:首先在大型模型(如GPT)中识别需要微调…

学习vue3 五,传送,缓存组件以及过渡和过渡列表

目录 Teleport传送组件 keep-alive缓存组件 transition动画组件 1. 过渡的类名 2. 自定义过渡class名 3. transition的生命周期 4.appear transition-group 1. 过渡列表 2. 列表的移动过渡 3. 状态过渡 Teleport传送组件 Teleport Vue 3.0新特性之一。 Teleport 是一…

AI技术如何重塑企业EHS安全健康环保体系,附实践案例

随着人工智能技术的快速发展,其在环境、健康和安全(EHS)管理领域的应用日益广泛。AI技术通过大数据分析、模式识别和预测建模等手段,为EHS管理提供了新的视角和工具。这一变革不仅提升了风险评估和事故预防的效率,同时…

Can‘t use Subversion command line client:svn不能使用Subversion命令行客户端:svn

1、导入idea中会报Can’t use Subversion command line client… 2、在提交svn代码的时候,出现这样的错误:Can’t use Subversion command line client: svn Probably the path to Subversion executable is wrong. Fix it. 问题原因:在安…

实验8-1-4 拆分实数的整数与小数部分

本题要求实现一个拆分实数的整数与小数部分的简单函数。 函数接口定义&#xff1a; void splitfloat( float x, int *intpart, float *fracpart );其中x是被拆分的实数&#xff08;0≤x<10000&#xff09;&#xff0c;intpart和fracpart分别是将实数x拆分出来的整数部分与…

sqli-labs1-24通关教程

目录 前置知识 第一关 1、第一关是单引号字符型注入,输入id1‘会报错 2、输入注释符正常显示 3、爆出列数为联合做准备 4、使用联合查询爆出数据库名 5、使用information_schema爆出表名 6、猜测用户名再users表中&#xff0c;爆出列名 ​编辑 7、利用查出来的表名数据…

【第2期】2024 搜索客 Meetup | Elasticsearch 的代码结构和写入查询流程的解读

本次活动由 搜索客社区、极限科技&#xff08;INFINI Labs&#xff09;联合举办&#xff0c;活动主题将深入探讨 Elasticsearch 的两个核心方面&#xff1a;代码结构以及写入和查询的关键流程。本次活动将为 Elasticsearch 初学者和有经验的用户提供宝贵的见解&#xff0c;欢迎…

叉车(工业车辆)安全监控管理系统,叉车安全方案

叉车作为特种设备的一种&#xff0c;存在一定的危险性&#xff0c;操作过程出现意外的情况可谓是不胜枚举&#xff0c;轻则伤财、受些皮外伤&#xff0c;重则直接致人死亡。为加强叉车操作的安全管理&#xff0c;从2023年12月1日起实施的TSG 81-2022《场&#xff08;厂&#xf…

【网络安全学习】SQL注入02:使用sqlmap进行注入

1.sqlmap的基本功能 sqlmap的基本功能是对Web应用中的数据库进行自动化的检测、利用和攻击。 使用pikachu靶场进行sqlmap的基础功能使用。 1️⃣ 第一步&#xff1a;先检查是否有注入点&#xff1a; # -u : 指定目标url&#xff0c;也就是指定注入点 sqlmap -u "http:…

终端命令行|CLI工具|CMD|PowerShell

基本概念 终端是一个文本界面&#xff0c;用于执行基于文本的程序。 果你正在运行任何用于 web 开发的工具&#xff0c;你一定需要打开命令行并运行一些命令来使用你所选择的工具 (这样的工具被称为CLI 工具也就是命令行接口工具)。 命令行接口工具 (CLI 工具) 是什么&#xf…

延伸--人工鱼群算法

目录 基本原理 改进策略 代码示例 应用实例 总结 人工鱼群算法在解决多峰函数问题中的具体应用案例和效果如何&#xff1f; 双群人工鱼群算法与传统人工鱼群算法相比&#xff0c;有哪些具体的改进和优势&#xff1f; 步长自适应调整在人工鱼群算法中的实现机制是什么&a…

vue3踩坑问题记录

//vue3element-plus //1、placeholder换行显示 const startTxt ref() const contentText ref<any>() startTxt.value "请描述问题内容、例如&#xff1a;" historyData.prompt.forEach((el:any)>{contentText.value \n${el.question}}) <ElInputv-mo…

点赞收藏测试文章(让我看看有多少机器人在刷互动量)

前言 这里有一些看似合理但实际毫无意义的句子&#xff0c;我需要用它来看看跟我互动的有多少机器人 如果你是人类用户&#xff0c;可以用评论来代替点赞&收藏&#xff0c;爱你~ 目录 前言 正文 1. 紫色的大象在夜空中游泳。 2. 月亮上的饼干师烤出了一片海洋。 3. 时…

数据结构(邓俊辉)学习笔记】词典 03—— 排解冲突(1)

文章目录 1. 一山二虎2. 泾渭分明3. 开放定址4. 线性试探5. 赖惰删除 1. 一山二虎 此前我们已经多次指出&#xff0c;对于需要动态维护的散列表冲突是不可避免的&#xff0c;无论你的散列函数设计的有多么精妙&#xff0c;因此我们不得不回答的第二个重要问题就是一旦发生冲突&…

苹果电脑维护工具:CleanMyMac X让你的Mac焕发新生!

在我们的数字生活中&#xff0c;苹果电脑&#xff08;Mac&#xff09;已成为不可或缺的一部分&#xff0c;无论是为工作披星戴月&#xff0c;还是为娱乐畅游云端。但是&#xff0c;就像任何长时间运行的机器一样&#xff0c;Mac也可能会因为积累的文件和不必要的数据而开始变慢…

DAMA学习笔记(十一)-元数据管理

1.引言 元数据最常见的定义是“关于数据的数据”。它描述了数据本身&#xff08;如数据库、数据元素、数据模型&#xff09;&#xff0c;数据表示的概念&#xff08;如业务流程、应用系统、软件代码、技术基础设施&#xff09;&#xff0c;数据与概念之间的联系&#xff08;关系…