当前课程知识点:软件工程与软件自动化 >  第三章 OO与UML >  3.1 面向对象核心概念和基本特性 >  核心概念与基本特性

返回《软件工程与软件自动化》慕课在线视频课程列表

核心概念与基本特性在线视频

下一节:面向对象设计基本原则

返回《软件工程与软件自动化》慕课在线视频列表

核心概念与基本特性课程教案、知识点、字幕

今天我们讨论面向对象的核心概念和它的基本特性

首先来看一个简单的小设计

大家一起来考虑一下

如何设计一个五子棋游戏

五子棋大家应该都玩过

基本上都是用一个围棋盘,外加一些围棋子玩的

当我们找不到围棋的时候

可能用一张纸,在上面用笔画着玩

这里我们对比一下面向过程的设计方法

和面向对象的设计方法在五子棋的设计过程当中

有什么不一样的地方

一般来说,面向过程需要

分析出解决问题所需要的步骤

然后用函数把步骤一步一步的实现

使用的时候按次序调用

而面向对象的分析方法则是

把问题分割成多个对象

然后通过对象之间的消息传递

和协作来解决问题

下面我们来稍微详细地展开看一看

先看面向过程的设计是怎么做的

这里最好的表达方式当然是

用一个流程图把五子棋的走棋步骤画清楚

把黑子白子的移动

画面的绘制以及输赢的判断

分别用函数来表示

然后从main函数入口开始

逐一调用这些函数

通过循环控制程序的走向

最后输出结果,黑赢还是白赢

面向对象的设计过程是怎样的呢?

在了解了五子棋的基本下棋过程之后

非常重要的一步就是

要从这个过程当中识别出有哪些对象

这里我们可以初步识别出三个主要对象

就是棋子对象,规则对象和棋盘对象

很明显,棋子对象的主要职责

就是接收用户的输入

至于黑色的还是白色的

这只是棋子对象的一个简单的属性而已

规则对象封装了五子棋的判断规则

比如像犯规,谁输谁赢等等

而棋盘对象则负责绘制整个棋盘

基本对象识别出来之后

可以进行进一步的分析,分析对象之间的交互顺序

这可以通过序列图来表达

同时,为了说明某个主要对象的状态变化

我们可以用状态图来说

面向过程的设计方法和面向对象的设计方法

在扩展性方面也具有不同的表现

比如现在我们提出了两个扩展性的要求

一个是增加悔棋的功能

一个是把五子棋改造成围棋程序

我们先看悔棋

面向过程的设计从输入、判断

到显示这一连串的步骤都要改动

甚至步骤之间的循序顺序都要进行大规模的调整

而面向对象设计呢

只要改动棋盘对象

因为棋盘对象保存了黑白双方的棋谱

简单回溯就可以了

同时整个对象功能的调用顺序都没有变化

这种改动只是局部的

再来看一看如何把五子棋程序改造成围棋程序

面向过程的设计中

五子棋的规则分布在程序的每一角落

要改动还不如重写

面向对象设计呢,主要的改动是规则对象

五子棋和围棋的主要区别在于规则

其他的小改动比如棋盘大小的改变呢

只需要改变棋盘对象的一个或几个属性就可以了

下棋的大致步骤从面向对象的角度来看

没有任何变化

讨论完了这个简单的五子棋的例子之后

我们来看面向对象设计这部分的知识结构

在这张图中,核心是类和对象这两个概念

也说明了,在面向对象方法看来

我们的软件系统里面一切皆对象

围绕着这两个核心概念

是4个面向对象的基本特性

也就是抽象,封装,继承和多态

只有好好的应用这些基本特性

才能发挥出面向对象方法的巨大威力

但是,对于初学者来说

如何有效而灵活的应用这些特性

却是一个具有挑战性的任务

为此,专家们提出了7条面向对象设计的基本原则

对象识别出来之后

需要进一步为对象确定职责

职责划分的是否合理将会

严重影响到整个系统的各个方面

