面向对象设计的核心问题——从问题域决定一组正确的抽象!
抽象的意义
抽象的定义:对一个系统的简单描述。即:强调系统中某些细节或属性,同时抑制另一些细节或属性。(只关注需要关注的,忽略不需要关注的)
首先,抽象要描述一个对象的基本特征,其次,为了能将这个对象与其他类型对象区分开来,还需要定义清晰的概念边界
(抽象与观察者的视角有关)
抽象关注一个对象的外部视图。
最少承诺原则:对象的接口只提供它的基本行为,此外别无其他。
最少惊奇原则:抽象扑捉了某个对象的全部行为,不多不少,并不提供抽象之外的惊奇效果和副作用。(比如一只猫,可能觉得它很可爱,其实可爱跟它毫无关系是外部的惊奇效果)
客户对象:使用其他对象资源的对象。(调用其他对象方法的对象,相对于被调用者的说法)
编程契约模型:每个对象的外部视图定义了一份契约,其他对象可以依赖这份契约,而该对象则需要通过它的内部视图来实现这份契约。
【客户对象只关心这份契约,被使用的对象(服务器对象)通过内部视图完成契约的实现】
这份契约的每个操作都应该有一个唯一的签名——(参数列表,返回值)
抽象思想的核心:不变性
不变量是指在某种布尔条件下,它的值必须保持不变。
对于对象的每个操作,可以定义”前置条件“(操作假定的不变量)和”后置条件“(操作满足的不变量)
如果违反前置条件:意味着客户没有完成它的那部分责任,因此服务器不可能可靠的执行。
如果违反后置条件:意味着服务器没有完成它的那部分责任,因此客户不能再信任服务器的行为。
出现异常表明某种不变量没有满足或不能满足。
所有抽象都具有静态和动态的属性
对一个事物进行抽象时,关注点应该集中在:
1:重要特征 (需要关注的属性、特征) 【属性】
2:责任 (需要关注的行为) 【方法】
注意:抽象有可能随着项目的生命周期而演进。单一的责任可能变成多种使用不同的责任。
例如:一架飞船拥有“前进”的功能。但是具体实现前进的对象可以是轮胎、火箭推动器甚至反重力系统。
也就是说一个抽象的某一责任的具体实现,可以作为另一个抽象的责任。这样可以在不同逻辑部分之间,创造一种清楚的“分离关注”,从而减小单个抽象的概念规模。
所以:没有对象是孤立的,每个对象都与其他对象协作,来实现某些行为。(没有对象是孤岛)
总结: 抽象关注的是——对象可以观察到的行为。
抽象——“帮助人们思考他们做什么”。