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

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

聊Javascript中的AOP編程

瀏覽:21日期: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久久,三上悠亚国产精品一区二区三区
日韩在线一区二区| 久久激情中文| 国产一区二区中文| 日韩免费看片| 亚洲网站视频| 性欧美精品高清| 一区二区三区四区在线观看国产日韩 | 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美freesex黑人又粗又大| www.九色在线| 欧美精品一区二区久久| 中文字幕日韩高清在线| 日韩欧美久久| a国产在线视频| 日韩视频一区| 日韩av中文在线观看| 丰满少妇一区| 日韩不卡在线| 亚欧洲精品视频在线观看| 欧美欧美黄在线二区| 国产亚洲精品美女久久久久久久久久| 国产亚洲人成a在线v网站 | 韩国精品主播一区二区在线观看 | 欧美成a人国产精品高清乱码在线观看片在线观看久 | 亚洲综合激情在线| 日本亚洲欧美天堂免费| 国产成人精选| 日韩精品中文字幕吗一区二区| 老司机精品视频在线播放| 亚洲成av在线| 国产精品日本一区二区不卡视频 | 日韩综合一区| 亚洲欧美日韩国产综合精品二区| 国产乱人伦精品一区| 91精品一区国产高清在线gif| 亚洲精品麻豆| 日韩成人亚洲| 国产精品videossex久久发布 | 国产调教一区二区三区| 亚洲黄色中文字幕| 亚州av日韩av| 国产一级久久| av资源亚洲| 国产一区福利| 国产欧美日韩精品一区二区免费 | 日韩国产91| 久久av在线| 嫩草伊人久久精品少妇av杨幂 | 久久国内精品自在自线400部| 久久久一二三| 国产免费av一区二区三区| 视频一区视频二区在线观看| 日韩综合在线| 麻豆精品久久久| 久久av免费| 国产乱码精品| 国产欧美一级| 日韩成人午夜精品| 亚洲一区网站| 制服诱惑一区二区| 黑丝美女一区二区| 国产一区国产二区国产三区| 国产精品入口久久| 国产无遮挡裸体免费久久| 亚欧成人精品| 日韩av网站免费在线| 亚洲精品美女| 日本精品国产| 欧美伊人影院| 国产精品jk白丝蜜臀av小说| 欧美一级网址| 国产精品密蕾丝视频下载| 日本aⅴ亚洲精品中文乱码| 日产欧产美韩系列久久99| 伊人精品久久| 日本不卡一区二区| 亚洲最大av| 欧美三区不卡| 精品视频91| 亚洲四虎影院| 国产精品中文字幕制服诱惑| 国产精品v日韩精品v欧美精品网站| 久久99久久人婷婷精品综合| 国产精品高清一区二区| 国产精品久久久久久久久久10秀 | 日韩一区电影| 91精品福利| 欧美自拍一区| 新版的欧美在线视频| 伊人影院久久| 欧美日韩午夜| 欧美日韩精品免费观看视频完整| 日本成人在线视频网站| 精品久久久中文字幕| 蜜桃一区二区三区| 国产日韩欧美一区二区三区在线观看 | 9久re热视频在线精品| 日本视频一区二区| 日韩一区电影| 日韩**一区毛片| 精品国内亚洲2022精品成人| 欧美+日本+国产+在线a∨观看| 男人操女人的视频在线观看欧美 | 免费日韩av片| 四季av一区二区凹凸精品| 亚洲最新av| 亚洲午夜电影| 97精品在线| 日韩激情一二三区| 久久在线电影| 精品中文字幕一区二区三区四区| 香蕉成人久久| 亚洲天堂成人| 国产一区二区三区精品在线观看| 一本色道精品久久一区二区三区| 国产精品久久久久久久久久妞妞 | 91精品电影| 岛国av在线网站| 国产伦精品一区二区三区千人斩 | 黄色aa久久| 国产欧美高清视频在线| 综合激情婷婷| 欧洲亚洲一区二区三区| 亚洲综合激情在线| 国产专区精品| 中文精品视频| 中文字幕在线官网| 国产欧美激情| 卡一卡二国产精品| 国产精品大片免费观看| 日本在线视频一区二区| 亚洲成人免费| 亚洲一级高清| 一区二区三区四区在线看| 国产一区二区三区探花| 国产日韩一区二区三区在线| 蜜臀精品久久久久久蜜臀| 精品国产欧美日韩| 日韩在线a电影| 日本精品一区二区三区在线观看视频| 日产精品一区| 九九久久国产| 天堂а√在线最新版中文在线| 国产精品一区二区免费福利视频| 日韩精品一区二区三区中文字幕| 亚洲一级黄色| 天堂av在线一区| 视频在线在亚洲| 婷婷五月色综合香五月| 国产精品密蕾丝视频下载| 国产精品15p| 日韩精品电影| 亚洲精品123区| 日本亚洲三级在线| 国产欧美自拍| 97精品国产| 亚洲欧美日本日韩| 欧美一级一区| 亚洲午夜天堂| 精品1区2区3区4区| 亚洲精品一级二级| 99国产精品自拍| 欧美日韩一区二区国产| 久久久久久色 | 伊人久久大香伊蕉在人线观看热v| 91欧美极品| 日韩免费一区| 91九色综合| 欧美日韩国产高清电影| 国产日本精品| 亚洲网站视频| 麻豆免费精品视频| 国产综合视频| 日韩精品视频在线看| 色婷婷精品视频| 国产精品一区二区av交换| 欧美日韩一二| 麻豆精品在线| 日本免费在线视频不卡一不卡二| 欧美日韩精品免费观看视完整| 久久国产精品久久w女人spa| 91亚洲国产高清| 麻豆国产一区| 欧美日本一区| 亚洲精品影视| 亚洲精品日本| 午夜精品影视国产一区在线麻豆| 久久精品不卡| 国产亚洲精品精品国产亚洲综合| 六月天综合网| 性一交一乱一区二区洋洋av| 激情综合在线| 久久男人av资源站| 日韩一区欧美二区| 视频一区欧美日韩| 欧美一区二区三区激情视频| 国产一区二区三区久久| 吉吉日韩欧美| 久久三级中文| 中国字幕a在线看韩国电影|