《面向对象设计实践指南:Ruby语言描述》—第1章 1.4节 面向对象编程简介

1.4 面向对象编程简介
面向对象设计实践指南:Ruby语言描述

面向对象的应用程序由对象和它们之间传递的消息构成。其中,消息相对更为重要。但在本节的简介里(以及在本书的前面几个章节里),这两个概念都同等重要。

1.4.1 过程式语言
相对于非面向对象(或过程式)的编程来说,面向对象编程是面向对象的。依据这两种风格的差异来考虑它们很有意义。假设有这么一种通用的编程语言,它可用来创建简单的脚本。在这门语言里,你可以定义变量(即组成多个名称),并将这些名字与少量的数据相关联。一旦进行了分配,便可以通过引用这些变量来访问相关的数据。

与所有的过程式语言一样,这门语言只对少量固定集合的不同类型数据(诸如字符串、数字、数组、文件等)有所了解。这些不同类型的数据叫做数据类型。每一种数据类型都描述了某种非常具体的事物。字符串数据类型与文件数据类型是不同的。这门语言的语法还会包含许多内建操作,以完成某些对各种数据类型来说都很合理的事情,如字符串连接和文件读取。

因为创建了变量,所以你能够知道每一个容纳的内容是何种类型。哪些操作是可用的,你对这一点的期望都依托于你对变量数据类型知识的了解。往字符串里进行追加、使用数字进行数学计算、对数组进行索引、阅读文件等等,所有这些都是你所知道的。

每一种可能的数据类型和操作都已存在,所有这些内容都被构建在语言的语法里。这门语言可能允许你创建函数(将一些预定义操作以一个新的名字组合在一起),或者允许你定义复杂的数据结构(将某些预定义的数据类型组装成一个命名排列),但是你无法组成全新的操作或全新的数据类型。你所看到的内容便是你能得到的。

与所有过程式语言一样,在这门语言里的数据和行为之间都有一道鸿沟。数据是一回事,行为是与之完全不同的另一回事。数据被包裹在变量里,然后四处传递给行为(坦率地讲,可以对它做任何事情)。数据就像一个孩子,在每天早上行为都将其送至学校;当它离开你的视线后,你便无办法知道实际所发生的事情。对数据的影响是不可预知的,并且在很大程度上也是捉摸不定的。

1.4.2 面向对象语言
现在假设有另一门不一样的编程语言,它像Ruby一样是基于类和面向对象的。Ruby没有将数据和行为分裂成两个单独的部分(如两个绝不相遇的球体),它将这两者结合成为了一个事物(即对象)。对象拥有行为,也包含了可单独访问控制的数据。对象之间通过相互发送消息来调用彼此的行为。

Ruby有一个字符串对象,它没有字符串数据类型。处理字符串的操作都构建在字符串对象内部,而没有构建在语言的语法里。字符串对象各不相同,它们每一个都包含有属于自己的字符串数据;但是它们的行为又彼此很相似。每一个字符串都将其数据封装或隐藏起来,以便与外面隔离。每一个对象都要自己决定需要暴露多少数据。

因为字符串对象可以自己提供操作,所以Ruby没必要对字符串数据类型特别了解,它只需要提供一种通用的方式方便对象发送消息即可。例如,字符串能理解concat消息,因此Ruby没必要包含字符串连接的语法,它只需要提供某种方式,让一个对象可以将concat发送至另一个即可。

即便是最简单的应用程序也可能需要多个字符串、数字、文件或数组。事实上,虽然你可能偶尔会需要一个唯一、单独的对象,但更为常见的期望是需要产生一大堆的对象—它们拥有相同的行为,但却封装了不同的数据。

像Ruby那样基于类的OO语言允许定义类——它为构建相似对象提供了一个蓝图。一个类可以定义多个方法(定义行为)和多个属性(定义变量)。在响应消息时,方法会被调用。不同的对象可以定义具有相同名字的方法,Ruby会为发送来的任何消息查找和调用正确对象的合适方法。

