欢迎来到天天文库
浏览记录
ID:57036392
大小:917.50 KB
页数:26页
时间:2020-07-27
《运用OO设计原则:DIP和OCP课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、运用OO设计原则:DIP和OCP移动互联终端产品开发部施博2011-09-29目录软件是如何腐化的软件腐化的原因什么是DIP什么是OCPDIP和OCP的使用方法和原则模式如何遵循原则小结软件是如何腐化的一个任务BOSS要求你写一个程序,提供给部门使用。它的功能是:把一批个人信息从文件读取出来;对这批个人信息,按照个人的ID卡号排序,最后输出到屏幕。如何实现呢?Person-id:int-name:string+Id():int+Name():string软件是如何腐化的很快,你得到了下面的结构图:这是个遵循了结构化的设
2、计,把相关操作封装到独立的类里面。你的程序很成功,很快就被部署到了公司各处!软件是如何腐化的需求发生变化几个月后,BOSS告诉你,对于某些部门,由于数据量比较大,他们把新的数据改用数据库来存储了,而你需要修改程序同时支持两种读取方式。考虑到很多其他公司的程序都在使用你的程序,你不能修改Run()的接口,否则会导致很多的程序需要重新编译和重新测试。你决定增加一个全局变量,由调用方来告诉PersonInfoHandler来从哪里读取信息。软件是如何腐化的经过第一次修改后,类图变成下面这样:软件是如何腐化的又有新的需求了几周
3、后,BOSS又来了,告诉你,他希望不但可以在屏幕上看到程序执行结果,还可以打印出来留个备份。这次的改动和上次相似。增加了一个新的全局变量和一个新的逻辑判断。软件是如何腐化的经过第二次修改后,类图变成下面这样:软件是如何腐化的为什么会这样?如果又有新的需求呢?增加一种新的数据源新的输出位置新的排序算法不根据Id而是Name排序程序将越来越难以修改和维护,这样的趋势会继续下去。程序就这样一步一步地腐化了。经过两次修改,我们发现程序越来越脆弱,只要有一个新的需求,就会导致相当大的工作量,程序有着不必要的重复,越来越晦涩难懂。
4、分析原因回顾前面的例子,我们可以发现,随着需求的变化,我们的软件:一个简单的改动会导致有依赖关系的模块的连锁改动进行一个改动时会导致程序的其他没有概念上关联的地方需要改动低层实现的变化导致高层的策略需要变化程序的功能依赖越来越多的低层模块,导致程序无法使用在其他场合,如果需要使用,必须经过大量修改归根结底,是因为高层策略依赖于低层实现需求总是在变化“变化”,是软件开发过程中的一个不变真理。不管软件当初设计的多么好,一段时间之后,总是需要成长和变化,否则软件就会“死亡”。大多数软件项目中最不稳定的就是需求,需求处在一个持
5、续变动的状态中。既然我们生活在这样一个世界中,就要保证我们的软件能够经受得住变化。如何应对变化面向对象分析设计能够使用如此广泛,正是因为使用面向对象分析设计,我们:遵循面向对象的设计原则使用面向对象的设计模式持续不断地重构代码这样可以让我们的软件承受住变化,在持续不断的演进过程中,一直保持好的灵活性、可扩展性和可维护性。什么是DIP依赖倒置原则(Dependency-InversionPrinciple)高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。层次化面向对象架构要求
6、我们定义清晰地层次结构,每个层次结构通过一个良好定义的、受控的接口向外提供一组内聚的服务。因此,我们的程序设计往往成这样:策略层直接使用机制层,机制层直接使用工具层,因此策略层对其下层的改动都是敏感的。更合适的层次结构高层对于自己需要的服务声明抽象接口,低层实现抽象接口供高层使用。高层不依赖于低层低层反而依赖于高层中声明的抽象服务接口解除了策略层对于工具层、甚至机制层的依赖DIP倒置了什么DIP倒置了接口的所有权原来低层模块拥有自己的接口,提供给高层调用。DIP使得高层模块(客户)拥有了接口,而低层模块(服务者)从高层
7、的接口派生。DIP倒置了高层和低层的依赖关系高层模块不再依赖于低层模块,而是依赖于一个抽象接口。低层模块也依赖于抽象接口。什么是OCP开放-封闭原则(Open-ClosedPrinciple)软件实体(类、模块、函数等)应该是可以扩展的,但是不可以修改。OCP的主要特征对于扩展是开放的(openforextension)对于修改是封闭的(closedformodification)当应用的需求改变时,我们可以对模块进行扩展,以满足那些改变的新行为。也就是说,我们可以改变模块的功能。对模块进行扩展时,不需要改动模块的源代
8、码。模块的二进制可执行(lib、dll或exe文件)都不需要改动。应用DIP和OCP的关键找出潜在的抽象高层策略,实际上指的是具体问题背后的抽象,是那些不随具体细节改变而改变的真理!对于我们的例子,潜在的抽象和最有可能发生的变化是什么?抽象:输入数据,对数据进行排序,之后输出数据。可能的变化:数据输入来源、排序算法和规则、数据输出
此文档下载收益归作者所有