yui3的AOP(面向切面編程)和OOP(面向?qū)ο缶幊?
首先請(qǐng)把手放胸前成沉思狀:我上了生活,還是被生活上了自己?
沒(méi)想出答案把,恩,可以讀下文了。從語(yǔ)義角度講,同一事物的不同表述可以反映人的主觀視角的不同,從哲學(xué)角度將,世界觀影響方法論,我們看事物的角度不同,有時(shí)會(huì)得出截然相悖的結(jié)論,從而會(huì)影響我們的做事方式和行為準(zhǔn)則,現(xiàn)實(shí)生活如此,在豐富多彩的編程語(yǔ)言中更是如此,編程模式充滿了對(duì)現(xiàn)實(shí)世界的各種模擬,包括是面向過(guò)程,面向?qū)ο?,還有面向切面。我們大概已經(jīng)非常熟悉面向過(guò)程和面向?qū)ο螅忻娴挠⑽氖茿spects(有時(shí)譯作方面,我感覺(jué)用切面更能貼切的表達(dá)Aspects的內(nèi)涵)。
有關(guān)AOP的鏈接看這里:
http://en.wikipedia.org/wiki/Aspect-ori ... rogramming
YUI3中的自定義事件實(shí)現(xiàn)了AOP
http://developer.yahoo.com/yui/3/event
什么是切面?舉個(gè)簡(jiǎn)單的例子,每天我們上下班擠地鐵坐公交和女朋友約會(huì)上網(wǎng)吧打游戲去電影院看電影……,一天要做很多事情,每個(gè)人都是一個(gè)Object,我們做的每件事情都是這個(gè)Object的方法,比如,
甲.上班();
乙.坐地鐵();
丙.看電影();
其實(shí)可以換個(gè)角度看,公司需要員工來(lái)上班,軌道交通需要每個(gè)人去乘坐,電影院給每個(gè)人放電影。這樣就變成了:
公司.need(甲)
地鐵.carry(乙);
電影院.放電影給(丙);
這樣看來(lái),不僅甲乙丙每個(gè)個(gè)體都是一個(gè)對(duì)象,公司、地鐵、電影院也是對(duì)象,這種抽象就是傳統(tǒng)的面向切面。而在js編程中,程序一般都不大,所以大概不會(huì)到達(dá)非要使用切面級(jí)別的抽象的程度。但其基于事件驅(qū)動(dòng)的原理則很容易讓人聯(lián)想到AOP,上個(gè)例子在js中就可能是:
someone.dosth();//OOPobject.fire('event',someone);//AOP
如果脫離上下文來(lái)看,上面的代碼依然語(yǔ)義牽強(qiáng)。只是很多js框架把切面編程的邊緣特性封裝成方法,對(duì)人造成了很多誤導(dǎo)。比如事件的綁定。當(dāng)函數(shù)foo執(zhí)行結(jié)束的時(shí)候執(zhí)行myfoo,在不修改foo的基礎(chǔ)上來(lái)添加對(duì)foo的監(jiān)聽(tīng),
var foo = function(){ //some code here }; jQuery.aop.after(foo,function(){ //added code here });
jquery和prototype都實(shí)現(xiàn)了這種簡(jiǎn)單的函數(shù)綁定。jquery的aop在這里。但在yui3中,AOP則被提升至自定義事件的一種內(nèi)在機(jī)制,在源碼中隨處可見(jiàn)。這在理解yui3的代碼重用機(jī)制是很有幫助的。也正是得益于這種抽象使得yui3的自定義事件異常強(qiáng)大和靈活。和OOP相比,AOP的優(yōu)點(diǎn)是非侵入式的“裝飾”,但在多數(shù)情況下,并不推薦首先使用AOP來(lái)寫(xiě)代碼。來(lái)看這個(gè)例子:每個(gè)人的生活習(xí)慣很類似,這里用四種行為為例,上學(xué),放學(xué),泡妞,打游戲,甲的生活規(guī)律很正常,每種事件發(fā)生的概率是一樣的,乙是個(gè)貪玩的小孩,只會(huì)去網(wǎng)吧打游戲和泡妞,丙是一個(gè)愛(ài)學(xué)習(xí)的小孩,從不泡妞和打游戲,丁是一個(gè)經(jīng)歷超級(jí)旺盛的另類,每次都是同時(shí)干兩件事情,上學(xué)的時(shí)候泡妞,放學(xué)的時(shí)候打游戲。這里用div代表每個(gè)人,用onmouseover來(lái)觸發(fā)每個(gè)事件。
用OOP的方法那么程序結(jié)構(gòu)應(yīng)該是這樣:
代碼在這里:yui_oop.htm
這里的"古怪人"繼承自"正常人"的時(shí)候,是通過(guò)代碼重寫(xiě)的方法來(lái)達(dá)到重載的目的,這里明顯違反了非侵入性原則。再來(lái)看AOP的思路:
代碼在這里:yui_aop.htm
這里抽象出了事件發(fā)布工廠,用來(lái)專門處理事件的發(fā)布,由其生成的生活軌跡對(duì)象對(duì)每個(gè)人進(jìn)行監(jiān)聽(tīng),捕捉每個(gè)人的各種行為。工廠在生成‘古怪人生活軌跡'的時(shí)候使用了上文提到的函數(shù)的監(jiān)聽(tīng)綁定,這種綁定是非侵入性的,可以很好的和工廠解耦。從這個(gè)例子中比較OOP和AOP,兩者復(fù)雜度差不多,但AOP思路更開(kāi)闊,代碼也更靈活一些。
相關(guān)文章
Javascript YUI 讀碼日記之 YAHOO.util.Dom - Part.2 0
繼續(xù)在 YAHOO.util.Dom 中徘徊。由于 YAHOO.util.Dom 多次調(diào)用 batch 方法,所以先看看這個(gè)函數(shù)是怎么寫(xiě)的。有關(guān) batch 的用法,可以參見(jiàn)這里,相關(guān)的代碼如下2008-03-03ext form 表單提交數(shù)據(jù)的方法小結(jié)
Ext 表單提交數(shù)據(jù)的三種方法小結(jié),方便利用ext提交數(shù)據(jù)的朋友2008-08-08javascript 放大鏡 v1.0 基于Yui2 實(shí)現(xiàn)的放大鏡效果
javascript 放大鏡 v1.0 基于Yui2 實(shí)現(xiàn)的放大鏡效果代碼。2010-03-03Ext面向?qū)ο箝_(kāi)發(fā)實(shí)踐代碼
這是自己在學(xué)習(xí)Ext過(guò)程中一個(gè)寫(xiě)的一個(gè)示例程序,僅為練習(xí),功能并不全,現(xiàn)將其記錄在我的博客中,希望可以和學(xué)習(xí)Ext的朋友一起分享2008-11-11如何簡(jiǎn)單地用YUI做JavaScript動(dòng)畫(huà)
如何簡(jiǎn)單地用YUI做JavaScript動(dòng)畫(huà)...2007-03-03