`
江南白衣
  • 浏览: 550101 次
  • 来自: 广州
社区版块
存档分类
最新评论

MartinFowler: IOC, not IOC Container

阅读更多

     作者:江南白衣 

      以Spring为代表的提供依赖注入的IOC Container风头越盛,比起IOC的原本意义,DI逐渐有妹仔大过主人婆的姿势,所以Martin Fowler同学忍不住写了篇blog,提醒一下大家IOC的本原--一种作为"所有Framework与API Library最根本的区别点"的Design Principle。
      当年侯捷同志是以VC下的MFC作例子,马同学与时俱进,换了Ruby、Junit、SWT来教育时下的新新人类。
      IOC原理是老生常谈了,可以看马同学的blog。当应用复杂时,都应该考虑把封装从线性调用的API级,提升到奉行IOC的Framework级。

      我更关心如何把自己的代码交给IOC框架调用。
      1.闭包,匿名内部类,函数指针
      如果仅仅把一段代码plug给框架,Groovy、Ruby的闭包是最简单快捷的,再看Java中匿名内部类的做法,比如SWT的事件绑定,Spring的JDBC Template,代码之难看令人心酸,很无妄的的要多一个接口名,一个方法名和两层嵌套,见Martin Fowler的<闭包>的中文版.

      2.Template模式,策略模式       
      如果要把一组关联的代码绑定给Framework,则通常会定义出一个接口。这里的接口是广义的。GOF里有两种模式:
      一种是模版(Template)模式,几种最简单、最古老的模式之一。在父类里面定义Control flow,留下钩子程序的位置。而在子类里实现这些钩子程序,Junit的setup()和tearDown()就属于这种类型。

      另一种是策略模式。Template的一个重要制约为两者必须是父子关系,这对于单根继承的java有点不便。另外,策略模式在灵活性上显然更胜一筹。策略类只需要实现某个接口,容器就可以在适当时进行调度。比如EJB,和Swing都是这种模式。

      3.消息绑定
      最后,MS家还有个更高明的消息机制,可以实现更灵活的绑定。

      4.AOP, cglib和Annotaton
      另外,马同学没有讲的,因为AOP和元数据的出现,框架本身又有了新的封装方式。
      框架可以用AOP更隐式,无侵入的提供服务,Annotation可以更简洁的告诉框架如何提供服务。

      比如Spring 的JDBC Framework ,封装了连接,事务,异常的管理,让你可以专心的写SQL查询。但那些个匿名内部类让你怎么看怎么不爽,而Java又的确没有闭包......这时你可以用Spring的声明式事务管理机制,你只要把业务代码写成普通函数,而Spring会利用AOP隐式的包裹你的代码提供连接、事务的管理。

      如果你不喜欢用xml配置文件声明事务,可以自己用cglib+annotation简单实现一下。甚至,如果你连 annotation也不喜欢,还可以学习rails, 用纯命名约定搞定,只在必要时采用annotation辅助。

     潮流兴用Ruby写Sample Code.   
    
还有一样事情,就是马同学开始喜欢用Ruby来写sample code。发现Ruby写sample code的确好,读的时候像伪代码一样清晰简单,写的时候也可以一气呵成,没有太多无聊定义与制约,也不用怕别人投诉代码编译不了....



分享到:
评论

相关推荐

    IOC容器和DI模式.Martin Fowler

    本文中,作者深入探索IOC模式的工作原理,给它一个更能描述其特点的名字——“依赖注入”(Dependency Injection),并将其与“服务定位器”(Service Locator)模式作一个比较。不过,这两者之间的差异并不太重要,...

    java部门管理的项目源码-Refactoring-Summary:MartinFowler的“重构:改进现有代码的设计”摘要

    java部门管理的项目源码这是我对 Martin Fowler 的“重构:改进现有代码的设计”的总结。 我在学习时使用它并作为快速参考。 它不打算作为本书的独立替代品,因此如果您真的想学习此处介绍的概念,请购买并阅读本书...

    blue-green-deployment:蓝绿色部署脚本(https:martinfowler.comblikiBlueGreenDeployment.html)

    描述中提到的链接(https://martinfowler.com/bliki/BlueGreenDeployment.html)指向了Martin Fowler的网站上关于蓝绿色部署的详细解释。Martin Fowler是软件开发领域的权威,他的文章通常深入浅出地阐述各种技术...

    台湾人写的spring 教材

    可以参考Martin Fowler的文章(http://www.martinfowler.com/articles/injection.html)和Dependency Inversion原则(http://www.objectmentor.com/publications/dip.pdf)来深入理解这些概念。同时,"Spring开发...

    MartinFowler的持续集成

    持续集成是一种软件开发实践,在实践中项目成员频繁地进行集成,通常每个成员每天都会做集成工作,如此,每天整个项目将会有多次集成。  持续集成是一种软件开发实践,在实践中项目成员频繁地进行集成,通常每个...

    java前后端分离源码-SpaceNotes:SpacesNotes,作者:RyanM.Kay,灵感来自MartinFowler、Robert

    java前公开源码太空笔记 刚接触 Kotlin? 无论您是经验丰富的 Java 老手,还是刚开始使用 Kotlin for Android,都可以考虑查看 ...如果您喜欢我的视频和存储库,我认为您会真正享受 ...该应用程序使用协程进行并发和跨模块...

    react-microfrontend:https

    MicroFrontend阅读: 必须阅读: //martinfowler.com/articles/micro-frontends.html @ThoughtWorks @walmart和@hasgeek 演示文稿 @walmart-为什么不React可装载物 React + Vue 演讲: : 其他链接: ...

    Martin Fowler《重构——改善既有代码设计》(中文版)

    《重构——改善既有代码设计》是软件工程领域的一部经典著作,作者Martin Fowler,该书与《设计模式》被并称为软件工程的双雄。《重构》一书的主旨在于向读者展示重构的过程与方法,即通过一系列小的、有步骤的改变...

    ASP.NET设计模式-杨明军译(源码)

    那些以前已经体验过设计模式的读者可能希望跳过本书的第ⅰ部分,这部分介绍了gof提出的设计模式以及其他常见设计原则,包括s.o.l.i.d原则和martinfowler的企业设计模式。所有的代码示例均采用c#语言编写,但这些概念...

    struts1和struts2的区别

    答案是使用IoC(反转控制,Inversion of Control),也叫“依赖注入(Dependency Injection)”的模式(想更多地了解这方面信息请看Martin Fowler的文章http://www.martinfowler.com/articles/injection.html)。...

    软件工程中的持续集成与交付.pptx

    "Continuous Integration." &lt;https://martinfowler.com/articles/continuousIntegration.html&gt; - [2] Jez Humble and David Farley. "Continuous Delivery: Reliable Software Releases through Build, Test, and ...

    curso_testing_20151102:测试课程

    #测试课程 ##日程 测试对生命周期的影响 单元测试工具 集成测试工具 ...http://www.martinfowler.com/articles/continuousIntegration.html 工具 指标 http://www.sonarqube.org http://www.eclemm

    ant结合junit进行软件自动测试

    JunitANTant结合junit进行软件自动测试软件测试持续集成实践三,灵感来自于MartinFowler的“持续集成“一文。可以在www.martinfowler.com看到,国内有人翻译成了中文。本文假设读者具备如下知识:1、熟练ant进行java...

    SpringCloud微服务笔记

    [马丁福勒微服务论文]: https://martinfowler.com/articles/microservices.html ### 什么是微服务 - 目前的微服务并没有一个统一的标准,一般是以业务来划分 - 将传统的一站式应用,拆分成一个个的服务,彻底去...

    PaCuSe:PazsitCucumberSelenium测试框架

    PazsitCucumberSelenium测试框架 ... 页面模型和pageObject可以包含小部件,这些小部件由基于以下资源的“对象数据表映射我的模型和对象”结构所支持: ://martinfowler.com/bliki/PageObject.html,https:

    SpringCloud:春云

    马丁·福勒,他于2014年发表了关于微服务的博客的博客: ://martinfowler.com/microservices/ 微服务详细文档:中文: : 微服务是一种架构风格,通过开发各个小型服务的方式来作为一个独立的应用系统,每个服务都...

Global site tag (gtag.js) - Google Analytics