1.2 快速回顾面向对象技术的基础知识
随着对更新、更强大的软件的需求不断增加,如何快速、正确、经济地构建软件变得越来越重要。对象,更准确地说是构造对象的类,其本质上可以看作可重用的软件组件。对象包括日期对象、时间对象、音频对象、视频对象、汽车对象、人物对象,等等。就其具有的属性(例如名称、颜色和大小)和行为(例如计算、移动和通信)而言,几乎任何名词都可以表示为软件对象。相较于早期流行的软件开发技术(如“结构化编程”),现在的软件开发小组能够使用模块化、面向对象的设计和实现方法使软件开发更加高效。面向对象的程序通常更容易理解、检查和修改。
汽车作为对象
为了更好地理解对象及其内容,我们先从一个简单的类比开始。假设你想要驾驶汽车并通过踩下油门踏板进行加速。那么,在做这些事之前,必须要做哪些准备呢?首先,在开车之前,必须先要有人设计出汽车。类似于盖房子前需要先有房屋的设计蓝图,制造一辆汽车通常也需要先有工程图纸,而油门踏板的设计显然应该包含在其中。油门踏板对驾驶员隐藏了使汽车加速的复杂机制,就好像制动踏板“隐藏”了使汽车减速的机制、方向盘“隐藏”了使汽车转向的机制一样。这种“隐藏”机制使得人们在很少或根本不知道发动机、制动和转向部件如何工作的情况下,依然可以轻松地驾驶汽车。
但是,就好像我们不能在厨房的设计蓝图中做饭一样,我们也无法驾驶汽车的工程图纸。在开车之前,必须先按照汽车的工程图纸制造出汽车。一辆完整的汽车要有一个真实的油门踏板用于加速。但是,光有油门踏板是不够的,因为汽车不会自行加速,需要司机踩下油门踏板。
方法和类
我们通过上面的汽车示例来介绍一些面向对象编程的关键概念。在程序中执行任务需要使用方法,方法中包含有完成任务的程序语句。方法对用户隐藏了一些语句,就好像汽车的油门踏板对驾驶员隐藏了使汽车加速的机制一样。在Python中,一个称为类的程序单元包含完成类任务的一组方法。例如,表示银行账户的类可能包含一个可以将资金存入账户的方法,一个可以从账户中取出资金的方法,以及一个可以查询账户余额的方法。类在概念上类似于汽车的工程图纸,其中包含对油门踏板、方向盘等部件的设计。
实例化
正如在驾驶汽车之前必须根据工程图纸制造出汽车一样,首先要使用类构建对象,然后才能使用对象执行类中定义的方法来完成特定的任务。执行“使用类构建对象”操作的过程称为实例化,其中,对象称为类的实例。
重用
汽车的工程图纸可以被多次重复使用来制造多辆汽车,同样,也可以多次重复使用一个类来构建多个对象。此外,在构建新类和编写程序时重用已有的类可以节省时间和精力。因为已有的类和组件通常都经过了大量的测试、调试和性能调优,因此,重用也有利于构建更加可靠和有效的系统。可互换部件的概念对工业革命至关重要,同样,可重复使用的类对于由面向对象技术激发的软件革命也是至关重要的。
在Python中,通常会使用类似于搭积木的方法来创建程序。为避免重复工作,应该尽可能使用已有的高质量部件。这种软件重用技术是面向对象编程的主要优点之一。
消息和方法调用
驾驶汽车时,踩下油门踏板会向汽车发送消息以执行“加速”任务。类似地,要对象完成某个任务,也需要向对象发送消息,每条消息都要通过调用完成相应任务的方法来实现。例如,某个程序可能会调用银行账户对象的存入方法来增加账户的余额。
属性和实例变量
除了具有完成任务的能力之外,一辆汽车还具有许多属性,例如颜色、门的数量、油箱中的油量、当前速度、总里程数(即里程表读数)等。与能力一样,汽车的属性在其工程图纸(例如,里程表和燃油表)中也表现为设计的一部分。每辆车都有自己的属性,例如,每辆汽车都知道自己的油箱中有多少汽油,但不会知道其他汽车的油箱中还有多少汽油。
类似地,当在程序中使用一个对象时,每个对象也要具有自身的属性。这些属性被定义为对象所属的类的一部分。例如,银行账户对象具有余额属性,表示该账户中的钱数,每个银行账户对象都知道它所代表的账户中的余额,但不知道其他银行账户的余额。属性的值由类的实例变量指定。类(及其对象)的属性和方法密切相关,因此,类将它的属性和方法封装在一起。
继承
通过继承可以方便地创建新类。新类(称为子类)具有与现有类(称为超类)相同的特征,也可以在新类中重新定义这些特征,还可以在新类中添加属于自己的新特征。在汽车的类比中,“敞篷车”类的对象必然是更一般的“汽车”类的对象,但区别于一般“汽车”的地方在于敞篷车的车顶可以升高或降低。
面向对象的分析与设计
我们很快就会使用Python来编写程序,那么将如何创建程序代码呢?也许,像许多程序员一样,打开电脑并输入代码即可。这种方法可能适用于小型程序(如本书前几章要介绍的那些程序),但如果要创建一个控制大型银行的数千台自动柜员机的软件系统,该怎么办呢?或者,如果要组建一个由1,000名软件开发人员组成的团队来构建下一代美国空中交通管制系统,该怎么办呢?对于如此庞大和复杂的项目,不应该只是简单地坐下来开始编写程序。
要创建最佳的解决方案,应该遵循详细的分析过程,以确定项目的需求(即定义系统应该做什么),然后完成满足这些需求的设计(即指定系统应该如何运转)。理想情况下,在编写任何代码之前,需要首先完成需求分析和系统设计工作并仔细检查完成的设计(也应让其他的软件专业人员对设计进行审核)。如果这个过程涉及从面向对象的角度分析和设计系统,则该过程称为面向对象的分析和设计(Object-Oriented Analysis-and-Design,OOAD)过程。Python是面向对象的程序设计语言,使用这类语言可以进行面向对象编程(Object-Oriented Programming,OOP),因此允许我们采用面向对象的方式设计要构建的系统。