在有了String类之后,你便可以用它来重复地实例化(或创建)新的字符串对象实例。每一个重新实例化的String都会实现相同的方法,并使用相同的属性名称,但每一个String对象都包含了它们自己个人的数据。它们共享相同的方法,因此它们都像是String。由于都包含不同的数据,因此它们又代表了不同的状态。

String类定义了一种类型,它远不只是数据那么简单。在知道某个对象的类型之后,你便可以对它将如何表现有所期待。在过程式语言里,变量都只有单一的数据类型。这个数据类型的知识允许你对哪些是有效的操作会有所期待。在Ruby里,一个对象可能有多种类型,其中任何一种都来自与它对应的类。因此对象类型的知识会让你对它能响应的消息有所期待。

Ruby提供了一系列预定义好的类。最可容易立即辨别出来的是与过程式语言所使用的数据类型相重叠的那些。例如,String类定义了字符串、Fixnum类是定义了整数。对于你所期望的一门编程语言应该提供的每一种数据类型,都有一个预先存在的类。不过,面向对象的语言是使用对象来构建自己的,这一点让事情开始变得很有意思。

那个String类(即创建新字符串对象的蓝本),其自身也是一个对象。它是Class类的一个实例。如同每个字符串对象都是String类的特定数据实例一样,每个类对象(如String、Fixnum等)也都是Class类的特定数据实例。String类会生成新的字符串,Class类会生成新的类。

因此,OO语言是开放式的。它们不会将你限制在一个很小的内建类型和事先预定义好的操作集合里。你可以创造出全新的属于自己的类型。每一个OO应用程序都会渐渐变成一门唯一的编程语言,它专属于你的领域。

这门语言最终带给你的是快乐,还是痛苦,都与设计有关,而这也正是本书关注的内容。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

时间: 2017-05-02

《面向对象设计实践指南:Ruby语言描述》—第1章 1.4节 面向对象编程简介的相关文章

《面向对象设计实践指南:Ruby语言描述》目录—导读

内容提要 面向对象设计实践指南:Ruby语言描述 本书是对"如何编写更易维护.更易管理.更讨人喜爱且功能更为强大的Ruby应用程序"的全面指导.为帮助读者解决Ruby代码难以更改和不易扩展的问题,作者在书中运用了多种功能强大和实用的面向对象设计技术,并借助大量简单实用的Ruby示例对这些技术进行全面解释. 全书共9章,主要包含的内容有:如何使用面向对象编程技术编写更易于维护和扩展的Ruby代码,单个Ruby类所应包含的内容,避免将应该保持独立的对象交织在一起,在多个对象之间定义灵活的接

《面向对象设计实践指南:Ruby语言描述》—第1章 1.3节设计行为

1.3 设计行为 面向对象设计实践指南:Ruby语言描述 随着常见设计原则和模式的出现与传播,所有的OOD问题可能都已被解决.既然基础的规则都已知道,那么设计面向对象的软件还会有多难呢? 事实证明,它非常难.如果将软件理解为可定制的家具,那么原则和模式便像是木工的工具.了解软件在完成后会是什么样子,并不能让它自我构建成那个样子.应用程序之所以存在,是因为有程序员使用了这些工具.最终的结果可能是,它要么成为一个漂亮的橱柜,要么成为一张摇摇晃晃的椅子.具体是哪一种结果,则取决于程序员使用设计工具的经

《面向对象设计实践指南:Ruby语言描述》—第1章 1.1节设计赞歌

第1章 面向对象设计 面向对象设计实践指南:Ruby语言描述 世界是过程式的.时间不停在向前流动,而事件也一个接一个地逝去.你每天早上的过程或许就是:起床.刷牙.煮咖啡.穿衣,然后上班.这些活动都可以使用过程软件来建模.因为了解事件的顺序,所以你可以编写代码来完成每一件事情,然后仔细地将这些事情一个接一个地串在一起. 世界也是面向对象的.与你互动的对象可能包括有你的老伴和猫,或者是车库里的旧汽车和一大堆的自行车零件,又或者是你的那颗扑通跳动的心脏,以及用来保持健康的锻炼计划.在这些对象中,每一个

《面向对象设计实践指南:Ruby语言描述》—第1章 1.2节设计工具

