《UML和模式应用》读书笔记 2:心得体会
Conceptual Class:
1、 创建conceptual class 比 association 更重要
conceptual class 定义了场景的角色,只有存在合适的角色,才会存在良好的association,conceptual class 在model中起到核心的作用。
2、 利用 conceptual class catalog 发现conceptual class
因为概念在现实生活中是普遍存在的,常见事物的存在模式能告诉你需要什么class。
3、 利用association 发现conceptual class
事物之间的关联隐含了事物之间的互动关系,从而帮助发现关联的class
4、 利用 Interaction Diagram (important)
Interaction Diagram 的作用容易被忽视,实际上它起到了很重要的作用。
通过Sequence Diagram 和 Collaboration Diagram 的分析,将对象之间消息的传递过程明确的标识出来,消息的传递可以帮助发现缺少的角色,而那可能就是你需要创建的conceptual class。
Arribute:
对象的属性要简单,不简单的属性可能是一个类,而不是对象。
简单的属性就是例如字符串,数字,时间日期之类的直接原始的东西。
不要把对象的属性作为其他对象的“外键”来和其他对象沟通,应该通过对象引用来进行对象的互动。
Responsibility:
对象的职责的赋予是一门重要的技术,目的就是为了设计出高内聚、低耦合的良好互动的类来。
GRASP 九种pattern:
1. Expert Information:
对象的职责首先要看这个对象知道些什么,也就是对象掌握的信息,因为对象掌握了这些信息,从而具有了相关的行为。
研究对象之间的互动能够帮助明确对象的职责,一条消息发到对象,对象就是消息的处理者,处理这个消息是谁的职责就必须考虑,结合信息原则,分析消息在对象间的处理和转发,职责归属在这个过程中就被确定下来了。
2. Creator
创建者(creator)是经常会用到的对象模式,因为要使用一个对象必须要先建立这个对象,这个工作由创建者来完成。创建者一般由两个对象的关联方式来决定,A是B的一部分或者一个元素,那么A就应该是B的创建者,另外,创建者模式也符合信息原则,如果我知道要创建一个对象的所有信息,那么我就应该是这个对象的创建者。
3,4. cohesion and coupling
对象的内聚和耦合是阴阳互生的关系,高内聚和低耦合常会同时出现,这是因为他们具有相互影响的内在关系。高内聚意味着对象职责单一明确,这样的话就有利于对象间通过窄接口来访问,减小了彼此的依赖性。因为大家都对自己高度负责,都如同专家,所以能形成一个专业明确的互动关系,从而减少了不必要的开销。耦合关系是必要的,低耦合不等于没有耦合,因为完全解耦会导致某个对象承担了过多的职责来做解耦对象的中介者。耦合关系适合在关系密切的对象之间建立,他们有很强的依赖,而且依赖相对固定,变化小。但是如果关系经常变化的话,那么就要考虑解耦了。
5. controller
控制器(controller)在处理系统行为的上起到一个协调的作用,系统消息发过来,确定由谁负责处理,这就是controller的作用。控制器常常被用来用户界面和程序model之间搭桥,MVC就是典型的例子,通过controller将model和view解耦,使得model和view没有直接的关联,所以获得了自由度。
6. Polymorphism
利用 Polymorphism 多态处理变化, 多态的关键是不问type,即不对对象的类型做判断,generic的方式去处理。
但是多态的运用一定要注意变化性是不是只是自己设想,多态可以增加灵活性,但是同时增加了复杂性,考虑后再使用。
7. Pure Fabrication
虚拟对象一般没有在Domain Model 里面出现,因为Domain Model的目的所主要是缩小模型与现实之间的表达差异,把现实中的对象直接映射到模型中来,但是Pure Fabrication是一种虚拟的对象,不是一个实体概念,它表示的是一种行为上的抽象和分离,例如Comparator,它定义的是比较的行为,在实体模型中间找不到对应物,因为现实里面没有比较体这个东西,但是这种虚拟对象的目的就是将行为本身定义成一个对象,使得行为从实体里面分离出来,从而可以集中手段和方法处理某一个特定的问题。
但是过多的不适当的运用Pure Fabrication也会带来问题,就是职责的内聚性被弱化,耦合性加强了。因为根据Expert Information原则,对象的职责由所它掌握的信息决定,这样有利于职责集中化,但如果对象将太多的行为职责委托给第三方行为对象来处理,就直接增加了对行为对象的依赖,增加了耦合,同时职责分离出去,又降低了内聚。
8. Indirection
转向的目的是解耦,将需要做的事以某种方式转出去,如Adaptor,Indirection的作用就是让真正的实现者和调用者之间脱离了直接的联系。很多Pure Fabrication就是通过indirection来达到行为分离的目的。
9. Protected Variations
简写为PV,保护变化点 是很重要的原则,它基本的要求就是隐藏----'不要和陌生人说话', 与熟悉的对象进行交谈,就是和自己有直接关联作用的,不要跨过其他对象去和另外一个对象交谈,这样会破坏了信息的封装,增加依赖性。例如
Money amount = sale.getPayment().getTenderdAmount()
Sale就与Payment这个不熟悉的陌生对象发了getTenderdAmount的消息,导致隐藏性被破坏。
Interaction Dialgram:
Interaction Dialgram很多程序员都当成是随便对待一下的东西,那是因为程序员对待文档,图表一类的东西向来是不太感冒,写代码还要画图似乎多此一举,书中作者指明这是错误的。
我们是在用对象设计系统,一个系统功能的实现就是你的很多对象之间协作产生的结果。所以对象的协作和互动搞不清楚,怎么清晰的实现这个功能呢。
互动图的作用就在于此,它将对象的互动关系明确的标识出来,每个涉及的参与者都在其中,每条消息都有始有终并且有顺序号或者顺序图来表示,那么消息被处理和被转发的过程就明朗了。我们利用这个图就可以帮助实现类的代码:确定对象的初始化值,确定对象的方法。
Subclass:
怎样创建子类:
100%原则: 子类要100%遵守超类的attributes和associations.
Is-a原则: subclass is a superclass
将子类分出去的动机:
1. 子类有附加的属性和兴趣
2. 子类有附加的关联
3. 子类的表示一种行为,这个行为和超类有不同的地方
4. 子类操作处理方法和超类不同
Aggregation:
聚合关系分为:composite aggregation, shared aggregation,组合的和共享的。
识别Aggregation的方法: 整体的变化影响到部分(part),整体的创建和消失影响到部分的存在,对整体的操作影响到部分。
Derived Element:
派生的attribute不要显示在图表中,因为没有带来更多的新的信息。
Package:
Architectual Pattern: