好莱坞法则.doc_第1页
好莱坞法则.doc_第2页
好莱坞法则.doc_第3页
好莱坞法则.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编程导论(Java)在9.3.1回调中,介绍了好莱坞法则/好莱坞原则(Hollywood principle)p287,并将它作为回调的近义词,即当程序中使用了回调,那么你的程序应用了好莱坞法则。 Hollywood principle:Dont call me; Ill call you. (dont call us, well call you)对于好莱坞原则的解释,在各种书籍、文献中极其混乱。本文介绍编程导论(Java)中对好莱坞原则的解释,以及为什么要这样解释。不可避免地,本文会把一些著名文献中的解释作为反面例子。重写 别了,DIP、IoC不懂递归,不要说学过算法;不懂回调,不要说学过编程;1.引子:多态图1 依赖于抽象类型、针对接口编程、遵循OCP 代码的基本结构Client有方法test,代码为:IServer s = new Server();s.foo(5);对上述代码的解释:“s被初始化后,将按照s实际指向的对象类型(Server),动态绑定foo()的代码块。”这是面向对象中基本的解释方式,后面的讨论将涉及到这一解释。这里,我设定了一个前提:我不喜欢对上述代码的其他云山雾绕的解释!2.回调在分层结构中,上层依赖于下层,最后依赖于基础设施(如JDK、各种框架)。因而依赖必须是单向的。如果图1中的Server是一个上层模块,那么它给出的foo(int)代码块称为回调。回调与通常的非回调代码,从类图和其自身代码上,没有区别。之所以需要回调callback、隐式调用Implicit invocation(某些软件架构的作者使用的术语),是因为分层结构的一条线的存在,如图2所示。图2 回调的应用场景非回调代码,如果不考虑OCP,图1中的Client可以直接依赖于Server;而在图2所示的回调的应用场景中,上层的Client直接依赖于下层的Server,而下层的Server不能够依赖Client,因而不得不在下层(或基础设施/框架中)定义一个Client的父类型,如接口IClient。1. 回调与通常的非回调代码,从类图和其自身代码上,没有区别。2. (为了使用回调)回调机制不得不在下层(或基础设施/框架中)定义一个Client的父类型IClient,它定义了回调foo(int)的方法头(方法的接口)3. 回调与通常的非回调代码,使用的技术不过是动态绑定/多态。3.好莱坞法则Dont call me; Ill call you. Client(you)调用Server(me)天经地义,但是请不要轮询我,我通知你。现实生活中乘客/you打的士到某地,沿途问司机/me某个景点天经地义;但是不要从上车的第一秒开始,时刻或每隔5秒问司机到了打的士目的地没有,这也太烦人了。 好莱坞原则、回调不改变分层结构的依赖方向控制反转Inversion Of Control/IoC这个乱七八糟术语没有存在的价值(充其量说明了软件的用户体验)。 好莱坞原则中me是下层模块! 如果不采用通知方式应用应用好莱坞原则,上层可以轮询。4.类层次与好莱坞原则/category/design-patterns/template-method-pattern/反面例子之一:“Be sure to go over the more detailed post on the Hollywood Principle, but for here, you just need to become familiar with the idea thathigher level components (like parent classes and interfaces) should call lower level components (like concrete classes), but lower level components, should not call higher level components.The principle is called Hollywood, because the casting director tells the budding actor,Dont call us, well call you.The parent class tells the child class the same thing.”驳斥:1. 从依赖关系上看,按照分层的观点,子类是上层模块、父类是下层模块(如果不在同一层的话)。因为子类可以(必须的)依赖父类型,你不可能将父类型放在上层,而让下层(的子类)依赖于上层。所以上文中的下划线部分本身就是错误的。2. 如“1.引子:多态”所言,有动态绑定,在类层次中使用回调、好莱坞原则的解释是一种极其无聊的解释,而且令人困惑。3. 按照他的说法,好莱坞原则“应该”意味着“上层调用下层而下层不得调用上层”;而“上层调用下层而下层不得调用上层”,我们称之为单向依赖,需要搞一个多此一举的“好莱坞原则”作为单向依赖的同义词吗?当然,如果上层模块说Dont call me; Ill call you.,非常符合该字面的解读,这种上层模块所说的好莱坞原则,和白开水一样,没有营养。反面例子之二:设计模式“模板方法导致一种反向的控制结构,这种结构有时被称为“好莱坞法则”,即“别找我们,我们找你” S w e 8 5 。这指的是一个父类调用一个子类的操作,而不是相反。”驳斥:1. 不管模板方法的细节,如“1.引子:多态”所言,s.foo(5)动态绑定,完全不需要”父类调用子类的操作“的说法。父类不可能知道子类的附加的操作,那么s.foo(5)是Client调用IServer的foo然后IServer调用子类Server的overridr方法foo?2. S w e 8 5 的原文:Dont call us, well call you (Hollywoods Law): A tool should arrange for Tajo tonotifyit when the user wishes to communicate some event to the tool, rather than adopt an ask the user for a command and execute it model.,和本文的【3.好莱坞法则】一致,而非【设计模式】的滥用。3. 按照面向对象的一般概念,子类是一个父类,父类动物有eat()方法,那么我们喂狗吃的时候即new Dog().eat(),有没有人说:”我喂动物吃,而动物调用狗的吃方法“,”我又喂动物吃,而动物调用猫的eat()方法“?太别扭了。反面例子之三:敏捷软件开发11.2.1接口所有权倒置:Dont call us, well call you。低层模块实现了在高层模块中声明并被高层模块调用的接口。驳斥:1. 在分层结构中,上层依赖于下层,依赖必须是单向的。他的书中的图11.2除了看起来有点道理外,层次真的能够”倒置“吗?假设图11.2中的Utility是JDK或某个框架,你倒置给我看看。2. 他的书中的图11.2中的三个包,如果忽略policy、mechanism和Utility的寓意,从上到下事实上是Utilitymechanismpolicy的普通结构,从结构上没有任何特别的地方;如果强调policy、mechanism和Utility的寓意,而且按照依赖的单向性,父类必须是下层模块,因而图11.2并无意义,实践中充其量将所谓的”policy server interface“等放入公共模块(而非好看地与Policy Layer放在一个包中)。所以DIP的“倒置”没有什么营养。从软件开发管理的角度,DIP是有启发意义的,但是DIP既不是架构设计的原则,也不是面向对象类关系的设计原则。3. 低层模块不得”实现高层模块中声明并被高层模块调用的接口“。正如反面例子之一的第一条反驳,你不可能将父类型放在上层,而让下层(的子类)依赖于上层。反面例子之四:/cgi/wiki?HollywoodPrinciple”HollywoodPrinciple is often called InversionOfControl, or DependencyInjection.“1.回调机制是框架设计的基本手段。即使勉强接受IoC是好莱坞原则的同义词,但是依赖注入、事件驱动

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论