1.对象
是独有定义良好责任的东西,对象应该对自己负责,自己的事情自己干!
◆例子: 当我们需要定义一个类的责任的时候我们需要考虑这个类是不是应该有这些责任。比如有一个Teacher类。Teacher有下面的责任:教书,科研等。现在我们有Student类,那么他的责任有:学习等,那么现那么现在当Teacher有一件事情要宣布的时候,比如:现在到另外一个地方去机上操作。那么这个责任应该是Teacher的呢,还是Student的?我们应该思考,我们将会构建的Teacher这个类是不是应该有责任去告诉学生到某个地方上机呢?
interface Teacher{
void teach();
void research();
void notifyStudents();//你觉得教室应该有这个责任吗?
}
interface Student{
void study();
}
当你在封装这个对象的时候,假设我们有不同的Student,我们有Graduated & Regular Student.并且他们对去机上操作有不同的处理逻辑。那么notifyStudents()是不是应该知道Student的信息呢?恩一个对象需要知道另外一个对象的信息才能知道如何实例化,这是违背OO Design的。那么实际上我们应该由学生自己来负责这个责任,学生有责任知道自己怎么去机上操作,怎么操作等,也有责任去实现自己的工作。
改后的封装:
interface Teacher{
void teach();
void research();
//void notifyStudents();//责任转移
}
interface Student{
void study();
void go2NextRoom();//学生的责任
}
2.封装
封装不是仅仅是狭义上的实现数据的隐藏。封装还包括下面的性质:
※数据的隐藏。
※类隐藏(隐藏在抽象类和接口背后)。
※实现隐藏。比如我们的Adapter Pattern,在系统中应用他也是把Adapter隐藏起来。
好处,开发者可以很轻松的对系统进行的实现进行扩展,因为原来的实现对开发者而言是不可见的,扩展不会对原来的系统造成影响,符合OCP原则。
3.发现并封装变化点--使用共同点/变化点分析抽象出行为和数据中的变化点。
Allan认为对一个问题的分析应该分为三个层面,从三个视角去看
●概念视角--我们对问题领域的理解,上面的:我们需要实现教室教学和科研,学生学习和机上操作。
●规格视角--类。
●实现视角--数据和方法。
概念视角定义我们对象必须做什么,实现视角是我们有足够信息之后的实现,而规格视角是我们联系概念视角和实现视角的桥梁,定义了概念视角对外的接口。
4.针对接口进行设计。
5.把继承考虑为一种封装变化的方法,而不是为对象制造特例情况。
More Important!
6.讲变化点封装在一个类中,并使之与这个类中其它变化点相分离。
7.力求松耦合。
8.力求高内聚。
9.绝对细心地使用"一次并仅有一次"规则。
10.优先使用对象组合而不是继承。
未完--待补充!
是独有定义良好责任的东西,对象应该对自己负责,自己的事情自己干!
◆例子: 当我们需要定义一个类的责任的时候我们需要考虑这个类是不是应该有这些责任。比如有一个Teacher类。Teacher有下面的责任:教书,科研等。现在我们有Student类,那么他的责任有:学习等,那么现那么现在当Teacher有一件事情要宣布的时候,比如:现在到另外一个地方去机上操作。那么这个责任应该是Teacher的呢,还是Student的?我们应该思考,我们将会构建的Teacher这个类是不是应该有责任去告诉学生到某个地方上机呢?
interface Teacher{
void teach();
void research();
void notifyStudents();//你觉得教室应该有这个责任吗?
}
interface Student{
void study();
}
当你在封装这个对象的时候,假设我们有不同的Student,我们有Graduated & Regular Student.并且他们对去机上操作有不同的处理逻辑。那么notifyStudents()是不是应该知道Student的信息呢?恩一个对象需要知道另外一个对象的信息才能知道如何实例化,这是违背OO Design的。那么实际上我们应该由学生自己来负责这个责任,学生有责任知道自己怎么去机上操作,怎么操作等,也有责任去实现自己的工作。
改后的封装:
interface Teacher{
void teach();
void research();
//void notifyStudents();//责任转移
}
interface Student{
void study();
void go2NextRoom();//学生的责任
}
2.封装
封装不是仅仅是狭义上的实现数据的隐藏。封装还包括下面的性质:
※数据的隐藏。
※类隐藏(隐藏在抽象类和接口背后)。
※实现隐藏。比如我们的Adapter Pattern,在系统中应用他也是把Adapter隐藏起来。
好处,开发者可以很轻松的对系统进行的实现进行扩展,因为原来的实现对开发者而言是不可见的,扩展不会对原来的系统造成影响,符合OCP原则。
3.发现并封装变化点--使用共同点/变化点分析抽象出行为和数据中的变化点。
Allan认为对一个问题的分析应该分为三个层面,从三个视角去看
●概念视角--我们对问题领域的理解,上面的:我们需要实现教室教学和科研,学生学习和机上操作。
●规格视角--类。
●实现视角--数据和方法。
与抽象类的映射 | 讨论 |
抽象类-->核心概念约束 | 抽象类表现与所有派生类捆绑在一起的概念,这个概念定义了派生类的共同点。 |
共同点-->抽象类使用 | 共同点定义了我们的抽象类 |
变化点-->抽象类的派生类 | 变化点定义了我们的派生类 |
规格-->抽象类的接口 | 在概念层次与抽象对应的接口 |
4.针对接口进行设计。
5.把继承考虑为一种封装变化的方法,而不是为对象制造特例情况。
More Important!
6.讲变化点封装在一个类中,并使之与这个类中其它变化点相分离。
7.力求松耦合。
8.力求高内聚。
9.绝对细心地使用"一次并仅有一次"规则。
10.优先使用对象组合而不是继承。
未完--待补充!