编程思想-面向对象

2016-10-26  本文已影响183人  Simba_LX

1.什么是面向对象


面向对象开发方法(ObjectOriented,OO)又称:快速原型法。

客观世界是由各种各样的对象组成的,每种对象都有各自的内部状态和运动规律,不同对象之间的相互作用和联系就构成了各种不同的系统。
在设计和实现一个客观系统时,在满足需求的条件下,把系统设计成一些不可变的(相对固定)部分组成的最小集合(最好的设计)。这些不可变的部分就是所谓的对象。

2.面向对象开发方法的组成


1、面向对象的(需求)分析OOA

2、面向对象的设计OOD

3、面向对象的程序OOP

3.面向对象开发方法的开发过程


1、系统调查和需求分析:对系统将要面临的具体管理问题以及用户对系统开发的需求进行调查研究,即先弄清要干什么的问题。

2、分析问题的性质和求解问题:在繁杂的问题域中抽象地识别出对象以及其行为、结构、属性、方法等。一般称之为面向对象的分析,即OOA。

3、整理问题:对分析的结果作进一步的抽象、归类、整理,并最终以范式的形式将它们确定下来。一般称之为面向对象的设计,即OOD。

4、程序实现:用面向对象的程序设计语言将上一步整理的范式直接映射(即直接用程序设计语言来取代)为应用软件。一般称之为面向对象的程序,即OOP。

5、识别客观世界中的对象以及行为,分别独立设计出各个对象的实体;分析对象之间的联系和相互所传递的信息,由此构成信息系统的模型;由信息系统模型转换成软件系统的模型,对各个对象进行归并和整理,并确定它们之间的联系;由软件系统模型转换成目标系统。

4.面向对象的基本概念


对象是要研究的任何事物。从一本书到一家图书馆,单的整数到整数列庞大的数据库、极其复杂的自动化工厂、航天飞机都可看作对象,它不仅能表示有形的实体,也能表示无形的(抽象的)规则、计划或事件。对象由数据(描述事物的属性)和作用于数据的操作(体现事物的行为)构成一独立整体。从程序设计者来看,对象是一个程序模块,从用户来看,对象为他们提供所希望的行为。在对内的操作通常称为方法。一个对象请求另一对象为其服务的方式是通过发送消息。

类是对象的模板。即类是对一组有相同数据和相同操作的对象的定义,一个类所包含的方法和数据描述一组对象的共同行为和属性。类是在对象之上的抽象,对象则是类的具体化,是类的实例。类可有其子类,也可有其它类,形成类层次结构。

消息是对象之间进行通信的一种规格说明。一般它由三部分组成:接收消息的对象、消息名及实际变元。

继承性(Inheritance)是指,在某种情况下,一个类会有“子类”。子类比原本的类(称为父类)要更加具体化。例如,“狗”这个类可能会有它的子类“牧羊犬”和“吉娃娃犬”。在这种情况下,“莱丝”可能就是牧羊犬的一个实例。子类会继承父类的属性和行为,并且也可包含它们自己的。我们假设“狗”这个类有一个方法(行为)叫做“吠叫()”和一个属性叫做“毛皮颜色”。它的子类(前例中的牧羊犬和吉娃娃犬)会继承这些成员。这意味着程序员只需要将相同的代码写一次。
在伪代码中我们可以这样写:
类牧羊犬:继承狗定义莱丝是牧羊犬莱丝.吠叫() /* 注意这里调用的是狗这个类的吠叫方法。/
回到前面的例子,“牧羊犬”这个类可以继承“毛皮颜色”这个属性,并指定其为棕白色。而“吉娃娃犬”则可以继承“吠叫()”这个方法,并指定它的音调高于平常。子类也可以加入新的成员,例如,“吉娃娃犬”这个类可以加入一个方法叫做“颤抖()”。设若用“牧羊犬”这个类定义了一个实例“莱丝”,那么莱丝就不会颤抖,因为这个方法是属于吉娃娃犬的,而非牧羊犬。事实上,我们可以把继承理解为“是”或“属于”。莱丝“是”牧羊犬,牧羊犬“属于”狗类。因此,莱丝既得到了牧羊犬的属性,又继承了狗的属性。 我们来看伪代码:
类吉娃娃犬:继承狗开始 公有成员: 颤抖()结束类牧羊犬:继承狗定义莱丝是牧羊犬莱丝.颤抖() /
错误:颤抖是吉娃娃犬的成员方法。 */
当一个类从多个父类继承时,我们称之为“多重继承”。如一只狗既是吉娃娃犬又是牧羊犬(虽然事实上并不合逻辑)。多重继承并不总是被支持的,因为它很难理解,又很难被好好使用。

