第01章 面向对象的编程
1.1 对象的概念
1.1.1 面向功能的软件设计的局限性
面向过程的程序设计语言主要使用顺序、选择和循环三种基本结构来编写程序。
在面向对象技术问世之前,程序设计被看为一个个功能系统的集合。程序员根据设计文档实现各个函数,完成目标软件。所以,那个年代软件开发最关心的是如何从需求中提取出要实现的功能,决定数据格式,并将其组合在一起。简而言之,整个系统设计的过程就是将需求分解成一个个小的功能,同时定义每个功能所需要的数据格式。
但是软件的核心是功能,而需求又非常容易变更,所以围绕功能设计软件,会比较难与对应需求的变更,维护成本会比较高。
1.1.2 面向对象的模块化
面向对象(object-oriented)中,对象(object)指的就是人能够识别的东西。而且,对象具有属性(attribute),并且能够接收消息(message)来进行相应的处理。属性指的是对象的性质和所具有的信息。属性也可以称为状态。消息是指对象与对象之间的信息传递。
object |ˈɒbdʒɪkt| noun 物品、对象、目的。
orient |ˈɔːrɪənt| verb 使朝向、使适应。
attribute |ˈætrɪbjuːt|noun 属性、标志。
面向对象的编程指的是,以对象作为程序的基本模块来进行软件的分析、设计和开发的一种思考方法。
基于面向对象的软件开发,比较接近于人的思考方式,更善于应对需求变更。
1.1.3 消息传递
消息是对象之间通信的唯一手段。请求、查询、应答和异常通知等,所有的通信和控制都是通过收发消息完成的。
通过消息协调各个对象的运作,使其作为一个整体运行,这就是面向对象的软件的运行模式。
1.1.4 模块的抽象化
综上所述,具备以下特征的东西可称为对象。
可认为分辨出这是一个对象
拥有属性
能够向其他对象发送消息,能够接收消息,并作出相应的处理
消息的处理是通过对象的方法完成的
像这样使用对象的概念对问题进行抽象化的方法叫做面向对象。
使用对象的概念来分析如何做一个软件叫做面向对象的分析(OOA,Object-Oriented Analysis)。
以对象为基础来设计软件叫做面向对象的程序设计(OOP,Object-Oriented Design)。
编程过程中使用面向对象的概念叫做面向对象的程序设计(OOP,Object-Oriented Program)。
通过使用面向对象的语言,可在面向对象的分析和设计的基础上来编程。它不像传统的以功能为核心的软件开发,需要明确指明每个函数所对应的功能。面向对象的软件开发,从需求分析、设计到编程都适用统一的模型,以及善与应对需求变更。
抽象化(abstraction)指的是尽可能地不考虑相关细节,只关注对象的核心和本质。通过抽象可以用简单概念的集合来描述一个复杂的对象,这是非常重要的。
1.1.6 类
我们可以把相同变量和方法的对象提炼出来,做成“模块”。这样以后就可以使用“模版”来创建具体的对象。这种“模版”就是类(class)。
类包含了一组特定对象的共有特性。
用类创建对象的过程叫做实例化(instantiation),生成的对象叫做实例对象(instance object),或简称为实例(instance)。
instance |ˈɪnstəns| noun 情况、例子。
实例所拥有的变量称为实例变量(instance variable)。
Cocoa是Mac OS上面应用软件的核心类库。Cocoa API中开头的“NS”,就是NextStep的缩写。
1.2 模块和对象
1.2.1 软件模块
模块是工业制品中的概念,指的是整体的一部分,它具备独立的功能,更换是不会影响其他部分,例如电源模块。
软件开发的模块也是一个功能单位,构成一个软件的各个相互独立的部分叫做模块。一个模块由变量、方法甚至其他模块构成。所有模块具有层次性。
1.2.2 高独立性的模块
独立性高(低耦合、高内聚)的模块划分是最佳的划分方式。
如果一个模块中实现的内容需要参照其他模块的内容才能理解,或一个模块发生变动之后其他模块需要相应地改变,这样的模块就是独立性比较差的模块。
1.2.3 模块的信息隐蔽
模块独立性的划分原则是只对外提供做小限度的接口信息,内部实现不对外公开。也就是把模块做成一个黑盒子(black box)。
这个原则叫做信息隐蔽(information hiding)或封装(encapsulation)。
capsule |ˈkæpsjuːl, American ˈkæpsl| noun 胶囊、航天舱。
encapsulate |ɪnˈkæpsjʊleɪt| verb 概括、包含。
1.2.4 类的定义和接口
类是由实例变量和方法构成,所以类的定义中包含了实例变量和方法的定义。
对象的使用者只关心到底该如何使用这个对象,而不关心他的内部实现。
类公开给外部的、关于如何使用这个类的信息叫做接口(interface),接口中定义了这个类所包含的实例变量和可接受的消息。