敏捷软件开发第六讲-依赖倒置原则与接口隔离原则.ppt

敏捷软件开发第六讲-依赖倒置原则与接口隔离原则.ppt

ID:57651952

大小:2.49 MB

页数:36页

时间:2020-08-30

敏捷软件开发第六讲-依赖倒置原则与接口隔离原则.ppt_第1页
敏捷软件开发第六讲-依赖倒置原则与接口隔离原则.ppt_第2页
敏捷软件开发第六讲-依赖倒置原则与接口隔离原则.ppt_第3页
敏捷软件开发第六讲-依赖倒置原则与接口隔离原则.ppt_第4页
敏捷软件开发第六讲-依赖倒置原则与接口隔离原则.ppt_第5页
资源描述:

《敏捷软件开发第六讲-依赖倒置原则与接口隔离原则.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第六讲:依赖倒置原则与接口隔离原则目录依赖倒置原则(DIP)DIP示例DIP原则实施要点接口隔离原则(ISP)接口污染ISP示例总结依赖倒置原则(DIP)什么是倒转?——传统的过程性系统的设计办法倾向于使高层次的模块依赖于低层次的模块;抽象层次依赖于具体层次。倒转原则就是要把这个错误的依赖关系倒转过来,这就是“依赖倒转原则”的来由。依赖倒置原则(DIP)抽象层次依赖于具体层次有什么不妥?——抽象层次含有宏观的和重要商务逻辑,是必然性的体现,而具体层次是含有一些次要的与实现有关的算法和逻辑,带有相当大的偶然性选择。所以抽象层次不能依赖具体层次。依赖倒置原则(DIP)

2、定义:高层模块不应该依赖于低层模块。二者都应该依赖于抽象。抽象不应该依赖于细节。细节应该依赖于抽象。DIP示例下图是一个常见的分层程序设计,高层的Policy层使用了低层的Mechanism层,而Mechanism层又使用了更细节的层Utility层。DIP示例(一)这看起来似乎是正确的,然而它存在一个隐伏的错误特征,那就是:Polity层对于其下一直到Utility层的改动都是敏感的。依赖关系是传递的。Policy层依赖于某些依赖于Utility层的层次:因此Policy层传递性地依赖于Utility层。重构后的设计:DIP示例(一)该设计每个较高层次都为它需要

3、的服务声明一个抽象接口。较低的层次实现了这些抽象接口。每个高层类都通过该抽象接口使用下一层。这样高层就不依赖于低层。低层反而依赖于在高层中声明的抽象服务接口。这不仅解除了PolicyLayer对于UtilityLayer的传递依赖关系,甚至也解除了PolicyLayer对于MechanismLayer的依赖关系。这就实现了依赖关系的倒置,同时也实现了接口所有权的倒置。对于DIP的解释一个稍微简单但仍然非常有效的对于DIP的解释,是这样一个简单的启发规则:”依赖于抽象。“这是一个简单的陈述,该启发式规则建议不应该依赖于具体类——也就是说,程序中所有的依赖关系都应该终

4、止于抽象类或接口。基于DIP原则的三个建议:任何变量都不应该持有一个指向具体类的引用。任何类都不应该从具体类派生。任何方法都不应该重写它的任何基类中的已经实现了的方法DIP示例(二)依赖倒置可以应用于任何存在一个类向另一个类发送消息的地方。例如,Button对象和Lamp对象之间的情形。设计一个用Button对象控制Lamp对象的系统,设计如下:Button对象接收Poll消息,判断按钮是否被按下,接着简单地发送TurnOn或者TurnOff消息给Lamp对象。DIP示例(二)这是一个不成熟的设计,问题出在哪里?publicclassButton   {priva

5、teLamp aLamp;publicvoidPoll()      {if(/* some condition */)         {            aLamp.TrunOn();         }      }   }这个方案违反了DIP。应用程序的高层策略没有和低层分离。抽象没有和具体细节分离。没有这种分离,高层策略就自动地依赖于低层模块,抽象就自动地依赖于具体细节。DIP示例(二)通过倒置对Lamp对象的依赖关系,可以改进设计。Button和ButtonServer的接口关联起来,Button就可以使用它来开启或者关掉一些东西。Lamp实现了

6、ButtonServer接口。这样,Lamp现在是依赖于别的东西了,而不是被依赖了。DIP示例(三)考虑设计一个控制熔炉调节器的软件。该软件可以从一个I/O通道中读取当前的温度,并通过向另一个I/O通道发送命令来指示熔炉的开或者关。constbyteTHERMONETER=0x86;constbyteFURNACE=0x87;constbyteENGAGE=1;constbyteDISENGAGE=0;voidRegulate(doubleminTemp,doublemaxTemp)   {for(;;)      {while(in(THERMONETER) >

7、 minTemp)            wait(1);out(FURNACE,ENGAGE);while(in(THERMONETER) < maxTemp)            wait(1);out(FURNACE,DISENGAGE);      }   }DIP示例(三)前面的代码根本不能重用于不同的控制硬件。重构后设计如下:DIP示例(三)Regulate函数接受了两个接口参数。Thermometer接口可以读取温度,而Heater接口可以启动和停止。这就倒置了依赖关系,使得高层的调节策略不再依赖于任何温度计或者熔炉的特定细节。该算法具有很好的可重

8、用性。vo

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。