因此,面向对象设计的专家们

又提出了9条通用职责分配模式

也就是GRASP来指导大家的设计活动

但是在实际的面向对象设计过程中

上面这些原则和模式显得还是比较虚

更多的设计人员希望得到一些更加具体的指导

于是四位专家借鉴了建筑行业的经验

总结出了更加具体的Gof23种设计模式

如果大家按照这样的顺序

来理解和掌握面向对象相关知识

一定可以快速而有效的提高自己的

面向对象的分析和设计能力

下面我们一起来快速地过一下这两个核心概念

类是什么?类是按照某个标准

或者是从某个角度把一些具有公共特性

的事物提取出来的一个模板

这个模板包括表征个体状态的属性

还包括了表征个体职责的方法

而对象呢,则是类这个模板生产出来的

用于软件系统中模拟实际业务行为的个体

从这个角度来看

面向对象技术追求的就是

运用人类的自然思维来构造软件系统

从而解决实际业务问题

为了便于表达

有的时候我们并不严格的区分对象和类

比如说当我们说识别对象的时候

我们的意思实际是识别出类

并用某种符号把它标记出来,比如UML

便于交流

识别对象的时候

我们比较容易识别出那些具体的对象

比如谁在什么地方干了什么事儿

相对应的我们不太容易识别出

那些无形的和逻辑的对象

比如销售对象,价格对象和颜色对象等等

抽象其实可以理解为是一种研究问题的方法

一种抓住本质

忽略无价值信息的提取的方法

比如我们可以根据需要

把现实世界的纸质书抽象为一个

具有5个核心属性的类图

大家注意这里的用词“根据需要”

书的重量为什么不抽象出来作为一个属性呢?

如果没有这么提取,也就是说不需要这么提取

但是如果我现在在开发一个快递系统

在系统中快递物品的重量会影响到快递价格

这个时候我们就需要为书这个物品

添加一个重量的属性

而作者,出版社这些属性就变得没有意义了

就可以忽略掉了

这里我们可以进一步看到

设计者的观察角度不同,目的不同

关心的属性和方法也可能是完全不一样的

对于汽车来说,销售人员和维修人员

他们所关心的是完全不同的

我们提倡适度抽象,避免过度抽象或抽象不足

如果抽象不足

设计出来的软件系统就会臃肿混乱

牵一发而动全身

如果过度设计呢

系统里可能充满了各种普通程序员

难以理解的这种所谓的高级特性

系统就变得复杂,难以维护

正确的做法是,我们只在必要的地方

进行适度的抽象

需求稳定的地方就没有必要进行所谓灵活性的设计

这样设计出来的系统既有利于维护

又具有一定的可扩展性

同时也便于普通的开发人员进行开发和维护

但这种对适度的理解和掌握

只有经过大量实践的训练才能逐步做到

第二个特性是封装

封装就是把细节隐藏起来不让别人看到

别人想用我,只能经过我设计的接口来使用

而且还要接受我的各种各样的规则检查

满足了才能使用

否则我可以拒绝提供服务

最直观的封装就是类里面的私有字段的封装

类的私有字段外人无法看到

只能通过类提供的public类型的

getter或者setter来访问私有字段

在getter和setter中

可以设置任何需要的规则检查

封装的作用其实我们刚才已经体会到了

主要就是隐藏数据,除了隐藏数据

还可以隐藏底层数据存储的方式

实现的细节等等

通过getter和setter这些接口

可以维护数据的一致性和有效性

比如有一个邮寄地址的类

它有两个属性:邮编和地址

这两个属性是有一致性要求的

也就是说你不能只修改邮编而不修改门牌号

封装使得每个对象都不需要

也不能去过分关注别的对象的内部事务

从而可以集中精力参与对象之间的协作实现业务逻辑

继承这个特性大家已经很熟悉了

继承的目的毫无疑问是为了代码复用

就像一个人继承了父母的财产一样

是对财产的复用

