1. 程式人生 > >【轉】非侵入式設計 和侵入式設計 意思?

【轉】非侵入式設計 和侵入式設計 意思?

非侵入式系介紹DI用語,我得理解是兩個元件(類,介面)之間,比較獨立,不深入到另一個類內部,哪位大蝦能點撥一二?

關於“侵入式”和“非侵入式” 

有讀者講“侵入式”這一術語無法理解,這裡給一個簡單解釋,是我個人的看法。 

在設計一個類時,按理說,需要的應該只是該類所企圖表示的那個“概念”本身:為表示有關概念應記錄哪些資訊,該類的物件與外界交換資訊的介面等等。但定義這個類並不是為了放在那裡觀賞,而是為了使用。在考慮類物件的使用時,使用環境的一些要素就可能“侵入”這個類的設計之中。實際上,許多情況下常常可以在“侵入式”設計和“非侵入式”設計之間做一個選擇,不同選擇各有優缺點。在考慮非類的程式部分時,這種問題也同樣存在。 

例如,我們可能需要對類A的物件做引用計數,這裡有兩種基本可能性:將計數功能納入類A的設計內(侵入式引用計數設計,此時類A的物件中包含了與引用計數有關的要素,這顯然是與類A所要表示的概念無關的東西),或者將計數功能放在類A之外(非侵入式引用計數)。 

本書中討論容器時提出了“侵入式容器”設計和“非侵入式容器”設計的概念:當我們將類A的物件放入一種容器時,是否需要將該容器的實現要素“侵入”類A的設計實現之中(這顯然是與類A本身並無必然關係的要素)。不同考慮導致不同的容器設計。  

我基本上知道了,從夏大蝦得著作中得知。 
比如struts,需要繼承一些struts的類,這就是侵入式,使得系統離不開那個框架。 
而spring中,業務類不需要繼承框架的類,將來拋棄spring也比較方便。 
樓上大蝦(土豆塊)能否談下ejb與spring之間得關係。你用ejb嗎?如果用了,感覺如何?

非侵入式(non-intrusive)設計是目前非常熱門的話題。在一般的討論中,非侵入式設計總是和Spring這樣的IoC容器或者AOP技術聯絡在一起。但是從思想上說,non-intrusive並不等價於IoC或者AOP,它是一個比AOP更加寬泛的概念。
      首先,我們考察一下何謂intrusive。典型的intrusive實現是繼承特定的基類, 或者實現特定的介面. 在抽象的意義上說, intrusive意味著在基礎結構中預留了一些特殊的,專用的結構, 這些結構對於基礎功能而言不僅僅是無用的, 甚至是有害的, 例如影響效能或者模糊了原有的概念結構, 而系統整體的後期擴充套件能力也受到這些預設的結構通道的限制. 
non-intrusive設計的基本特點是儘量利用基礎結構的元素, 而不是引入額外的特殊結構.例如, 在witrix平臺的tpl模板中
<button tpl:tag="ui:FlatButton" value="xx" onclick="alert('ok')" />
如果後臺tpl引擎不解析<ui:FlatButton>標籤, 那麼該標籤的表現就是普通的html button. 這裡整個頁面的介面表現結構沒有被tpl標籤所破壞,而如果像jsp tag那樣強行規定必須採用節點語法, 即
<ui:FlatButton value="xx" onclick="alert('ok')" />
則在沒有tpl引擎的情況下, 介面結構被tpl標籤所破壞,此時在dreamweaver這樣的視覺化工具中我們無法再識別出有效的介面元素, 喪失了WYSIWYG編輯的能力.
tpl:tag屬性屬於html語法本身規定了的自定義屬性, 它在html中的存在是符合規範的, 而且它對於button來說沒有造成什麼限制或損害, 因而是一種無害的標記. 在沒有tpl模板引擎的情況下, tpl:tag屬性與其他自定義屬性一樣處於同樣的地位, 沒有什麼特殊的作用. 而一旦tpl模板引擎識別出該特殊標記, 整個節點就被解釋成一個具有豐富表現形式的平面按鈕而不是系統預設風格的普通按鈕. 從級列設計的角度上說, button對應於ui:FlatButton在沒有tpl解析能力情況時退化了的結果. 在EJB3的規範中, 普通的POJO(Plain Old Java Object)物件在經過無害的標記(annotation)之後通過Enhance過程獲得持久化等特性, POJO正對應於EJB Object的退化形式. 在某種意義上我們可以說, 存在著多少種可退化方式,就對應著多少種non-intrusive design。
      與傳統設計中的結構堆砌不同, 現代技術更加強調在原有結構基礎上的同態變化, 關注原有結構中的某些部分出現特殊意義後所產生的對稱破缺. 在non-intrusive設計中, 基礎的結構中沒有為擴充套件內建什麼特殊的結構, 一般僅僅是標記而已, 這些標記是無害的甚至本身在基礎結構中是有用的, 例如某些javascript庫在前臺html頁面中利用html標籤的class屬性作為標記. 為了識別這些屬於結構標準部分的標記並對之進行處理,我們需要一種可選擇的結構透明性, 具體來說我們需要能滲透到系統內部,準確的定位到標記處. 這就類似於x光檢測, x光只與某些特殊材料發生強烈作用而普通部分對於x光而言是透明的. 而當外部引擎識別出這些特殊的標記之後, 可能需要操縱該區域性結構, 例如在基礎結構中插入一些新的結構以實現基礎結構的增強. 這些都可能需要應用類似於AOP的技術, 而在這一增強過程中關於擴充套件結構的具體知識存在於擴充套件引擎中而不是基礎結構中, 因而往往整體表現出一種IoC的特性.