类对象,对自己的行为负责。
对象对自己的行为负责。
思考,软件要负责什么?
思考,怎么使用软件?
思考,软件怎样履行自己的责任?
面向对象,以对象为中心,以对象概念为中心。
对象的数据,能告诉对象当前的状态,对象的方法,能让对象履行自己的责任。
对象,自己对自己负责,并且非常清楚的知道自己的责任。
【类型】往往体现了,继承关系。继承关系,体现的就是IS-A的关系。男人是人,女人也是人。
面向对象,将不关心的数据或行为,进行隐藏,抽象类,接口就隐藏了,具体的实现,调用者根本不关心你是具体实现的那个类型。
所以,从概念层次思考,我们经常说,我不关心你怎么实现,我只要调这个接口就可以了,这时候,就需要考虑隐藏,通过抽象类,或接口。
请记住,我们要完成什么样的任务?把任务写下来分析。
分析什么?
分析可能的对象,和责任。
【构造函数】设置默认状态,设置与其他对象关系。
UML
用例图,活动图,交互图,类图,状态图,部署图。
【类图】
IS-A 继承一种
HAS-A 关联,包含(聚合,组合)
使用依赖关系,A使用了B,A依赖B
思考,问题领域的术语,写出来,列一个表。
思考,问题的重要特征,写出来,列一个表。
通常能非常容易看清的是,分类,类型。
生活问题,不要过早的关注细节。
按接口编程。
使用聚合代替继承。
找出变化并封装。
外观模式facade
考虑的是封装,隐藏。为多个子系统提供简单统一的调用接口,为某个系列操作创建一个简单接口。比如读数据库最后返回数据模型,这个就可以用泛型写一个简单T GetTable 的接口。
外观,就像人传衣服一样,要好看,就是接口要简单,清晰,漂亮。
思考
(1)希望封装,隐藏原系统
(2)添加新功能
(3)使用部分功能
(4)原系统调用太复杂
Adapter适配器,在类内部进行转换,体现的是接口不兼容,需要接口转换。
为什么会接口不兼容,因为设计者不一样。
适配器 和 外观 比较:
(1)是否存在既有的类?(是,是)
(2)是否必须按某个接口设计?(是,否)
(3)多态行为?(可能,否)
(4)需要更简单的接口(否,是)
说白了,一个是按兼容接口,一个是简化接口。
对象,是具有责任的东西。
面向对象的封装,体现的是一种隐藏的哲学,将复杂的东西隐藏,给外界简单的东西,将不关心的东西隐藏,只提供抽象的接口给外界,将保密的东西隐藏,不让外界看见。
对象,
传统观点,认为是具有方法的数据,对象有状态数据,有处理数据的方法。这种观点是从实现的角度理解。
现代观点,对象是具有责任的实体,关注对象的意图行为。这种观点是从概念的层次进行理解。
设计对象时,避免过早的思考细节,将细节隐藏,关注对象的公开接口。
有一个XXX对象,能做什么,还能做什么,写出来。
封装,
隐藏数据,
隐藏实现细节,
隐藏派生类,
隐藏设计细节,
隐藏实例化规则
数据的封装,对象状态
方法的封装
对象的封装,如适配器模式,对被适配对象的封装
类型的封装,使用父类作为接口参数,对具体子类进行隐藏,
里氏替代原则,说的是子类可以替代父类,说白了,就是要求针对抽象编程,针对接口编程,典型的就是方法的参数,尽量用父类,不能用具体子类。
从概念层次,看继承,五角星是形状。
从复用的层次,看继承,虚线边框的五角星,是五角星。
【复用层次的继承】问题很明显,为了复用而创造一个子类型,思考自己,复用的目地,意图是什么?反思,如果更多的类似的目地,意图,你是不是为了复用而需要创造出更多的子类型?那么问题,就来了,子类多了,内聚低,重复代码多,维护就难了。
注意思考,一个对象字段,和,一个整型字段。
其实面向对象中一切都是对象,这没啥区别,例如,x+y 实际上可能是对象 x.Add(y)
对象x的行为责任
但是,如果是一个我们写的对象字段,字段对象可以扩展,包含更多的对象字段或整型字段,进一步再包含更多对象字段和整型字段。
但是,请记住,对象字段,需要从概念层次思考自己的行为职责。整型字段的行为职责实际上是语言帮你完成了。
【问题领域】
找到变化的地点,共性分析。
找到如何变化的,变性分析。
编程实践,一次且仅一次规则
小方法,方法粒度小些
极限编程,测试驱动开发,重构,这些都是围绕,以前的开发模式,提出的位于,过度设计,和,不设计,之间的边开发边设计的开发模式。
针对接口编程,而不是针对实现。
优先使用组合,而不是继承。
用组合替代继承,本质是让你在该使用继承的地方才使用继承。
如果为了复用的目地,盲目的使用继承,是非常糟糕的。但是,如果从概念层次去思考继承,原本可能从一个大类继承复用,现在这个大类包含一个对象,也就是使用组合,这个对象,是概念层次的,变化点,对变化点进行共性分析,变性分析,形成变化点,小范围的继承体系结构。
这样构造的系统,才是职责分离,职责明确的。
网友评论