要用好继承,关键是要把抽象的这种分层结构搞清楚

也就是如何设计这个继承树

分几层,每一层要表现出来哪些特性等等

比如animal派生出pig和bird

这是一种抽象级别的分层,分了两层

那能不能,需不需要在这两层中间

增加一个飞禽和走兽这两个中间级别的子类呢?

需要么?

很多面向对象技术的初学者

往往对多态缺乏理解和掌握

但多态却是面向对象技术真正的威力所在

首先直观地来看,什么是多态

多态就是不同子类对同一消息做出不同的反应

这里强调这些子类具有共同的父类

在使用的时候,可以把子类的指针

赋值给父类类型的指针

从而在运行时可以动态的绑定子类的方法

这里子类的方法重新定义了父类中的方法

这叫覆盖override,请注意覆盖和重载的区别

就是override和overload的区别

覆盖是用于重写基类的虚方法

这样在派生类中提供一个新的方法

而重载(overload)提供了一种机制

相同的函数名通过不同的返回值类型

和参数来表来区分他们

通过多态我们可以灵活高效的

提升代码的可扩展性

适度使用多态可以简化程序流程

提升代码的可维护性

但是,多态的滥用降低了系统的性能

还增加了不必要的复杂性

让代码变得苦涩难懂

因此,对多态的使用必需要根据

具体的软件系统特征和需求的变化程度来决定

下面我们一起来对这部分总结一下

软件系统当中的类和对象

是对自然业务流程的抽象和模拟

而抽象则是事物本质特征的精炼和抽取

封装的目的是为了隐藏数据,同时也便于代码的复用

继承是另外一种代码复用的方法

多态通过抽象和抽象方法等技术

运用运行时绑定技术,实现了对接口的重用

面向对象技术的四个基本特性从不同的方面

完成了对两个核心概念的完美支持

从而形成了面向对象技术的基本知识架构

好,今天就讨论到这儿,下次再见

软件工程与软件自动化课程列表:

第一章 软件工程基础

-1.1 软件工程的前生今世

--开篇阅读

--授课视频

-第一章 软件工程基础--1.1 软件工程的前生今世

-1.2 万变不离其宗

--授课视频1/3

--授课视频2/3

--授课视频3/3

-第一章 软件工程基础--1.2 万变不离其宗

-1.3 唯一不变的是变化

--授课视频1/3

--授课视频2/3

--授课视频3/3

--外部链接

-第一章 软件工程基础--1.3 唯一不变的是变化

-1.4 亡羊补牢为时不晚

--授课视频1/2

--授课视频2/2

-第一章 软件工程基础--1.4 亡羊补牢为时不晚

-扩展阅读与话题讨论

--扩展阅读

--话题讨论

第二章 敏捷开发

-2.1 方法论来源于恐惧

--授课视频

-第二章 敏捷开发--2.1 方法论来源于恐惧

-2.2 敏捷是什么

--授课视频

-第二章 敏捷开发--2.2 敏捷是什么

-2.3 典型敏捷开发方法

--SCRUM敏捷开发方法

--XP敏捷开发方法

-第二章 敏捷开发--2.3 典型敏捷开发方法

-2.4 敏捷不是万能药

--授课视频

-第二章 敏捷开发--2.4 敏捷不是万能药

-专家谈敏捷

--专家谈敏捷开发方法

-扩展阅读与话题讨论

--外部链接

--话题讨论

第三章 OO与UML

-3.1 面向对象核心概念和基本特性

--核心概念与基本特性

-第三章 OO与UML--3.1 面向对象核心概念和基本特性

-3.2 面向对象设计基本原则

--面向对象设计基本原则

-第三章 OO与UML--3.2 面向对象设计基本原则

-3.3 通用职责分配模式(GRASP)

--通用职责分配模式

-3.3 通用职责分配模式(GRASP)--作业

-3.4 从重构到模式

--模式和设计模式

-第三章 OO与UML--3.4 从重构到模式

-3.5 使用UML设计面向对象系统

