作者:江南白衣
以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的確好,讀的時候像偽代碼一樣清晰簡單,寫的時候也可以一氣呵成,沒有太多無聊定義與制約,也不用怕別人投訴代碼編譯不了....