具备封装性(Encapsulation)的面向对象程序设计隐藏了某一方法的具体执行步骤,取而代之的是通过消息传递机制传送消息给它。因此,举例来说,“狗”这个类有“吠叫()”的方法,这一方法定义了狗具体该通过什么方法吠叫。但是,莱丝的朋友并不知道它到底是如何吠叫的。
从实例来看:
/* 一个面向过程的程序会这样写: /定义莱丝莱丝.设置音调(5)莱丝.吸气()莱丝.吐气()/ 而当狗的吠叫被封装到类中,任何人都可以简单地使用: */定义莱丝是狗莱丝.吠叫()
封装是通过限制只有特定类的对象可以访问这一特定类的成员,而它们通常利用接口实现消息的传入传出。举个例子,接口能确保幼犬这一特征只能被赋予狗这一类。通常来说,成员会依它们的访问权限被分为3种:公有成员、私有成员以及保护成员。有些语言更进一步:Java可以限制同一包内不同类的访问;C#和VB.NET保留了为类的成员聚集准备的关键字:internal(C#)和Friend(VB.NET);Eiffel语言则可以让用户指定哪个类可以访问所有成员。[1]

多态(Polymorphism)是指由继承而产生的相关的不同的类,其对象对同一消息会做出不同的响应。例如,狗和鸡都有“叫()”这一方法,但是调用狗的“叫()”,狗会吠叫;调用鸡的“叫()”,鸡则会啼叫。
结束定义莱丝是狗定义鲁斯特是鸡莱丝.叫()鲁斯特.叫()
这样,虽然同样是做出这一种行为,但莱丝和鲁斯特具体做出的表现方式将大不相同。多态性的概念可以用在运算符重载上,本文不再赘述。

抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,并且可以在最恰当的继承级别解释问题。举例说明,莱丝在大多数时候都被当作一条狗,但是如果想要让它做牧羊犬做的事,你完全可以调用牧羊犬的方法。如果狗这个类还有动物的父类,那么你完全可以视莱丝为一个动物。

5.面向对象开发的特征


6.面向对象的五大基本原则


7.为什么需要面向对象方法


(1)面向对象的方法更接近于人类的自然思维。人类在认识和理解现实世界中普遍运用的三个构造法则是区分对象及其属性、区分整体对象及其组成部分、区分及形成不同对象类。而面向对象正是基于对象及属性、类属及成员、整体及其部分这些概念基础之上的。因而它必然更容易被理解和运用。

(2)系统分析、系统设计及实现之间采用同样的角度看待问题甚至同样的表示方法来描述间题,它们之间的连接是自然的无缝连接。

(3)面向对象的方法将对象的属性及服务视为一个整体。

这更符合客观世界的规律,从而使其理解与实现起来更加容易,进一步减少维护的费用。

(4)继承的方法一方面符合客观世界的规律,一方面加强代码重用的可能性,以便提高软件的开发效率。

(5)信息隐蔽原理使系统在变化的环境中有良好的适应性,从而使整个系统更加稳定和易于维护。

总之,面向对象的方法一方面更易于人们理解并映射现实世界,另一方面可以提高软件开发效率、可靠性及可维护性。

8.面向过程和面向对象的区别


在知乎上看到一个答案,很精辟

一个程序要完成一个任务就相当于讲一个故事。
面向过程就是编年史
面向对象就是纪传史
对于复杂的程序/宏大的故事,事实都证明了 面向对象/纪传是更合理的表述方法。

编年史:按照时间线索
纪传史:按照人物线索

上一篇 下一篇

猜你喜欢

热点阅读