1.2 设计工具 面向对象设计实践指南:Ruby语言描述 设计可不是遵循一套固定规则就完事的动作.它是每次沿着一条分支前进的旅行,在这条路径上早期的选择关闭了某些选择,同时又会打开其他新的选择.在设计过程中,你会徘徊于各种错综复杂的需求中,这里的每个关键时刻都代表着一个决策点,它会对将来产生影响. 像雕塑家有凿子和文稿一样,面向对象的设计师也有自己的工具-原则和模式. 1.2.1 设计原则 SOLID原则首先由Michael Feathers提出,再由Robert Martin进行了推广.它代表

《面向对象设计实践指南:Ruby语言描述》—第1章 1.5节小结

1.5 小结 面向对象设计实践指南:Ruby语言描述 如果某个应用程序存活了很长时间(也就是说,如果它成功了),那么它最大的问题将是如何应对变化.通过代码编排有效地应对变化是设计的事情.最常见的设计要素是原则和模式.不幸的是,即使正确地运用了原则,并且也恰当地使用了模式,也无法保证能够很好地创建出易于更改的应用程序. OO度量能暴露出应用程序在遵循OO设计原则方面的情况.糟糕的度量值强烈地表明将来可能会遭遇困难:不过,好的度量值也发挥不了太大的作用.一个做法有问题的设计也可能产生出很高的度量值,

《面向对象设计实践指南:Ruby语言描述》—第8章 8.1节组合对象

第8章 组合对象 面向对象设计实践指南:Ruby语言描述 组合(composition)是指将不同的部分结合成一个复杂整体的行为,这样整体会变得比单个部分的总和还要大.例如,音乐就是组合而成的. 你可不能将软件当作是音乐,那只是一种类比.贝多芬的第五交响曲乐谱是一长串独特而又独立的记号.你只听一遍就会明白:尽管它包含的是一些记号,但它不是记号.它是另一回事. 你可以按同样的方式来创建软件,使用面向对象的组合技术来将简单.独立的对象组合成更大.更复杂的整体.在组合过程中,较大的那个对象通过"有一个

《面向对象设计实践指南:Ruby语言描述》—第8章 8.2节组合成Parts对象

8.2 组合成Parts对象 面向对象设计实践指南:Ruby语言描述 很明显,零件列表会包含一长串的单个零件.现在应该添加表示单个零件的类了.单个零件的类名显然应该为Part.不过,当你已拥有一个Parts类时,引入Part类会让交谈变得很困难.当同样的这个名字已经用于指代单个的Parts对象时,使用"parts"一词来指代一堆的Part对象很容易让人感到困惑.不过,前面的措辞说明了一种会顺带引起交流问题的技术.当在讨论Part和Parts时,你可以在类名之后带上"objec

《面向对象设计实践指南:Ruby语言描述》—第8章 8.3节制造Parts

8.3 制造Parts 面向对象设计实践指南:Ruby语言描述 回顾一下上面的第4-7行.那些Part对象存放在chain.mountain_tire等变量里面.它们都是很久以前创建的,你可能已经把它们给忘了.请仔细想想这四行所代表的知识主体.在应用程序里的某个地方,会有对象必须要知道如何创建这些Part对象.而在上面的第4-7行,在那个地方必须要知道与山地自行车一起的这四个特定对象. 这里包含了很多的知识,它很容易在应用程序里泄漏掉.这种泄漏情况,既不幸也没必要.虽然有很多不同的单个零件,但有

《面向对象设计实践指南:Ruby语言描述》—第8章 8.4节组合成Bicycle

8.4 组合成Bicycle 面向对象设计实践指南:Ruby语言描述 下面的代码展示了Bicycle使用组合的情况.它展示了Bicycle.Parts.PartsFactory,以及针对公路和山地自行车的设置数组. Bicycle有一个Parts,而Parts依次有一个Part对象集合.Parts和Part都可以以类形式存在,但包含它们的对象会把它们当成角色.Parts是一个扮演Parts角色的类,它实现了spares.而Part的角色则由OpenStruct扮演,它会实现name.descri