还记得在听老师讲课的时候就提到过强大的面向对象技术,那时候只是蜻蜓点水,稍稍略过,也没有详细去探究一下,现在学UML视频又碰到了面向对象技术,UML(Unified Modeling Language)就是面向对象的统一建模语言,在战争中常讲究先知敌情,制胜如神,先发制人,才能出其不意,对于这一场学习的硬仗,我是边打边了解,吃一堑长一智,希望为时不晚,下面就随我来了解一下面向对象技术吧。
传统的结构化程序设计(Structured Programming--SP)方法,在数据处理过程中存在一些问题:数据和函数分开;本质上是面向过程的,以功能和需求为核心,功能和需求的不稳定和多变造成程序代码需要经常进行修改,不易维护;程序代码可重用性差,为了解决这些问题,后人们就提出了面向对象技术。
面向对象思想的由来:心理学研究表明,客观世界有许多对象组成,对象具有其属性和行为,对象之间存在各种联系,这样能够更好地刻画问题域,也更接近人类的自然思维方式,面向对象对于解决问题更加简单,直接,主要矛盾不必牵一发而动全身,而面向过程需要考虑的事情比较多也比较繁琐,对于稍大一点的软件开发就容易出现各种问题。
面向对象技术强调在软件开发过程中面向客观世界或问题域中的事物,采用人类在认识客观世界的过程中普遍运用的思维方法,直观、自然地描述客观世界中的有关事物。
它将设计目标从模拟现实世界的行为转向了现实世界中存在的对象及其各自的行为,它是在吸取结构化程序设计的一切优点的基础上发展起来的一种新的程序设计方法,它的本质是是把数据和处理数据的过程当成一个整体——对象。
对象是客观世界中的事物在人脑中的映像,这种映像通过对同一类对象的抽象反映成人的意识,并作为一种概念而存在,每个对象都具有属性(Attribute)和方法(Method)这两方面的特征,对象的属性描述了对象的状态和特征,对象的属性说明了对象的行为和功能,并且对象的属性值只应由这个对象的方法来读取和修改,两者结合在一起就构成了对象的完整描述。
具有相似属性和行为的一组对象,就称为类。类是面向对象语言必须提供的用户定义的数据类型,它将具有相同状态、操作和访问机制的多个对象抽象成为一个对象类。
在OOP中,将”对象“作为系统中最基本的运行实体,整个程序即由各种不同类型的对象组成,各对象既是一个独立的实体,又可通过消息相互作用,对象中的方法决定要向哪个对象发消息、发什么消息以及收到消息时如何进行处理等。
类是对象集合的再抽象,对象是类的实例化。
我们常说”物以类聚,人以群分“就是分类的意思,分类所依据的原则就是抽象。抽象(Abstract)就是忽略事物中与当前目标无关的非本质特征,更充分地注意与当前目标有关的本质特征。从而找出事物的共性,并把具有共性的事物划为一类,得到一个抽象的概念。例如,在设计一个学生成绩管理系统的过程中,考察学生张华这个对象时,就只关心他的班级、学号、成绩等,而忽略他的身高、体重等信息。因此,抽象性是对事物的抽象概括描述,实现了客观世界向计算机世界的转化。将客观事物抽象成对象及类是比较难的过程,也是面向对象方法的第一步。例如,将学生抽象成对象及类的过程如下图
封装(Encapsulation)就是把对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。封装的信息隐蔽作用反映了事物的相对独立性,可以只关心它对外所提供的接口,即能做什么,而不注意其内部细节,即怎么提供这些服务。封装的结果使对象以外的部分不能随意存取对象的内部属性,从而有效地避免了外部错误对它的影响,大大减小了查错和排错的难度。另一方面,当对象内部进行修改时,由于它只通过少量的外部接口对外提供服务,因此同样减小了内部的修改对外部的影响
封装机制将对象的使用者与设计者分开,使用者不必知道对象行为实现的细节,只需要用设计者提供的外部接口让对象去做。就拿用户使用电视机的遥控来说,用户只需使用遥控可以更换节目信息,知道遥控的使用方法已到达自己的目的即可,而至于遥控内部的设计及如何实现对电视机的操作这样的原理问题就是设计者该考虑的事了。
继承(Inheritance)是一种联结类与类的层次模型。继承性是指特殊类的对象拥有其一般类的属性和行为。继承意味着“自动地拥有”,即特殊类中不必重新定义已在一般类中定义过的属性和行为,而它却自动地、隐含地拥有其一般类的属性与行为。继承允许和鼓励类的重用,提供了一种明确表述共性的方法。一个特殊类既有自己新定义的属性和行为,又有继承下来的属性和行为。在拥有共性的基础上又有自己的特性,体现了特殊与一般的关系。例如人分很多种,老师、学生都是人,他们都继承了作为人的共性,同时有自己专属的身份。
多态性(Polymorphism)是指类中同一函数名对应多个具有相似功能的不同函数,可以使用相同的调用方式来调用这些具有不同功能的同名函数。体现在不同的对象收到相同的消息时产生多种不同的行为方式。例如,在一般类“几何图形”中定义了一个行为“绘图”,但并不确定执行时到底画一个什么图形。特殊类“椭圆”和“多边形”都继承了几何图形类的绘图行为,但其功能却不同,一个是要画出一个椭圆,另一个是要画出一个多边形。这样一个绘图的消息发出后,椭圆、多边形等类的对象接收到这个消息后各自执行不同的绘图函数。如下图所示,这就是多态性的表现。
面向对象这块的思想是很重要的,是我们认识世界、解决问题的一种观念的转变,在用这种方法分析问题时就会变得很简单,清晰,想想我们的自考科目《数据库系统原理》中用到过E-R图也称实体-联系图(Entity Relationship Diagram)来找关系解决问题,亲自经历过就会了解面向对象的好处。小编第一次写这样的博客,不足之处请大家多多提意见。