Kemin's Blog

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

转自:http://www.aspectsolution.com/blojsom/blog/sclu/2005/08/06/%3F%3F%3F%3F%3F%3F%3FSOA.html?page=trackback

服務導向架構(SOA; Service Oriented Architecture)是這一兩年來商業系統的熱門名詞,然而這樣大的一個公司,最後竟然解散了SOA計畫,原因在哪裡?
(當然原因之一是錢花完了。)

個人認為,真正的問題在於對控制反轉的認知差異。

控制反轉(Inversion of Control)是一個簡單的概念。如果傳統程式呼叫比喻成打電話,那麼控制反轉就可解釋為"電話號碼給我,我有空會打給你"。原本我們寫程式,現在改成寫服務。傳統的主從式架構進行控制反轉,可以打散原本強耦合的關係,也就是說,不再有客戶端與伺服器端,進而成為分散式的服務架構。

控制反轉只是一個程式設計的概念,不是一組程式庫,也不是design pattern。控制反轉裡最常被人提出的技術,叫作Dependency Injection(相依注射)。不要怪我翻譯爛,因為這個名詞就算是換成美國人也聽不懂。寫程式跟打針有什麼關係? 沒有。相依注射實行的方法如下:

所有具有public方法的類別,其public方法必須寫在分開的interface裡面
使用此public方法之用戶程式,"不可以"建立實際的物件。也就是說,不可以用"new"這個關鍵字。
使用此public方法之用戶程式可以假設物件在其他地方已經被建立好了,例如使用factory method pattern。
實際建立物件的地方(就是用到new的地方),集中在一起,方便管理。
在這種情況下用戶程式並不知道物件的實作為何,但是可以透過介面的呼叫而達到目的。

舉個例子

public interface SketchCommand {   
    public void execute();
}

public class SketchClient {
    private SketchCommand command;
    public injectSketchCommand(SketchCommand command) {
        this.command = command;
    }
    public runCommand() {
        command.execute();
    }
}
相當不起眼的一段程式,卻是相依注射的重點。重點是我們把new藏起來了。
原本需要用new的地方,改成一個空欄位,用一個方法等待外界傳入實作。這個無聊的行為可以得到幾個好處:
你的程式可以完全獨立運行,不需關心實作細節
被注射的物件其生命周期可以更容易被掌握。

posted on 2005-10-11 12:13  kemin  阅读(318)  评论(0编辑  收藏  举报