【一】面向对象设计

面向对象

  • 在软件开发中,通常认为在编程之前要完成设计。这种说法并不准确;在实际中,分析、编程和设计趋向于重叠、结合、交织。

对象是一个数据以及相关行为的集合

面向简单的意思就是指向;面向对象:把功能指向模型(对象)
这里写图片描述

对复杂系统的建模方法之一:通过数据和行为来描述交互对象的合集。

分析、设计、编程是软件开发的流程,面向对象是一种开发的风格。

软件开发并不是一蹴而就,采用迭代式开发模型:先模块化、设计和编程实际任务中的一小部分,然后评估这个程序并通过扩展来改善每一个特性,包括一系列短周期里增加新的特性。


对象和类

对象:行为数据集合

  • 一个苹果是“苹果”对象,另一个苹果是“另一个苹果”对象。

类:创建对象的模板

  • 很多个“苹果”对象通用一个“苹果”类。

描述类、对象之间的关系:统一建模语言(UML)
这里写图片描述

  • 图中展示出了:一名学生和一间教室因为某种关系关联在一起。关联是把两个类联系起来的基本方式。

类之间的关系通常不需要进一步解释,但是进一步澄清的场合也是存在的。
这里写图片描述

  • 图中解释了学生和教室的关系:一间教室可以容纳多名学生。
  • 多样性:类之间的关系可以双向解读。

指定属性和行为

对象是类的实例,可以彼此相互关联。一个对象实例是一个带有他自己数据集合行为特定对象。例如:小明同学就是小明,是一个特定的学生对象。

数据描述对象

一个类的对象可以定义这个类的一些公共特征,这些特征可以赋予不同的值。例如有3名学生,都有一个名字,所以“学生”类就有公共属性“姓名”,而“姓名”可以相同也可以不同。所以,属性的值不唯一

属性类型一般是编程语言常见的标准说法,如整型、浮点型、字符串字节等,也有可能是数据结构,例如列表、树、图等。

  • 在设计阶段不用考虑这些属性的值具体,因为不同的语言有不同的实现方法。

完善上面的例子,给属性赋值:
这里写图片描述


行为是动作

行为是可以发生在对象身上的动作。一个特定的类的对象里可以执行的行为叫做方法

  • 在编程层面,方法就像结构化编程里的函数一样。

方法可以像函数那样接受参数并返回值。
回到例子中,和学生联系到一起的行为有上学,上学就需要到一间教室,成为班级的一员,即加入花名册里。所以上学这个动作就要有一个教室参数作为操作依据;学生上学要交作业,交作业方法会返回一个值叫作业成绩。对于教室,放学之后就要清空,学生各自回家;教室还有一个行为是授课,授课就需要科目,所以科目就是授课这个方法的参数。
这里写图片描述

给单个对象添加模块或者方法允许我们创建一个交互对象的系统。系统里的每一个对象都是特定的类的成员。这些类指明了这个对象可以容纳什么样的数据类型以及什么方法可以调用它。每一个对象的数据相比于同一类的其他对象可以有不同的状态,并且因为这个不同,每一个对象对于方法调用的反应也是不一样的。


隐藏细节并且创建公共接口

模块化一个对象的主要目的是决定该对象的公共接口。接口是其他对象可以和该对象交互的属性和方法的集合。它们不需要通常也不允许去访问对象内部空间。一个常见的例子就是手机,我们在使用手机拨打电话的时候,不必考虑电话通讯是如何建立的,仅需要通过UI就可以完成操作。作为普通用户,我们没能力也没权限打开手机去查看内部的硬件工作状态,通常这会让你失去保修。

隐藏一个对象实现或者功能细节的过程,通常称为信息隐藏,有时也会成为封装封装数据并不一定是隐藏。,你有一封情书,为了不让父母发现,你藏在了一个上锁的收纳盒中,收纳盒放在收纳箱里,这就是封装并隐藏。然而你把情书放在一个全包相框中,挂在了墙上,这时候就是封装而没有隐藏了。

  • 封装和隐藏在设计时不是那么重要,实际上这两个属于是可以相互替换的。作为Python工程师,我们不需要和不必要真正的隐藏信息。

程序对象代表了对象,但它们不是真正的对象,它们是模型。模型的好处是可以理想化,忽略不重要的细节。一个手机模型可以理想化为可以实际使用的手机,具有一切你想要的功能,虽然它本身只是一个摆设。模型是真是概念的抽象

抽象是另一个和封装一级信息隐藏相关的面向对象词汇。抽象意味着要对一个给定的任务以最合适的水平来处理细节的描述程度。它是一个把公共接口从内部细节抽取出来的过程。还是那个手机模型,对于普通用户来说,用户操作的是UI, 可以打电话,发短信,上网等,其后台的进程管理、电源管理、信号处理等功能是无关紧要的,对于开发工程师来说,这些又是所关注的重点。抽象就是通过把公共和私有接口分开而封装信息的过程。私有接口用于信息隐藏。(只有特定的人知道)


