冒號(hào)和他的學(xué)生們(連載11)——切面范式

          冒號(hào)和他的學(xué)生們

          ——程序員提高班紀(jì)事

          1. 切面范式

          橫看成嶺側(cè)成峰                                            ——《蘇軾·題西林壁》


          引號(hào)重開話題:“OOP方興未艾,AOP又開始嶄露頭角。AOP算是OOP的一種分支、一種補(bǔ)充還是一種超越?”

          嘆號(hào)故作捶胸頓足狀:“OOP還沒有完全吃透,又來了個(gè)什么AOP。”

          “不同的人對(duì)新生事物采取不同的態(tài)度。”冒號(hào)王顧左右而言他,“追星族傾向于盲目追捧,唯恐落伍,他們信奉新潮的流行的就是好的;守舊派傾向于本能抗拒,回避求新,他們認(rèn)為經(jīng)典的傳統(tǒng)的才是好的。”

          引號(hào)和嘆號(hào)互視一眼,不情愿地戴上了老冒派發(fā)的帽子。

          冒號(hào)續(xù)道:“從宏觀角度看,太陽底下沒有新鮮事——AOP無非是SoC原理和DRY原則的一種應(yīng)用;從微觀角度看,太陽每天都是新的——AOP雖自OOP的土壤中長出,卻脫離藩籬自成一體,并且嫁接到非OOP的領(lǐng)地,不僅在純過程式語言、函數(shù)式語言、甚至邏輯式語言中得到發(fā)展,而且本身也具備了一定的聲明式語言特征,成為一種新的軟件模塊化方式。”

          問號(hào)舉手:“什么是SoCDRY?”

          引號(hào)代答:“SoC就是Separation of concerns,即關(guān)注點(diǎn)分離;DRYDon’t Repeat Yourself,即盡量減少重復(fù)代碼。”

          “答案正確,加十分!”冒號(hào)戲贊道,“不良代碼通常有兩種病征:一是紛亂如麻,糾纏打結(jié),可謂剪不斷理還亂;二是疊床架屋,臃腫不堪。治療此類病癥一個(gè)有效的方法是抽象與分解:從問題中抽象出一些關(guān)注點(diǎn),再以此為基礎(chǔ)進(jìn)行分解。分解后的子問題主題鮮明并且獨(dú)立,不會(huì)牽一發(fā)而動(dòng)全身。同時(shí)具有相同特征的部分可以象代數(shù)中的公因子一樣提取出來,減少了代碼重復(fù)。”

          句號(hào)醒悟道:“這不就是模塊化嗎?”

          “準(zhǔn)確地說,抽象是前提,分解是方式,模塊化是結(jié)果。”冒號(hào)很講究精確,“大家記得庖丁解牛的故事吧?在常人眼中復(fù)雜的牛體,庖丁經(jīng)過抽象,已目無全牛,及至提刀分解,自是游刃有余。待牛如土委地,模塊化既成。”

          句號(hào)舉一反三:“前面提到的編程范式的基本思想大多不也如此?將程序分別抽象分解為過程、函數(shù)、斷言、對(duì)象和進(jìn)程,就依次成為過程式、函數(shù)式、邏輯式、對(duì)象式和并發(fā)式。至于泛型式——”

          句號(hào)講不下去了。

          “泛型式雖未引入新類型的模塊,其核心也是抽象出算法后與數(shù)據(jù)分解。”冒號(hào)為其解圍,“以此類推,切面式的AOP將程序抽象分解為切面。”

          問號(hào)提問:“抽象與分解的原則是什么?”

          冒號(hào)作了個(gè)V字:“兩條:單一化,正交化。每個(gè)模塊職責(zé)明確專一,模塊之間相互獨(dú)立,即高聚合低耦合high cohesion & low coupling)。此原則相當(dāng)普適,是分析復(fù)雜事物的一種基本方法,在數(shù)學(xué)和物理中應(yīng)用得尤為廣泛,如質(zhì)因式分解、正交分解、譜分解等等。”

          逗號(hào)調(diào)皮地抬杠:“為什么稱為正交化呢?斜交化不行嗎?”

          冒號(hào)呵呵一笑:“互為正交的兩個(gè)向量在彼此方向上投影為零,意味著彼此獨(dú)立,互不影響,斜交可不行。”

          逗號(hào)吐了吐舌頭。

          “誠如前述,AOP以切面為模塊。”冒號(hào)返回主題,“切面Aspect常直譯為‘方面’,但它描述的是橫切關(guān)注點(diǎn)Cross-cutting concerns),故‘切面’更準(zhǔn)確生動(dòng),而‘方面’則失之空泛呆板。何謂橫切關(guān)注點(diǎn)?顧名思義,乃是與程序的縱向主流執(zhí)行方向橫向正交的關(guān)注焦點(diǎn)。不妨回顧一下,無論是過程式的函數(shù),還是對(duì)象式的方法,都包含了完整的執(zhí)行代碼。但有些代碼橫跨多個(gè)模塊,以片斷的形式散落在各處,雖具有相似的邏輯,卻無法用傳統(tǒng)的方式提煉成模塊,難以實(shí)現(xiàn)SoCDRY。典型的例子如:在調(diào)用某些對(duì)象的方法、讀寫某些對(duì)象的域、拋出某些異常等等前后,需要用到統(tǒng)一的業(yè)務(wù)邏輯,諸如日志輸出、代碼跟蹤、性能監(jiān)控、異常處理、安全檢查、事務(wù)管理等等。為解決此類問題,AOP應(yīng)運(yùn)而生。它將每類橫切關(guān)注點(diǎn)封裝到單獨(dú)的Aspect模塊中,將程序中的一些執(zhí)行點(diǎn)與相應(yīng)的代碼綁定起來。單個(gè)的執(zhí)行點(diǎn)稱為接入點(diǎn)join point),例如:調(diào)用某個(gè)對(duì)象的方法前后;符合預(yù)先指定條件的接入點(diǎn)集合稱為切入點(diǎn)pointcut),例如:所有以set為命名開頭的方法;每段綁定的代碼稱為一個(gè)建議advice)。”

          問號(hào)有點(diǎn)疑問:“接入點(diǎn)與切入點(diǎn)有何區(qū)別?”

          冒號(hào)釋疑:“望文生義,接入處是點(diǎn),切入處是面,面由點(diǎn)組成。advice定義于切入點(diǎn)上,執(zhí)行于接入點(diǎn)處。換言之,共享一段代碼的接入點(diǎn)組成了一個(gè)切入點(diǎn)。切入點(diǎn)一般用條件表達(dá)式來描述,不僅有廣泛性,還有預(yù)見性——以后新增的代碼如果含有滿足切入點(diǎn)條件的接入點(diǎn),advice中的代碼便自動(dòng)附著其上。這是AOP威力所在,但有時(shí)也是麻煩所在。”

          引號(hào)很較真:“好像一些書上把join point譯作連接點(diǎn),把advice譯作通知。”

          “誤導(dǎo),完全是誤導(dǎo)!”冒號(hào)有些痛心疾首,“何謂join point?是advice中額外代碼接入之處,join顯為‘參加’、‘加入’之意。如果說翻作‘連接’只是因缺乏動(dòng)感和方向性而不夠貼切的話,將advice譯作‘通知’則近乎荒謬了。advice是在原有程序流程中加入的額外流程,可理解為建議采取的措施,而‘通知’強(qiáng)調(diào)的是一種信息,難道是程序運(yùn)行到join point的信息?抑或采取某種行動(dòng)的信息?簡直不知所云。”

          頓了一會(huì),冒號(hào)仍意猶未盡:“英文好的技術(shù)不好,技術(shù)好的英文不好,兩者都好的不屑去翻譯,導(dǎo)致市面上的譯書雖汗牛充棟,然佳作寥寥。這里奉勸各位,如果真想成為優(yōu)秀的程序員,一定要盡可能地讀原文的書籍、文章和文檔。事實(shí)上,凡是科學(xué)和藝術(shù)方面的專業(yè)人員,要想專業(yè)水平上一層臺(tái)階,都應(yīng)讀該專業(yè)權(quán)威經(jīng)典的原文。要知道,語言之間的天塹原本難以彌合,譯者的專業(yè)水準(zhǔn)、語言功底和嚴(yán)謹(jǐn)程度更是參差不齊。”

          逗號(hào)抱怨:“英文雖讀得懂,但太慢、太費(fèi)勁了。”

          “多讀,讀多了就習(xí)慣了。”冒號(hào)鼓勵(lì)著,“對(duì)程序員來說,英語也是一門計(jì)算機(jī)語言。”

          問號(hào)的求知欲很強(qiáng):“AOP實(shí)現(xiàn)的機(jī)理是什么?”

          冒號(hào)回答:“如果一個(gè)程序是一個(gè)管道系統(tǒng),AOP就是在管道上鉆一些孔,在每個(gè)孔中注入新的代碼流。因此AOP實(shí)現(xiàn)的關(guān)鍵是將advice的代碼嵌入到主體程序之中,術(shù)語稱編織weaving)。這是很自然的——將問題分解之后再合成,問題才得以還原。編織可分兩種:一種是靜態(tài)編織,通過修改源碼或字節(jié)碼(bytecode)在編譯期compile-time)前后或加載期load-time)嵌入代碼;另一種是動(dòng)態(tài)編織,通過代理(proxy)等技術(shù)在運(yùn)行期run-time)實(shí)現(xiàn)嵌入。具體的工具包括一些擴(kuò)展性語言如AspectJ、AspectC++等和一些frameworkAspectWerkz、Spring、Jboss AOP等。”

          嘆號(hào)搔著頭:“聽起來挺復(fù)雜的。”

          句號(hào)說:“這些機(jī)理是AOP的實(shí)現(xiàn)者需要操心的,使用者只需關(guān)心AOP是否好用,性能如何等等。”

          冒號(hào)表示贊同:“與OOP一樣,AOP在帶來便利的同時(shí),也增加了一定的復(fù)雜度和性能損耗。它們更適用于大中型程序,用在小型程序中則不啻牛刀殺雞。”

          posted on 2008-05-11 00:00 鄭暉 閱讀(2761) 評(píng)論(17)  編輯  收藏 所屬分類: 冒號(hào)和他的學(xué)生們

          評(píng)論

          # re: 冒號(hào)和他的學(xué)生們(連載11)——切面范式 2008-05-11 08:48 12

          為什么一直抄些不是自己的東西??這些東西你了解嗎??懂嗎?  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載11)——切面范式 2008-05-11 09:47 鄭暉

          @12
          余嘗售蛋于市,一蒙面者驟至:“為何屢竊他人之蛋來此兜售?”余恐甚:“竊何人之蛋?”其支吾不語,復(fù)問:“汝知此蛋乎?”余益惑之:“倘所售者良,焉管吾知之否?”  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載11)——切面范式 2008-05-11 10:12 Happy漫步者

          不過挺有意思   回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載11)——切面范式 2008-05-11 10:51 BeanSoft

          Java,成也框架,敗也框架。有時(shí)候我只想,如果外星人也搞這么多概念啥的,那么銀河系的互聯(lián)網(wǎng)就算聯(lián)網(wǎng)了,也跟沒聯(lián)網(wǎng)差不多。其實(shí)搞概念的,一般都是大公司趁聽眾聽得云里霧里,然后伺機(jī)銷售自己的XXX軟件產(chǎn)品/解決方案,典型的例如SOA。不信的,有機(jī)會(huì)看看貴公司銷售人員的PPT,就明白了。  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載11)——切面范式 2008-05-11 11:10 lianyeyu

          有意思  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載11)——切面范式 2008-05-11 11:11 隔葉黃鶯

          我每篇都讀過,我看文章或者買書,都是認(rèn)為,只要這對(duì)我有益處何管是哪來的,或者別人對(duì)此的評(píng)論是如何。

          尤其是對(duì)于有些國人寫的書,很多人其他根本就沒怎么讀過就妄加評(píng)論。

          博主的電腦是用的寬屏的顯示器,難怪我在 1024X768 下幾乎就看不到右邊的導(dǎo)航了。  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載11)——切面范式 2008-05-11 11:21 鄭暉

          @隔葉黃鶯
          多謝仗義直言。若右邊導(dǎo)航仍不正常,煩請(qǐng)相告。  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載11)——切面范式 2008-05-11 14:16 BeanSoft

          右邊導(dǎo)航能看到,略微超邊. 1024x768.

          感覺現(xiàn)在論壇和網(wǎng)絡(luò)都彌漫不好的風(fēng)氣,就是喜歡惡意攻擊,反而愿意弄點(diǎn)資料分享的人是越來越少,有時(shí)候轉(zhuǎn)載注明出處也有人不滿,評(píng)論說:是抄xxxx的手冊(cè)吧?  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載11)——切面范式 2008-05-11 16:19 鄭暉

          @BeanSoft
          在1024x768下調(diào)整了header的寬度,不再出現(xiàn)水平滾動(dòng)條了。多謝指出問題。
          另:相比其他網(wǎng)站,blogjava的空氣已經(jīng)相當(dāng)清新了。  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載11)——切面范式 2008-05-11 19:38 三人行,必有我?guī)熝?/a>

          姑且不論內(nèi)容,樓主的文筆真的不錯(cuò),可以出書了。即使是抄,那也是青出于藍(lán)勝于藍(lán),純技術(shù)的文章我是懶得讀的,多謝樓主寫出這些有韻味的技術(shù)文章。  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載11)——切面范式 2008-05-11 19:40 三人行,必有我?guī)熝?/a>

          我機(jī)器是1680*1050的分辨率,好像標(biāo)題顯示的不對(duì),不過無傷大雅,呵呵。  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載11)——切面范式 2008-05-11 22:55 鄭暉

          @三人行,必有我?guī)熝?br>現(xiàn)在標(biāo)題在您那超寬的顯示器中也該正常了吧?  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載11)——切面范式 2008-05-12 09:41 faen

          這篇很贊啊,樓主真牛。 以前看過幾篇關(guān)于AOP的文章,說的那個(gè)切面和切入點(diǎn)什么的,一直不知所云,看完樓主的文章,感覺有點(diǎn)悟了  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載11)——切面范式 2008-05-12 10:12 binge

          終于,我決定留名于此。有些東西還是很形象的  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載11)——切面范式 2008-06-20 11:22 smilingfish

          猶如醍醐灌頂,不易。  回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載11)——切面范式[未登錄] 2008-06-28 18:10 flydream

          寫的非常不錯(cuò),希望博主再接再厲啊。
            回復(fù)  更多評(píng)論   

          # re: 冒號(hào)和他的學(xué)生們(連載11)——切面范式 2009-01-19 14:07 duxu

          如夢(mèng)方醒  回復(fù)  更多評(píng)論   

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          博客搬家:http://blog.zhenghui.org
          《冒號(hào)課堂》一書于2009年10月上市,詳情請(qǐng)見
          冒號(hào)課堂

          留言簿(17)

          隨筆分類(61)

          隨筆檔案(61)

          文章分類(1)

          文章檔案(1)

          最新隨筆

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 城固县| 车致| 孝义市| 睢宁县| 大化| 灌云县| 麟游县| 武强县| 沛县| 章丘市| 厦门市| 庆元县| 安福县| 霍邱县| 沾益县| 四会市| 年辖:市辖区| 共和县| 城口县| 深圳市| 余干县| 龙井市| 礼泉县| 平潭县| 和田市| 桃江县| 长治市| 慈利县| 翁牛特旗| 石泉县| 高碑店市| 喜德县| 航空| 开化县| 蕉岭县| 昭平县| 南开区| 大丰市| 淳安县| 茌平县| 延津县|