谈谈AOP应用层切面设计
目錄[-]
- AOP概要理解糾偏
- AOP在軟件編程中的應(yīng)用場(chǎng)景
- 傳統(tǒng)意義上的AOP
- 非傳統(tǒng)意義上的AOP
- @紅薯 的開(kāi)源中國(guó)博客1.0
- @紅薯 的開(kāi)源中國(guó)新聞1.0
- 初級(jí)AOP方式
- 高級(jí)AOP方式
- 終級(jí)解決方案
- 要解決的問(wèn)題
- 解決問(wèn)題的思路
- 更進(jìn)一步的思考
- 總結(jié)
AOP概要理解糾偏
說(shuō)到AOP,這個(gè)東東現(xiàn)在已經(jīng)不是一個(gè)新詞匯了,我們拿一下百度詞條來(lái)看看是下面的樣子的:
| 在軟件業(yè),AOP為Aspect Oriented Programming的縮寫(xiě),意為:面向切面編程,通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOP是OOP的延續(xù),是軟件開(kāi)發(fā)中的一個(gè)熱點(diǎn),也是Spring框架中的一個(gè)重要內(nèi)容,是函數(shù)式編程的一種衍生范型。利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開(kāi)發(fā)的效率。 |
但是今天我要說(shuō),這個(gè)定義太過(guò)狹義,實(shí)際上AOP的概念要比上面的定義要寬泛得多,今天我就給大家來(lái)扯扯AOP的事兒。
從AOP這三個(gè)單詞來(lái)看,它的定義還是非常準(zhǔn)確的,就是面向切面編程。但是后面的這一堆解釋:
| 通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOP是OOP的延續(xù),是軟件開(kāi)發(fā)中的一個(gè)熱點(diǎn),也是Spring框架中的一個(gè)重要內(nèi)容,是函數(shù)式編程的一種衍生范型。利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開(kāi)發(fā)的效率。 |
這明顯是鬼扯了,明顯是把一種具體的實(shí)現(xiàn)作為它定義,這就有點(diǎn)“白馬即馬”的意思了。
主要的變化就是把中間一段與具體的實(shí)現(xiàn)有關(guān)系的部分去掉。
| 通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOP是OOP的延續(xù),是軟件開(kāi)發(fā)中的一個(gè)熱點(diǎn),也是Spring框架中的一個(gè)重要內(nèi)容,是函數(shù)式編程的一種衍生范型。 |
這一段太過(guò)狹隘,已經(jīng)遠(yuǎn)遠(yuǎn)不能滿足軟件技術(shù)發(fā)展的需要了,面向切面就面向切面,與什么預(yù)編譯的方式有毛關(guān)系?與運(yùn)行期代理有毛關(guān)系?與Spring、函數(shù)式編程有毛關(guān)系?
因此,今天悠然就把AOP的概念重新縷縷:
| 在軟件業(yè),AOP為Aspect Oriented Programming的縮寫(xiě),意為:面向切面編程,通過(guò)對(duì)某一領(lǐng)域進(jìn)行高內(nèi)聚低偶合方式進(jìn)行實(shí)現(xiàn),并通過(guò)非偶合的方式與其它業(yè)務(wù)邏輯進(jìn)行整合,以對(duì)不同切面的實(shí)現(xiàn)邏輯進(jìn)行隔離,從而使得不同領(lǐng)域的實(shí)現(xiàn)邏輯之間的耦合度降低,提高程序的可重用性、提高開(kāi)發(fā)效率,同時(shí)也大大降低集成與整合難度的一種編程方法。 |
嗯嗯,雖然不一定嚴(yán)謹(jǐn),但是比原來(lái)的廣泛多了,也更能體現(xiàn)AOP的真正意涵。它不僅包含原有定義里的模式,還包含各種各樣其它AOP模式,今天悠然就來(lái)給大家試著闡述一下。
AOP在軟件編程中的應(yīng)用場(chǎng)景
傳統(tǒng)意義上的AOP
傳統(tǒng)意義上的AOP,是針對(duì)業(yè)務(wù)處理過(guò)程中的切面進(jìn)行提取,它所面對(duì)的是處理過(guò)程中的某個(gè)步驟或階段,來(lái)獲得邏輯過(guò)程中各部分之間低耦合性的一些隔離效率,比如:常見(jiàn)的應(yīng)用場(chǎng)景有:
確實(shí),AOP的應(yīng)用場(chǎng)景有許多許多,也取得了良好的應(yīng)用效果,這個(gè)已經(jīng)經(jīng)過(guò)了充分的實(shí)踐,許多書(shū)里也都進(jìn)行了充分的闡述,這里不再贅述。
非傳統(tǒng)意義上的AOP
嗯嗯,今天的重點(diǎn)是這里,別人說(shuō)得好的地方悠然說(shuō)不過(guò),因此最好的辦法就是不說(shuō),悠然說(shuō)別人不說(shuō)的地方,這樣就壓力小多了:)
以下針對(duì)@紅薯 的猜測(cè)純屬臆斷,如有雷同純屬巧合:
在正式開(kāi)始之前,我們來(lái)舉個(gè)實(shí)踐場(chǎng)景:
@紅薯 的開(kāi)源中國(guó)博客1.0
話說(shuō),在開(kāi)源中國(guó)的博客列表中,每一篇博客是像下面一樣展示的:
從這一塊內(nèi)容中,我們可以看到如下內(nèi)容:
我們從看到的這些信息里面,可以猜一下@紅薯 的表結(jié)果是怎么設(shè)計(jì)的:
表BLOG結(jié)構(gòu):
- 博客標(biāo)識(shí)
- 博客標(biāo)題
- 博客標(biāo)題內(nèi)容
- 是否原創(chuàng)
- 是否置頂
- 評(píng)論次數(shù)
- 閱讀次數(shù)
- 獲贊次數(shù)
- ....
當(dāng)然這里應(yīng)該也有一些其他的字段,我們上面的圖片里看不到,我們就當(dāng)它們不存在。
我們?cè)傧胂?#xff0c;估計(jì)@紅薯 還有詳細(xì)的記錄,比如:誰(shuí)評(píng)論的,評(píng)論的內(nèi)容是什么?誰(shuí)閱讀的,是什么時(shí)候閱讀的?誰(shuí)點(diǎn)贊的,是什么時(shí)候點(diǎn)贊的?
于是就有了下面的表:
? ? 評(píng)論詳情:
- 博客標(biāo)識(shí)
- 評(píng)論者
- 評(píng)論時(shí)間
- 評(píng)論內(nèi)容
- ...
? ? 閱讀詳情:
- 博客標(biāo)識(shí)
- 閱讀者
- 閱讀時(shí)間
? ? 點(diǎn)贊詳情:
- 博客標(biāo)識(shí)
- 點(diǎn)贊者
- 點(diǎn)贊時(shí)間
嗯嗯,@紅薯 仔細(xì)想了一想感覺(jué)差不多了的樣子,這個(gè)時(shí)候@紅薯 縷著他的頭發(fā),點(diǎn)上一支煙進(jìn)入了寫(xiě)代碼的酸爽狀態(tài)。
比如,功能是這樣寫(xiě)的:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 | //博客點(diǎn)贊 保存點(diǎn)贊(博客標(biāo)識(shí),點(diǎn)贊者標(biāo)識(shí)){ ????博客biz.添加點(diǎn)贊(博客標(biāo)識(shí),點(diǎn)贊者標(biāo)識(shí)); } class博客biz{ ?????添加點(diǎn)贊(博客標(biāo)識(shí),點(diǎn)贊者標(biāo)識(shí)){ ??????????博客dao.增加點(diǎn)贊數(shù)(博客標(biāo)識(shí)); ??????????點(diǎn)贊詳情dao.增加點(diǎn)贊詳情(博客標(biāo)識(shí),點(diǎn)贊者標(biāo)識(shí)); ?????} } |
伴隨著一陣陣歡快的噼里啪啦鍵盤(pán)聲,開(kāi)源中國(guó)博客1.0 OK了。
@紅薯 的開(kāi)源中國(guó)新聞1.0
看著開(kāi)源中國(guó)博客1.0的穩(wěn)步運(yùn)行,PV+UV雙豐收,@紅薯 縷著頭發(fā)咧著大板牙笑開(kāi)了花,那就再整個(gè)開(kāi)源中國(guó)新聞1.0唄!?于是紅薯開(kāi)始設(shè)計(jì)表結(jié)構(gòu):
表NEWS結(jié)構(gòu):
- 新聞標(biāo)識(shí)
- 新聞標(biāo)題
- 新聞標(biāo)題內(nèi)容
- 是否置頂
- 評(píng)論次數(shù)
- 閱讀次數(shù)
- 獲贊次數(shù)
- ....
當(dāng)然,考慮到新聞也有點(diǎn)贊,也有評(píng)語(yǔ),也有閱讀,于是下面的表結(jié)構(gòu)也是需要的:
? ? 評(píng)論詳情:
- 新聞標(biāo)識(shí)
- 評(píng)論者
- 評(píng)論時(shí)間
- 評(píng)論內(nèi)容
- ...
? ? 閱讀詳情:
- 新聞標(biāo)識(shí)
- 閱讀者
- 閱讀時(shí)間
? ? 點(diǎn)贊詳情:
- 新聞標(biāo)識(shí)
- 點(diǎn)贊者
- 點(diǎn)贊時(shí)間
嗯嗯,紅薯看了下,尼瑪除了少個(gè)原創(chuàng),別的都差不多的樣子么,但是不一樣還是不一樣的,那就再做一遍吧,于是一陣陣噼里啪啦之后又搞定了,紅薯抹著汗水,再仔細(xì)看一下代碼,尼瑪,怎么這兩邊的代碼幾乎一樣?感覺(jué)哪里有些不對(duì)的樣子。
管呢,先運(yùn)行起來(lái)再說(shuō),哥去泡個(gè)妹子放松一下,于是紅薯打開(kāi)了MAC,IPAD,IPHONE7S....
初級(jí)AOP方式
運(yùn)行了一段時(shí)間,紅薯覺(jué)得要加個(gè)動(dòng)態(tài)功能,發(fā)現(xiàn)要在兩邊都增加代碼,越來(lái)越覺(jué)得不對(duì)勁,于是拿起新買(mǎi)的《企業(yè)級(jí)JavaEE架構(gòu)實(shí)踐》翻看起來(lái),唉當(dāng)時(shí)看書(shū)的時(shí)候不仔細(xì),這個(gè)用切面來(lái)解決不是挺好的?
于是紅薯把表結(jié)構(gòu)重構(gòu)了一下:
? ? 評(píng)論詳情:
- 評(píng)論類型
- 評(píng)論對(duì)象標(biāo)識(shí)
- 評(píng)論者
- 評(píng)論時(shí)間
- 評(píng)論內(nèi)容
- ...
? ? 閱讀詳情:
- 閱讀類型
- 閱讀對(duì)象標(biāo)識(shí)
- 閱讀者
- 閱讀時(shí)間
? ? 點(diǎn)贊詳情:
- 點(diǎn)贊類型
- 點(diǎn)贊對(duì)象標(biāo)識(shí)
- 點(diǎn)贊者
- 點(diǎn)贊時(shí)間
另外增加一個(gè)動(dòng)態(tài)表
- 動(dòng)態(tài)類型
- 動(dòng)態(tài)對(duì)象標(biāo)識(shí)
- 動(dòng)態(tài)者
- 動(dòng)態(tài)時(shí)間
高級(jí)AOP方式
自從引入了切面功能,紅薯的工作明顯輕松多了,但是唯一不爽的是?隨著開(kāi)源中國(guó)的用戶越來(lái)越多,投資人要求功能方面也要快速推進(jìn),現(xiàn)在的紅薯幾乎已經(jīng)沒(méi)有可以縷的頭發(fā)了,投資人要增加日歷、要增加勛章、要增加TAG、要增加提醒,要增加的東西越來(lái)越多,同時(shí)開(kāi)源中國(guó)的訪問(wèn)者們的眼界又越來(lái)越寬了,要求越來(lái)越高了,今天這個(gè)做的丑了,明天那個(gè)做得不人性化了,?紅薯開(kāi)發(fā)、測(cè)試、發(fā)布、切面配置、界面調(diào)整、控制層啥都要做,這不又出問(wèn)題了:
紅薯的手習(xí)慣的抬起來(lái)縷頭發(fā)了,但是隨著OSC功能的增加,頭發(fā)已經(jīng)幾乎找不到了,紅薯狠狠的把煙屁股擰進(jìn)煙灰缸,是要徹底解決這個(gè)問(wèn)題了,看起來(lái)還得讀書(shū)啊,再翻翻《企業(yè)級(jí)JavaEE架構(gòu)實(shí)踐》,看看有沒(méi)有啥思路。
| Think Big, Start small , Scale Fast. |
| 好的軟件是品出來(lái)的。 |
仔細(xì)看了幾遍,紅薯的眼睛忽然亮了起來(lái),只要把所有的評(píng)論、點(diǎn)贊、評(píng)論、動(dòng)態(tài)、以及其它雜7雜8的東西都讓它高內(nèi)聚,低耦合,我做博客只管做博客、做新聞只管做新聞,哪怕再做他多少個(gè),也是僅僅關(guān)注我要做的東西,而把這些東西都做成一個(gè)個(gè)的切面讓這些切面去完整的解決這些問(wèn)題,這樣我不就輕松了?原來(lái)雖然也引入了AOP技術(shù),但是由于只是初級(jí)切面,所以只解決了部分問(wèn)題,并沒(méi)有徹底的解決問(wèn)題。如果我能把切面也切到控制層、界面層,這樣就可以真正的做到高內(nèi)聚、松耦合,而且是真正的業(yè)務(wù)切面。
技術(shù)的切面還是初級(jí)的,業(yè)務(wù)層級(jí)的切面才是終級(jí)的。
具體實(shí)現(xiàn)起來(lái),還是沒(méi)有什么思路,聽(tīng)聽(tīng)悠然有沒(méi)有什么思路?
終級(jí)解決方案
通過(guò)上面對(duì)開(kāi)源中國(guó)兩個(gè)功能模塊的分析,我們大致清楚了問(wèn)題的癥結(jié)所在,并通過(guò)對(duì)紅薯的心路歷程進(jìn)行分析,大致引入了問(wèn)題的解決思路,但是真正的落地卻不是那么簡(jiǎn)單的。一個(gè)問(wèn)題的抽象的程度越高,其通用性越好,但是它的易理解程度和易實(shí)現(xiàn)程度也就越難。我對(duì)實(shí)現(xiàn)者面對(duì)面多次溝通這個(gè)思路時(shí),更多的時(shí)候看到的是他們茫然的眼神,以及多次感覺(jué)理解了,但是真正實(shí)現(xiàn)的時(shí)候卻又達(dá)不到要求,直到許多次反復(fù)之后,才慢慢進(jìn)入狀態(tài)。
所以我會(huì)盡力講清楚,但是不能保證你一定能理解到我內(nèi)心所想。
要解決的問(wèn)題
我們?cè)趹?yīng)用開(kāi)發(fā)過(guò)程中,一部分是與具體的業(yè)務(wù)相關(guān)的,另外一部分它與具體的業(yè)務(wù)并不相關(guān),但是在業(yè)務(wù)過(guò)程中又是有這樣那樣關(guān)系的。如果我們能把這些與具體業(yè)務(wù)沒(méi)有直接關(guān)系,但又是對(duì)業(yè)務(wù)數(shù)據(jù)的一種維度的補(bǔ)充或描述能獨(dú)立出來(lái),想用或不想用僅在一念間,那么這個(gè)時(shí)候做軟件就是一種享受了,而且業(yè)務(wù)和切面都可以獨(dú)立變化,而不必考慮彼此的影響。
這個(gè)時(shí)候從開(kāi)發(fā)效率來(lái)說(shuō),由于大家各自高內(nèi)聚低耦合,所以開(kāi)發(fā)、測(cè)試、驗(yàn)證、發(fā)布都會(huì)方便快速許多,集成的時(shí)候由于也不必有配置和代碼及界面上的協(xié)作和引用,這樣就可以大大的降低系統(tǒng)集成過(guò)程中的開(kāi)發(fā)、測(cè)試工作,也避免了由此導(dǎo)致的一系列的可能出現(xiàn)的問(wèn)題。
那么接下來(lái),我們就用上面分析問(wèn)題時(shí)的例子來(lái)闡述,如何解決這個(gè)問(wèn)題,整個(gè)實(shí)現(xiàn)思路采用Tiny框架相關(guān)技術(shù)進(jìn)行解決,非TINY技術(shù)平臺(tái)或框架也是可以實(shí)現(xiàn)的,當(dāng)然實(shí)現(xiàn)細(xì)節(jié)可能會(huì)有不同,需要相關(guān)的架構(gòu)師進(jìn)行相應(yīng)的調(diào)整。
解決問(wèn)題的思路
每個(gè)切面的內(nèi)容都在自己的業(yè)務(wù)單元中實(shí)現(xiàn),同時(shí)要能在能出來(lái)的時(shí)候它就能出來(lái)。
這里我們就拿上面說(shuō)的一個(gè)場(chǎng)景"評(píng)論"來(lái)示例
?? 評(píng)論詳情:
- 評(píng)論類型
- 評(píng)論對(duì)象標(biāo)識(shí)
- 評(píng)論者
- 評(píng)論時(shí)間
- 評(píng)論內(nèi)容
既然是高內(nèi)聚低耦合,那當(dāng)然主是要統(tǒng)一界面的樣式。
評(píng)價(jià)的使用場(chǎng)景一般來(lái)說(shuō)是在顯示完主要業(yè)務(wù)內(nèi)容之后(如:博客、新聞、文檔、軟件、etc),可以進(jìn)行評(píng)論,可以進(jìn)行回復(fù),可以進(jìn)行引入,當(dāng)然也要能把已經(jīng)評(píng)論的內(nèi)容顯示出來(lái)。
但是需要搞清楚的是,這些內(nèi)容的展現(xiàn)與人機(jī)交互過(guò)程明顯與不同的業(yè)務(wù)內(nèi)容沒(méi)有一點(diǎn)關(guān)系,這也就為進(jìn)行切面提供了基礎(chǔ)。為了便于進(jìn)行說(shuō)明問(wèn)題,這里采用AJAX模式進(jìn)行解釋,雖然采用非AJAX方式也是可以解釋得通的,但是應(yīng)用到的技術(shù)的復(fù)雜度與解釋起來(lái)的困難都非常更加復(fù)雜。
舉個(gè)例子,做出來(lái)的效果是類似下面的樣子:
這個(gè)時(shí)候,問(wèn)題就轉(zhuǎn)換為,如何把當(dāng)前要處理的業(yè)務(wù)類型和業(yè)務(wù)數(shù)據(jù)的標(biāo)識(shí)讓評(píng)論部分知曉,這個(gè)也非常簡(jiǎn)單,只要用下面的樣子寫(xiě)一段模板即可:
?| 1 | #comment("BLOG",blog.blogId) |
嗯嗯,這個(gè)時(shí)候較以前的開(kāi)發(fā),已經(jīng)省了非常大的工作量了,只是簡(jiǎn)單的聲明一下就可以了。
更進(jìn)一步的思考
雖然上面的思路已經(jīng)比較好的解決了問(wèn)題,但是這里有一個(gè)問(wèn)題:那就是實(shí)現(xiàn)時(shí)序問(wèn)題。也就是說(shuō),博客功能是紅薯先加的,而評(píng)論功能是紅薯后加的。這里就出現(xiàn)一個(gè)問(wèn)題:為什么后增加的功能,需要我在已經(jīng)實(shí)現(xiàn)的妥妥的功能要進(jìn)行調(diào)整??這豈不是說(shuō),你后面不斷的增加功能,我這里都要不斷的進(jìn)行聲明?雖然也有一定的道理,但是是不符合好萊塢原則的。實(shí)際上也是違反常理的===我是先來(lái)的,為什么要為你一個(gè)后到的做調(diào)整?我根本就不知道你的存在好么?!
出于我們對(duì)完美架構(gòu)的追求以前我們不將就的態(tài)度,我們當(dāng)然要更好的解決此問(wèn)題。
我們可以在應(yīng)用當(dāng)中預(yù)設(shè)一些擴(kuò)展點(diǎn),但是具體擴(kuò)展些什么東西我是不管的。
這個(gè)時(shí)候,我們就可以只在界面中增加如下的一段模板語(yǔ)言:
?| 1 | #extendPoint("VIEW","BLOG",blog.blogId) |
上面的腳本表示,我這里是一個(gè)VIEW類型的擴(kuò)展點(diǎn),業(yè)務(wù)類型是BLOG,業(yè)務(wù)對(duì)象標(biāo)識(shí)是blog對(duì)象的blogId屬性。
然后由extendPoint決定往里面塞哪些東西。
這個(gè)時(shí)候,我只要在評(píng)論工程里增加如下的配置:
?| 1 2 3 4 5 | <extend-points> ????<extend-pointtype="page"order="10"> ????????#comment(bizType,bizId) ????</extend-point> </extend-points> |
我們只要增加一個(gè)留腳本的功能模塊,在這個(gè)模塊中增加下面的配置:
?| 1 2 3 4 5 | <extend-points> ????<extend-pointtype="page"order="9"> ????????#footprint(bizType,bizId) ????</extend-point> </extend-points> |
總結(jié)
通過(guò)上面的改進(jìn),紅薯同學(xué)再也不用薅頭發(fā)了,原有的業(yè)務(wù)代碼再也不用動(dòng),這功能居然自動(dòng)在所有功能中自動(dòng)出現(xiàn)了。
想到這里,悠然就深深的自責(zé),早點(diǎn)給紅薯出主意,紅薯同學(xué)的一頭黑發(fā)就留下來(lái)了。
當(dāng)然,上面只是說(shuō)了一個(gè)思想,真正的實(shí)現(xiàn)的時(shí)候用到的技術(shù)還是非常多的:- 模塊化
- AOP
- SOA(如果是互聯(lián)網(wǎng)應(yīng)用是需要的,普通的小工程可以不用)
- 模板語(yǔ)言或類似技術(shù)
如果本人沒(méi)有說(shuō)清楚,或者讀者朋友們沒(méi)有理解,本人深感自責(zé),也希望同學(xué)們能夠理解,并在下面的回復(fù)博客提問(wèn),本人定盡力給出解釋。
原文地址:?http://my.oschina.net/tinyframework/blog/604644
總結(jié)
以上是生活随笔為你收集整理的谈谈AOP应用层切面设计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android dex分包方案 (多de
- 下一篇: Android 大牛开发者博客列表