美文网首页
编程思想-面向对象

编程思想-面向对象

作者: Simba_LX | 来源:发表于2016-10-26 15:19 被阅读183次

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.面向对象开发的特征


  • 封装性。面向对象方法中,程序和数据是封装在一起的,对象作为一个实体,其操作隐藏在方法中,其状态由对象的"属性"来描述,并且只能通过对象中的"方法"来改变,从外界无从得知。封装性构成了面向对象方法的基础。因而,这种方法的创始人Codd和YOuMn认为,面向对象就是"对象+属性+方法"。

  • 抽象性。面向对象方法中,把从具有共同性质的实体中抽象出的事物本质特征概念,称为"类"(Class),对象是类的一个实例。类中封装了对象共有的属性和方法,通过实例化一个类创建的对象,自动具有类中规定的属性和方法。

  • 继承性。继承性是类特有的性质,类可以派生出子类,子类自动继承父类的属性与方法。这样,在定义子类时,只须说明它不同于父类的特性,从而可大大提高软件的可重用性。

  • 多态。所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

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


  • 单一职责原则SRP(Single Responsibility Principle)
    是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。

  • 开放封闭原则OCP(Open-Close Principle)
    一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,
    那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。

  • 替换原则(the Liskov Substitution Principle LSP)
    子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,
    也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。

  • 依赖原则(the Dependency Inversion Principle DIP) 具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,
    这个时候,B不应当直接使用A中的具体类: 而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到
    了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。

  • 接口分离原则(the Interface Segregation Principle ISP)
    模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来

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


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

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

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

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

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

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

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

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


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

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

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

相关文章

  • 类与对象(1) - Class、Object

    面向对象编程思想 Java开发是利用 面向对象 的思想实现 面向过程 的开发。 面向对象编程(OOP:Object...

  • js高级 第一章

    JS面向对象编程 一、什么是面向对象思想(编程思想角度)? 现有的两种程序思想:面向过程和面向对象 1.面向过程...

  • python面向对象1

    编程思想 编程思想:面向过程编程(穷人思想)、函数式编程、面向对象编程(富豪) 面向过程编程: 算法和逻辑 函数式...

  • 何为面向接口编程

    面向接口编程不与面向对象编程同级,而是附属于面向对象编程思想,是面向对象编程思想的精髓之一。 定义 在系统分析和架...

  • 面向对象基础

    面向对象编程包括: 面向对象的分析(OOA) 面向对象的设计(OOD) 面向对象的编程实现(OOP) 面向对象思想...

  • python-day14

    一、面向对象编程 编程思想:1.面向对象编程 --> 算法,逻辑2.函数式编程 --> 函数3.面向对象编程 ...

  • JavaScript学习笔记(一)

    Javascript面向对象 1. 面向对象编程介绍 1.1 两大编程思想 面向过程 & 面向对象 1.2 面向过...

  • JavaScript 面向对象入门

    面向对象的概念 1、概念: 从编程思想角度理解:面向过程的编程思想,关注解决问题的步骤;面向对象的编程思想,关注...

  • 编程思想

    编程思想 面向对象编程 OOP:Object-Oriented Programming(面向对象编程) 字段 fi...

  • Day14 面向对象基础

    一.编程思想 编程思想: 面向过程编程(穷人思想), 函数式编程, 面向对象编程(富豪) 1.求1+...+100...

网友评论

      本文标题:编程思想-面向对象

      本文链接:https://www.haomeiwen.com/subject/lfuduttx.html