第一章:面向对象的编程
【对象的概念】
面向功能的软件设计局限性
面向过程的程序设计主要使用顺序,选择和循环三种基结构编写程序。
在面向对象技术之前,程序设计被看作为是一个个功能系统的集合。
围绕功能设计软件,比较难于应对需求的变更。
面向对象的模块化
面向对象的编程指的是,以对象为程序的基本模块进行软件分析,设计和开发的思考方法。
面向对象的编程更符合人的自然思考方式,也就是把动静结合的对象作为一个基本单位思考。
以预越高的(抽象)的视角看待系统,系统的结构越稳定。
消息传递
消息是对象间通信的唯一手段。
通过消息协调各个对象间的消息发送,使其作为一个整体运行,这就是面向对象的软件运行模式。
模块的抽象化
-
具备以下特征的东西可以称为对象
- 可认为的分辨出这是个对象
- 拥有属性
- 能够向其他对象发送消息 (发)
- 能够接受消息,并作出相应的处理 (收)
- 消息的处理是通过对象的方法完成的 (处理)
-
模块的统一性
抽象化:抓本质,挑我们想要的
人类对于事物的认知,也是个抽象化的过程。
OC和C++一样,并不把数字看作对象
面向对象编程,在台湾技术书籍又被称作面向物件编程(个人感觉更贴切)
对象的属性
对象的属性一般被定义为指向其他对象的指针,这个指针叫做实例变量或变量
变量可能指向空的对象(null)
变量不一定非得是指针,也可以是数值型
对象和对象之间一般通过一个对象的某个属性是另一个对象的变量来建立关系
没有关系的两个对象之间无法发送消息
OC把连接对象的变量成为
输出口(outlet)
各个对象间好像插口一样,互相连接在一起
类
- 把具有相同变量和方法的对象提炼出来,做成“模板”,这样以后就可以使用“模板”来创建各个具体的对象。这种模板就是
类(class)
类是为了推广对象的属性和功能,方便复制类似的对象
所有类都可以共享该类中定义的变量和属性
不同对象间的差异在于变量值的不同
用类创建对象叫做
实例化(instantiation)
不同实例对象的变量各不相同,或指向不同对象,或有不同的数值。
类决定了需要定义几个,定义什么类型的实例变量
类更关注what ,更抽象
方法是在类中统一定义的,同一个类不同实例对象的方法是相同的
【模块和对象】
软件模块
- 模块由变量,方法甚至其他模块构成,所以模块具有层次性
高独立的模块
独立性高(高耦合,低内聚)的模块划分是最佳的划分方式
模块之间的交集应该尽可能地小,这样,模块的内部无论如何变化,对其他模块的影响都能减到最小
一个独立的模块会把what和how清楚的分开
对于独立性高的模而言,我们只需要知道它所提供的功能就能良好的使用
独立性高的模块的声明和实现是分开的
只要声明一致,具体实现可以随时被更换成性能更高的实现
模块的信息隐蔽
只对外提供最小限度的接口信息,内部实现对外部公开,把模块做成一个黑盒
这个原则叫
信息隐蔽(information hiding)
,或封装(encapsulation)
模块调用方不需要了解模块的内部实现细节,只需按照约定好的接口来调用函数即可
类的定义和接口
对象是由类的定义来描述的
实例对象的在程序运行的时候动态生成的
类的定义和实现文件是构成程序的模块
类是由实例变量和方法构成的
对象的使用者只关心到底如何使用这个对象,而不关心它的内部实现
类公开给外部的,关于如何使用这个类的信息叫做
接口(interface)
接口定义了这个类包含的实例变量和可接收的消息
从类的外部也就是类的使用者的角度来看,只能看到接口中定义的信息,无法看到类内部的实现和数据定义等
- OC中类的定义把接口和实现分开写