如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
InversionofControl——从开始到现在前言InversionofControl(IoC)——几乎所有流行的框架都声称自己实现了IoC。IoC究竟有什么好处?我从Tapestry-IoC框架的文档中摘录了以下几条:将复杂的系统分割成很多易于测试的小片;通过覆盖、取代其中的小片,就可以扩展和修改系统。IoC果真有这么神奇吗?它背后隐藏的神秘力量是什么?现在流行的IoC框架已经完美了吗?还有什么发展余地?本文通过一些简单的例子,来思考IoC的实质;再通过对比常见IoC框架的异同,思考我们如何才能把IoC框架做得更好。模式和原则从一个简单的例子开始无论是学习C语言、Basic语言,或者其它的编程语言,教科书往往从一个简单的控制台程序开始,来介绍这门新的语言。我们也从这个简单的例子开始——写程序完成下面的功能:从键盘(标准输入)输入读入字符,然后打印到显示屏(标准输出)。用Java语言实现这个功能极为简单,只需要寥寥几行代码就可以了:(程序1)publicclassCopier{publicstaticvoidmain(String[]args)throwsIOException{intch;while((ch=System.in.read())>=0){System.out.print((char)ch);}}}(注:这段程序也是MartinC.Robert在他的《AgilePrinciples,Patterns,andPractices》书中,用来引出他的设计思想的例子,本文的很多思想来自于这本经典的参考书。)把这段代码画成结构图,应该是这个样子:这段程序有问题吗?如果你的需求永不改变,那么这段程序毫无问题——它工作得很好。如果你的需求发生改变,比方说,你希望从一个文件中读字符,并打印到一台打印机去,那么你不得不修改这段程序。为了和原程序保持兼容,你也许不得不把程序改成类似下面的样子:(程序2)publicclassCopier{publicenumInputDevice{STDIN,FILE}publicenumOutputDevice{STDOUT,PRINTER}publicstaticvoidmain(String[]args)throwsIOException{intch;InputDevicein;OutputDeviceout;try{in=InputDevice.valueOf(args[0]);out=OutputDevice.valueOf(args[1]);}catch(Exceptione){in=InputDevice.STDIN;//默认值out=OutputDevice.STDOUT;//默认值}while((ch=read(in))>=0){write(out,(char)ch);}}privatestaticintread(InputDevicein){switch(in){caseSTDIN:returnSystem.in.read();caseFILE:returnreadFromFile();}}privatestaticvoidwrite(OutputDeviceout,charch){switch(out){caseSTDOUT:System.out.print(ch);break;casePRINTER:writeToPrinter(ch);break;}}}这样,你就违反了面向对象设计(OOD)中的第一个原则,也是最基本的原则:Open/ClosedPrinciple,简称OCP。这个原则的描述如下:面向对象设计原则:Open/ClosedPrinciple(OCP)软件实体(类、模块、函数等)应当能够被扩展(OpenforExtension),而不需要被修改(ClosedforModification)。违反这个原则,会导致什么结果呢?MartinC.Robert给我们总结了以下几点:Rigidity(僵硬的)——形容程序难以被改变试想以后你每增加一种“读字符”的方法,或者增加一种“打印字符”的方法,你都需要去修改这个类,以增加适当的switchcase分支。不仅如此,所有用到copy功能的程序也有可能需要被修改。可见修改程序的代价是很高的。Fragility(易碎的)——形容程序很容易受到破坏试想你少写了一个switchcase会怎样?或者,当你修改“输出到打印机”功能时,原有的“输出到显示屏”的功能却被出乎意料地破坏了。Immobility(难以移植的)——形容程序难以在不同的环境中被重用试想你是一个copy