编程思想-面向对象

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.面向过程和面向对象的区别


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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • 面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的程...
    李序锴阅读 1,271评论 0 5
  • 1.面向对象编程: 1.0 为何要有面向对象编程: 很早之前程序员就发现,随着软件的日趋复杂与庞大,维护往往变成了...
    mind1949阅读 435评论 0 0
  • 1. OOP 指什么?有哪些特性 OOP指的就是面向对象程序设计(英语:Object-oriented progr...
    饥人谷_有点热阅读 264评论 0 0
  • 在老家,有“冬至大过年”的说法。一大早就会看见阿姆们为冬至的糍粑忙里忙外。家里一般都是奶奶做糍粑,其他人顶多...
    艾力儿阅读 228评论 4 6
  • 今天早晨6点钟准时起床,看了1个小时的书,7点半钟就开始工作了,8点钟的时候为工作搬一台机器,搬的过程中手滑了,机...
    周秀峰阅读 131评论 0 1