细化阶段:迭代2 GRASP低耦合 问题来源:怎样降低依赖性,减少变化带来的影响,提高重用性? ■解决方案:分配一个职责给对象时,要保持对象间的低耦合度。减 少对象间的依赖性,从而减少变更带来的影响,提高对象的重用性。 耦合:测量一个元素连接、了解或者依赖其他元素的强弱尺度 使用高耦合性的类会出现的问题 如果类A和其他的类之间 关系简单一些就好了 修改A,会影响B,C,D? 想重用A,太麻烦!
细化阶段:迭代2 GRASP 低耦合 ◼ 问题来源:怎样降低依赖性,减少变化带来的影响,提高重用性? ◼ 解决方案:分配一个职责给对象时,要保持对象间的低耦合度。减 少对象间的依赖性,从而减少变更带来的影响,提高对象的重用性。 ➢ 耦合:测量一个元素连接、了解或者依赖其他元素的强弱尺度。 ➢ 使用高耦合性的类会出现的问题 A B C D 如果类A和其他的类之间 关系简单一些就好了! 修改A,会影响B,C,D? 想重用A,太麻烦!
细化阶段:迭代2 GRASP低耦合案例分析 ■考虑创建 Payment实例并使它与Sale关联。 问题:哪个类应负责这件事情呢? 方案1:现实世界中是POS机记录了 Payment,根据创建者原则建 议将Pos机作为 Payment的候选者。Pos机会把 addPayment消息发 送给Sae,并把新的 Paymen作为参数传递给它。 1: MakePayment o 2: crate o Cashier :POS机 Payment 3: addPayment (p) Sale 这种职责分配使得Pos机与 Payment之间产生了耦合, 即Pos机类必须知道 Payment类
细化阶段:迭代2 GRASP 低耦合 案例分析 ◼ 考虑创建Payment实例并使它与Sale关联。 ◼ 问题:哪个类应负责这件事情呢? ◼ 方案1:现实世界中是POS机记录了Payment,根据创建者原则建 议将Pos机作为Payment的候选者。Pos机会把addPayment消息发 送给Sale,并把新的Payment作为参数传递给它。 : Cashier : POS机 1: MakePayment() : Payment : Sale 2: crate() 3: addPayment(p) 这种职责分配使得Pos机与Payment之间产生了耦合, 即Pos机类必须知道Payment类
细化阶段:迭代2 GRASP低耦合案例分析 方案2:回顾领域模型中这三个类之间的关系,发现Sale 与 Payment类之间有关联关系 ■考虑支持低耦合,由Sale类来创建 Payment类的实例, 这样避免了Pos机类与 Payment了之间的耦合。 Sale Captured 1: MakePayment fan latae paymento : Payment Sale 3: create
细化阶段:迭代2 GRASP 低耦合 案例分析 ◼ 方案2:回顾领域模型中这三个类之间的关系,发现Sale 与Payment类之间有关联关系 ◼ 考虑支持低耦合,由Sale类来创建Payment类的实例, 这样避免了Pos机类与Payment了之间的耦合。 : Cashier : POS机 : Payment : Sale 1: MakePayment() 2: MakePayment() 3: create()
细化阶段:迭代2 GRASP耦合关系 ■在制定设计决策阶段必须考虑低耦合问题。 ■在C++、Java这类面向对象语言中,两个类之间的耦合常见的形式包 括 具有引用Y实例或者Y本身的属性; >X调用Y对象中的服务; X的方法中有Y类型(参数或返回); X是Y的直接或间接子类; Y是一个接口,Ⅹ实现了这个接口。 耦合的权衡原则: 尽量降低耦合,但耦合是不可避免的,因为系统的任务是通过关联对象 之间的协作完成的 耦合一个高稳定的系统元素不是一个问题,因为不会发生变更; 更多地考虑与系统不稳定元素之间的耦合,尽量降低这种耦合
细化阶段:迭代2 GRASP 耦合关系 ◼ 在制定设计决策阶段必须考虑低耦合问题。 ◼ 在C++、Java这类面向对象语言中,两个类之间的耦合常见的形式包 括: ➢ X具有引用Y实例或者Y本身的属性; ➢ X调用Y对象中的服务; ➢ X的方法中有Y类型(参数或返回); ➢ X是Y的直接或间接子类; ➢ Y是一个接口,X实现了这个接口。 ◼ 耦合的权衡原则: ➢ 尽量降低耦合,但耦合是不可避免的,因为系统的任务是通过关联对象 之间的协作完成的; ➢ 耦合一个高稳定的系统元素不是一个问题,因为不会发生变更; ➢ 更多地考虑与系统不稳定元素之间的耦合,尽量降低这种耦合
细化阶段:迭代2 GRASP高内聚 ■问题来源:怎样保持对象是有重点的、可理解的、可管理 的,并且能够支持低耦合? 解决方案:分配一个职责给对象时,要保持对象本身功能 的高内聚度。 对象内聚度:是对象职责联系的紧密程度。 个低内聚的对象会执行许多互不相干的功能,或需要完成大量 的工作。这样的类是不合理的,会导致下列问题: 难于理解、难于重用、难于维护; 系统脆弱,常常受到变化的影响。 大粒度对象,承担了本该委托给其他对象完成的职责。 经验:一个具有高内聚的类具有数目相对较少的方法和紧密相关 的功能,但是它并不完成太多的工作。任务过大时,寻求与其他 对象协作完成
细化阶段:迭代2 GRASP 高内聚 ◼ 问题来源:怎样保持对象是有重点的、可理解的、可管理 的,并且能够支持低耦合? ◼ 解决方案:分配一个职责给对象时,要保持对象本身功能 的高内聚度。 ➢ 对象内聚度:是对象职责联系的紧密程度。 ➢ 一个低内聚的对象会执行许多互不相干的功能,或需要完成大量 的工作。这样的类是不合理的,会导致下列问题: ⚫ 难于理解、难于重用、难于维护; ⚫ 系统脆弱,常常受到变化的影响。 ⚫ 大粒度对象,承担了本该委托给其他对象完成的职责。 ➢ 经验:一个具有高内聚的类具有数目相对较少的方法和紧密相关 的功能,但是它并不完成太多的工作。任务过大时,寻求与其他 对象协作完成