--UML综述

-第三章 OO与UML--3.5 使用UML设计面向对象系统

-3.6 主要UML模型图绘制技巧

--UML用例图

--UML类图

--UML序列图绘制技巧

-第三章 OO与UML--3.6 主要UML模型图绘制技巧

-扩展阅读与话题讨论

--设计模式有毒么?

--话题讨论

第四章 对象模型分析

-4.1 案例简介

--书籍参考

--案例说明

-4.2 对象模型之一

--授课视频1/2

--授课视频2/2

-第四章 对象模型分析--4.2 对象模型之一

-4.3 对象模型之二

--授课视频1/2

--授课视频2/2

-第四章 对象模型分析--4.3 对象模型之二

-4.4 对象模型之交互

--授课视频

-第四章 对象模型分析--4.4 对象模型之交互

-扩展阅读与话题讨论

--图书推荐

--话题讨论

第五章 软件自动化技术

-5.1 软件自动化概述

--软件自动化概述

-第五章 软件自动化技术--5.1 软件自动化概述

-5.2 典型自动化方法和工具

--典型自动化工具视频

-第五章 软件自动化技术--5.2 典型自动化方法和工具

-5.3 文档自动化

--文档自动化视频

-第五章 软件自动化技术--5.3 文档自动化

-5.4 测试自动化

--测试自动化视频

--白盒测试工具VU的示例演示片段(版权属原作者)

--功能和性能自动化测试工具及简单应用演示

-第五章 软件自动化技术--5.4 测试自动化

-专家访谈

--北京理工大学刘辉教授谈软件自动化新进展

-扩展阅读与话题讨论

--各个开发阶段最流行的Java工具汇总

--话题讨论

第六章 CI/CD与DevOps

-6.1 持续集成

--持续集成视频1/2

--持续集成视频2/2

-第六章 CI/CD与DevOps--6.1 持续集成

-6.2 持续交付和部署

--持续交付和持续部署

-第六章 CI/CD与DevOps--6.2 持续交付和部署

-6.3 DevOps

--DevOps授课视频

-第六章 CI/CD与DevOps--6.3 DevOps

-专家访谈

--卓睿科技总架构师带来的精彩访谈

-扩展阅读与话题讨论

--DevOps专题

--话题讨论

第七章 软件质量保证

-7.1 质量和质量保证

--授课视频

-第七章 软件质量保证--7.1 质量和质量保证

-7.2 软件质量模型

--授课视频

-第七章 软件质量保证--7.2 软件质量模型

-7.3 SQA组织与职责

--授课视频

-第七章 软件质量保证--7.3 SQA组织与职责

-7.4 全面软件质量管理

--授课视频

-第七章 软件质量保证--7.4 全面软件质量管理

-专家访谈

--专家访谈

-扩展阅读与话题讨论

--外部链接

--话题讨论

第八章 软件过程改进

-8.1 软件过程综述

--授课视频

-第八章 软件过程改进--8.1 软件过程综述

-8.2 软件过程改进

--授课视频

-第八章 软件过程改进--8.2 软件过程改进

-8.3 能力成熟度模型

--授课视频

-第八章 软件过程改进--8.3 能力成熟度模型

-8.4 过程改进标准框架

--授课视频

-第八章 软件过程改进--8.4 过程改进标准框架

-扩展阅读与话题讨论

--敏捷和CMM矛盾么?

--话题讨论

第九章 软件复用

-9.1软件复用综述

--授课视频

-第九章 软件复用--9.1软件复用综述

-9.2 软件构件技术

--授课视频

-第九章 软件复用--9.2 软件构件技术

-9.3 软件复用实施

--授课视频

-第九章 软件复用--9.3 软件复用实施

-9.4 微服务架构

--授课视频

-第九章 软件复用--9.4 微服务架构

-扩展阅读与话题讨论

--微服务扩展

--话题讨论

文档提交处

-文档提交处--文档提交

核心概念与基本特性笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。