2012/10/11
.对象真正的威力不是继承,而是行为的封装。
.20世纪50年代的面向对象范式,
那时候的面向对象仅仅告诉开发者在需求语句中寻找名词,并将这些名词构造成程序对象。在这种范式中,封装仅仅被定义为数据隐藏,对象也只是被定义为包含数据及访问这些数据的东西。这样的观点有很大的局限性。它将开发者关注的焦点局限于如何实现对象。
3.面向对象范式之前:功能分解
需求总是变化的的。
4.处理变化:使用功能分解
5.副作用往往是最难被发现的BUG,所以如果你让一个函数接触太多的数据,在需求发生变化的时候,它往往就可能出现问题。
6.责任的转移。例子你是上课老师,当学生上完你的课,它们需要去另外一个课,但是它们不知道下一个课的位置。
<1>老师对每个学生都通知,查找它们的下一个课,查找它们的如何去。
<2>老师贴出从本教室到其他教室的路径,然后告诉学生,让它们自己去找地方。
这里就把责任转移。
7.面向对象范式
所有东西都聚集在对象,围绕对象—而非函数---组织代码。
使用对象的优点:可以定义对自己负责的行为。对象天生就知道自己的类型。对象内包含数据,让它知道自己的状态;对象内包含代码,让它可以适当地运行(做设计者希望他做的事)。
对象识别来自于对问题领域中实体的观察,通过观察这些实体需要做什么,我为每个对象确定它的责任。
什么是对象?最好是把对象想象拥有责任的东西。一个好的设计原则就是:对象应该对自己负责。并且这种责任能被清楚的定义出来。
.Flower的视角框架来观察对象:
从概念,一个对象是一系列责任。
从规格,一个对象是一系列被其他对象或该对象自己调用的方法。
从实现,一个对象是数据和方法。
不幸的是,人们往往只在实现层-代码和数据来考虑面向对象的设计,而忽略概念和规格。但是后者同样具有很大的威力。
. 对象拥有责任并且对自己负责。对象拥有责任并对自己负责。
所有它们很多东西不需要暴露给另外的对象。
。封装意味着任何形式的隐藏
。讲师不知道那些是普通学生,那些是毕业生(毕业生在去下一个教室前,要去做其他整理资料工作)。对讲师来说,学生的类型被隐藏(
我封装了学生的类型)
57页