组合和继承

组合

到目前为止,我们已经学会了把系统作为一组交互式对象来设计,每一个交互都是在适当的抽象层次上查看对象,创建这些抽象对象的方法一般有两个基本原则:组合继承

组合:把一些对象收集在一起组成一个新的对象。

  • 当一个对象是另一个对象的一部分时,这是一个好选择。

在手机的例子里,一部手机是由主机、电源适配器、电源线、耳机、包装盒组成。接下来,主机是由屏幕、后盖、电池、主板、中框等组成。在这个例子中,组合是提供抽象很好的方式。手机对象提供给用户所需要的接口,同时提供了访问后台的能力,根据工程师的需要可以不同层面的抽象划分。

然鹅,程序系统中的对象并没有实际对象那么事无巨细,程序设计中的对象往往更加具有针对性,要什么,不要什么,清晰明了。

象棋游戏

  • 象棋游戏是由两个棋手之间得。在一个8X8的网格里包含64个位置的棋盘上使用一副棋子。棋盘有可以移动的16个一组的棋子两组,两个选手交替用不同的方式移动。每一个棋子可以吃掉其他的棋子。每一次移动,棋盘都要在屏幕刷新自己。

在描述中,斜体确定了一些可能的对象。黑体确定了一些可能的关键方法。在一个面向对象分析变成设计的过程中,这是常见的第一步。在这一点上,为了强调组合,我们将关注于棋盘,而不会关心太多有关玩家或者不同类型棋子的问题。

为了方便后续表述,UML将采用英文方式展现。

这里写图片描述

  • 这个图确切的表示了2个玩家可以和一套棋子做交互,同时也说明,任何玩家一次动作只能玩一副棋子。

现在,让我们抛开UML,想象一下象棋这个对象由什么组成:一个棋盘和32个棋子。棋盘由64个位置组成。此时要引入一个概念聚合,聚合是组合的一种一般式,在上面例子中,棋盘的组成位置是不能随意剥除的,棋盘A的A1位不可能由棋盘B的A1位来替代,这是组合;然鹅,原棋盘A配套的棋子King,却可以用棋盘B的配套棋子King来替代。
让我们完善象棋游戏的UML:
这里写图片描述

  • 在UML中,实心菱形代表组合关系,空心菱形代表聚合关系。推荐使用Visio制作UML

继承

继承,在面向对象编程中众所周知的一种关系。继承,顾名思义,从父辈那里获得的相关的属性。一个类可以从其他类继承属性和方法

例如我们在象棋中有32个棋子,其实只有6中不同的棋子类型(Rook/Bishop/King/Queen/Knight/Pawn),每种类型棋子在移动的时候遵从不同的规则。所有这些棋子都有如颜色、属于那副棋、形状、移动等属性。用UML表示这几种棋子从一个Piece类继承的关系:
这里写图片描述
所有的棋子都会通过Piece继承到chess_set和color属性。每一个棋子提供一个不同的shape属性和move方法。

考虑到象棋棋子的特点,给它们提供一个默认移动方法没有什么意义,只需要在每个子类里面指明它的移动方法就行。这可以通过使Piece成为一个抽象类,并且声明一个抽象的移动方法实现。抽象方法好像在说:“我们在子类里需要这个方法,但是我们不允许这个类指明一个现实方法。”这样一个没有实现任何方法的类,会简单的告诉我们这个类该做什么,但是绝对没有提供任何建议告诉你如何去做。

在面向对象编程中,这种类成为接口

继承提供了抽象

多态:依据一个类的不同子类的实现方式而区别对待这个类的能力。在上面的例子中,棋盘对象接收到一个移动请求,然后调用这个棋子的move方法函数。棋盘不关心是哪个棋子的move函数,它要做的只是调用,然后相应的子类会去处理是哪个棋子、该怎么移动。

多重继承

当我们说遗传的时候,我们会说“这个孩子眼睛像他爸,鼻子像他妈”。同样在编程中,允许一个子类从多个父类那里继承功能。

只要两个类有不同的接口,对于一个从这两个类继承过来的子类通常是无害的。例如,如果我们有一个汽车类,它有一个move方法,并且还有一个船类,它也有一个move方法。然后我们想创建一个水陆两栖的交通工具,需要继承这两个类的一些属性,当我们调用move方法的时候,这个子类到底该怎么操作?在设计层面,这需要解释,在实现层面,每种编程语言有各自不同的方式决定该调用哪一个父类的方法,或者基于什么样的顺序去调用。
一个比较好的处理方法就是避开它,想想有没有其它不冲突的方法来实现。

总结

学习了如何把两个不同的对象分为一个不同的类的分类,通过类的接口描述了这些类的属性和行为。

  1. 类和对象
  2. 抽象、封装、信息隐藏
  3. 设计一个公共接口
  4. 对象关系:关联、组合、继承
  5. UML语法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值