日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

聊Javascript中的AOP編程

瀏覽:17日期:2023-11-21 16:47:32
 Duck punch

我們先不談AOP編程,先從duck punch編程談起。

如果你去wikipedia中查找duck punch,你查閱到的應該是monkey patch這個詞條。根據解釋,Monkey patch這個詞來源于 guerrilla patch,意為在運行中悄悄的改變代碼,而 guerrilla 這個詞與 gorilla 同音,而后者意又與monkey相近(前者為“猩猩”的意思),最后就演變為了monkey patch。

如果你沒有聽說過duck punch,但你或許聽說過duck typing。舉一個通俗的例子,如何辨別一只鴨子:

When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.

沒錯,如果我發現有一類動物像鴨子一樣叫,像鴨子一樣游泳,那么它就是一只鴨子!

聊Javascript中的AOP編程

這個檢測看上去似乎有一些理所當然和無厘頭,但卻非常的實用。 并且在編程中可以用來解決一類問題——對于Javascript或者類似的動態語言,如何實現“接口”或者“基類”呢?我們可以完全不用在乎它們的過去如何,我們只關系在使用它們的時候,方法的類型或者參數是否是我們需要的:

var quack = someObject.quack;if (typeof quack == "function" && quck.length == arguLength){ // This thing can quack}

扯遠了,其實我想表達的是duck punch其實是由duck typing演化而來的:

if it walks like a duck and talks like a duck, it’s a duck, right? So if this duck is not giving you the noise that you want, you’ve got to just punch that duck until it returns what you expect.

當你想一只鴨子發出驢的叫聲怎么辦,揍到它發出驢的叫聲為止……話說這讓我想到一個非常形象的笑話:

為了測試美國、香港、中國大陸三地警察的實力, 聯合國將三只兔子放在三個森林中,看三地警察誰先找出兔子。任務:找出兔子。 (中間省略……) 最后是某國警察,只有四個,先打了一天麻將,黃昏時一人拿一警棍進入森林,沒五分鐘,聽到森林里傳來一陣動物的慘叫,某國警察一人抽著一根煙有說有笑的出來,后面拖著一只鼻青臉腫的熊,熊奄奄一息的說到:“不要再打了,我就是兔子……”

雖然duck punch有些暴力,但不失為一個有效的方法。落實到代碼上來說就是讓原有的代碼兼容我們需要的功能。比如Paul Irish博客上的這個例子:

/** 我們都知道jQuery的`$.css`方法可以通過使用顏色的名稱給元素進行顏色賦值。 但jQuery內置的顏色并非是那么豐富,如果我們想添加我們自定義的顏色名稱應該怎么辦?比如我們想添加`Burnt Sienna`這個顏色*/(function($){// 把原方法暫存起來: var _oldcss = $.fn.css; // 重寫原方法: $.fn.css = function(prop,value){// 把自定義的顏色寫進分支判斷里,特殊情況特殊處理if (/^background-?color$/i.test(prop) && value.toLowerCase() === 'burnt sienna') { return _oldcss.call(this,prop,'#EA7E5D');// 一般情況一般處理,調用原方法} else { return _oldcss.apply(this,arguments);} };})(jQuery);// 使用方法:jQuery(document.body).css('backgroundColor','burnt sienna')

同時可以推倒出duck punch的模式不過如此:

(function($){ var _old = $.fn.method; $.fn.method = function(arg1,arg2){if ( ... condition ... ) { return ....} else { // do the default return _old.apply(this,arguments);} };})(jQuery);

但是這么做有一個問題:需要修改原方法。這違背了“開放-封閉”原則,本應對拓展開放,對修改關閉。怎么解決這個問題呢?使用AOP編程。

 AOP入門

AOP全稱為Aspect-oriented programming,很明顯這是相對于Object-oriented programming而言。Aspect可以翻譯為“切面”或者“側面”,所以AOP也就是面向切面編程。

怎么理解切面?

在面向對象編程中,我們定義的類通常是領域模型,它的擁有的方法通常是和純粹的業務邏輯相關。比如:

Class Person{ private int money; public void pay(int price) { this.money = this.money - price; }}

但通常實際情況會更復雜,比如我們需要在付款的pay方法中加入授權檢測,或者用于統計的日志發送,甚至容錯代碼。于是代碼會變成這樣:

Class Person{ private int money public void pay(price) {try { if (checkAuthorize() == true) {this.money = this.money - price; sendLog(); }}catch (Exception e){} }}

更可怕的是,其他的方法中也要添加相似的代碼,這樣以來代碼的可維護性和可讀性便成了很大的問題。我們希望把這些零散但是公共的非業務代碼收集起來,更友好的使用和管理他們,這便是切面編程。切面編程在避免修改遠代碼的基礎上實現了代碼的復用。就好比把不同的對象橫向剖開,關注于內部方法改造。而面向對象編程更關注的是整體的架構設計。

實現

在上一節中介紹的duck punch與切面編程類似,都是在改造原方法的同時保證原方法功能。但就像結尾說的一樣,直接修改原方法的模式有悖于面向對象最佳實踐的原則。

Javascript可以采用裝飾者模式(給原對象添加額外的職責但避免修改原對象)實現AOP編程。注意在這里強調的是實現,我進一步想強調的是,切面編程只是一種思想,而裝飾者模式只是實踐這種思想的一種手段而已,比如在Java中又可以采用代理模式等。切面編程在Java中發揮的余地更多,也更標準,本想把Java的實現模式也搬來這篇文章中,但不才Java水平有限,對Java的實現不是非常理解。在這里就只展示Javascript的實現。

AOP中有一些概念需要介紹一下,雖然我們不一定要嚴格執行

joint-point:原業務方法;advice:攔截方式point-cut:攔截方法

關于這三個概念我們可以串起來可以這么理解:

當我們使用AOP改造一個原業務方法(joint-point)時,比如加入日志發送功能(point-cut),我們要考慮在什么情況下(advice)發送日志,是在業務方法觸發之前還是之后;還是在拋出異常的時候,還是由日志發送是否成功再決定是否執行業務方法。

比如gihub上的meld這個開源項目,就是一個很典型的AOP類庫,我們看看它的API:

// 假設我們有一個對象myObject, 并且該對象有一個doSomething方法:var myObject = { doSomething: function(a, b) {return a + b; }};// 現在我們想拓展它,在執行那個方法之后打印出剛剛執行的結果:var remover = meld.after(myObject, 'doSomething', function(result) { console.log('myObject.doSomething returned: ' + result);});// 試試執行看:myObject.doSomething(1, 2); // Logs: "myObject.doSomething returned: 3"http:// 這個時候我們想移除剛剛的修改:remover.remove();

由此可以看出,AOP接口通常需要三個參數,被修改的對象,被修改對象的方法(joint-point),以及觸發的時機(adivce),還有觸發的動作(point-cut)。上面說了那么多的概念,現在可能要讓各位失望了,Javascript的實現原理其實非常簡單

function doAfter(target, method, afterFunc){ var func = target[method]; return function(){var res = func.apply(this, arguments);afterFunc.apply(this, arguments);return res; };}

當然,如果想看到更完備的解決方案和代碼可以參考上面所說的meld項目

 結束語

這一篇一定讓你失望了,代碼簡單又寥寥無幾。本篇主要在于介紹有關duck和AOP的這幾類思想,我想編程的樂趣不僅僅在于落實在編碼上,更在于整個架構的設計。提高代碼的可維護性和可拓展性會比高深莫測的代碼更重要。

其實上面

 參考文獻:How to Fulfill Your Own Feature Request -or- Duck Punching With jQuery!Duck Punching JavaScript - Metaprogramming with PrototypeDoes JavaScript have the interface type (such as Java’s ‘interface’)?AOP技術基礎
標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
91精品国产自产在线观看永久∴| 伊人久久亚洲美女图片| 欧美日韩尤物久久| 国产成人免费| 不卡专区在线| 激情欧美一区| 亚洲精品极品| 国产成人免费| 性色av一区二区怡红| 亚洲精品日本| 国际精品欧美精品| 欧美亚洲国产精品久久| 日韩精品视频在线看| 国产探花在线精品一区二区| 精品成av人一区二区三区| 久久婷婷久久| 亚洲精选成人| 精品一区二区三区的国产在线观看| 国产 日韩 欧美一区| 999久久久精品国产| 亚洲精品国模| av免费不卡国产观看| 老牛影视一区二区三区| 日韩一区二区在线免费| 精品在线播放| 欧美a一区二区| 国产精品女主播一区二区三区| 国产一区二区三区91| 91精品99| 精品91福利视频| 亚州av一区| 久久久久国产| 久久久国产精品网站| 视频在线观看91| 激情偷拍久久| 国产精品一区二区中文字幕| 亚洲激情久久| 国产a亚洲精品| 国产欧美一区二区三区精品观看| 蜜桃视频第一区免费观看| 国产精品v一区二区三区| 天堂成人免费av电影一区 | 欧美jjzz| 国产不卡一区| 日本午夜精品一区二区三区电影| 日本va欧美va精品发布| 欧美日韩精品免费观看视欧美高清免费大片| 国产日韩一区二区三区在线播放| 亚洲毛片在线免费| 久久国产精品成人免费观看的软件| 福利一区和二区| 精品久久一区| 国产精品自在| 一区二区高清| 亚洲日本欧美| 亚洲精品自拍| 日韩美女精品| 青青在线精品| 日韩高清不卡在线| 亚洲日本三级| 日韩激情综合| 久久精品超碰| 国产精品欧美在线观看| 久久av资源| 国产精品黄色片| 激情综合婷婷| 99久久亚洲精品| 日韩一区二区免费看| 香蕉视频成人在线观看| 午夜性色一区二区三区免费视频| 欧美专区一区| 久久av资源| 日韩国产一区| 好看不卡的中文字幕| 亚洲精品影院在线观看| 91精品一区| 一区二区三区四区日本视频| 久久要要av| 色8久久久久| 成人在线视频免费| 亚洲综合欧美| 国产精品欧美大片| 欧美日韩激情| 四虎精品一区二区免费| 影视先锋久久| 91国内精品| 国产网站在线| 亚洲免费一区三区| 日韩av字幕| 99精品视频在线| 欧美在线日韩| 蜜桃国内精品久久久久软件9| 日韩精品中文字幕一区二区| 美女视频黄免费的久久| 欧美1级日本1级| 国产黄色精品| 视频在线在亚洲| 蜜桃视频在线网站| 91成人小视频| 黑丝一区二区| 丝袜av一区| 国产自产自拍视频在线观看| 日本va欧美va瓶| 蜜臀av免费一区二区三区| 欧美激情三区| 国内揄拍国内精品久久| 中文字幕一区二区三区四区久久| 色综合视频一区二区三区日韩| 亚洲欧美久久久| 在线看片国产福利你懂的| 国产美女精品视频免费播放软件| 天堂av在线一区| 黑人精品一区| 久久久亚洲欧洲日产| 欧美在线日韩| 日韩三级一区| 亚洲免费福利一区| 国产激情在线播放| 欧美自拍一区| 国产亚洲第一伦理第一区| 亚洲精品影视| 欧美一级二级三级视频| 欧美日韩 国产精品| 国产毛片精品| 精品日韩一区| 国产精品久久久久久久免费观看 | 精品国产一区二区三区性色av| 国产精品一线天粉嫩av| 亚洲精品日本| 国产精成人品2018| 国产伦久视频在线观看| 在线亚洲欧美| 午夜一级久久| 日韩国产高清在线| 欧美国产先锋| 久久久精品久久久久久96| 亚洲成人日韩| 日本免费在线视频不卡一不卡二| 国产99在线| 999国产精品永久免费视频app| 亚洲乱亚洲高清| 日韩精品亚洲专区| 精品伊人久久| 亚洲二区精品| 免费一级片91| 美女久久精品| 国产亚洲激情| 国产精品66| 国产99精品一区| 日韩欧美高清一区二区三区| 高潮一区二区| 美女精品一区| 日韩在线观看一区| 欧美精品一区二区三区精品| 欧美片网站免费| 欧美va天堂在线| 天堂√中文最新版在线| 99国产精品久久久久久久| 国产精品调教| 先锋亚洲精品| 欧美va天堂在线| 噜噜噜久久亚洲精品国产品小说| 久久中文视频| 久久精品国产亚洲夜色av网站| 国产一区亚洲| 久久精品xxxxx| 久久精品国产久精国产| 精品国产黄a∨片高清在线| 91嫩草亚洲精品| 99久久九九| 亚洲免费婷婷| 久久亚洲电影| 国产欧美自拍| 日韩毛片视频| 中文日韩欧美| 日本va欧美va精品发布| 在线日韩视频| 亚洲一区二区动漫| 日本欧美不卡| 不卡av一区二区| 午夜精品影视国产一区在线麻豆| 免费不卡中文字幕在线| 国产欧美另类| 成人精品国产亚洲| 国产欧美午夜| 狠狠躁少妇一区二区三区| 国产精品99久久免费| 国产在线观看91一区二区三区| 国产午夜精品一区二区三区欧美| 麻豆精品在线播放| 在线中文字幕播放| 欧美日韩国产高清电影| 日本蜜桃在线观看视频| 亚洲天堂久久| 中文字幕一区二区三区在线视频| 久久婷婷亚洲| 免费的成人av| 丝袜亚洲精品中文字幕一区| 久久的色偷偷| 亚洲精品网址|