AOP之我見

          近來研究AOP,在了解其實現如AspectJSpring等之余,也多了些思索.

          早晨一覺醒來,頓覺精神氣爽,再看時間還早,也就躺床上閉目養神.而思維此時卻象脫韁的野馬,縱橫馳騁,不知不覺就想到我所從事和鐘愛的軟件上來.忽發奇想:其實軟件的最終目標就是模擬真實世界,甚至進一步說就是創造世界(看過Matrix的朋友應該能理解).所以OOP,AOP或今后將出現的什么新的軟件思想也都只是這一進程中的小浪花而已,而他們的出現及發展,也就是為了更好的模擬我們的生活.

                 OOP的出現之所以被稱為一個很大的突破,正因為它很大程度上符合世界的構成.java “Everything is object”之說,正是有了Object這個有利的武器,使得我們在用OOP表現世界的某些方面時能夠得心應手.但我們世界除了Object還有很多其它的東西,比如道德,法律,規范,規律……AOP的出現正是模擬這些方面.

                 以我們最熟悉的對象作為考察的對象.人做為對象由多個對象組成,如手,眼……我們作為世界的個體,首先守很多規律的制約.如萬有引力定律,牛頓三大定律……這些規律是無處不在的,任何人都無法去避免或改變.還有法律,這是人為擬定的對某些個體具有約束性的規范,如果相應個體違法,則會受到法律的制裁.注意這里是某些個體”,各國的法律只在本國范圍內有效,不同的法律又有不同的受眾.這樣對個體而言,你就受到某些法律的約束.你知道法律可以決定去遵守或違背它,而你不知道,法律也是客觀存在,你不去違背,可能根本感受不到它,而在你即使毫不知情的情況下違背時,它也會顯示它的威力.至于如道德或規范等,其強制性不如法律,但就與個體的相互關系而言其實與法律完全一樣.

                 如果從程序的角度來實現上面的相互關系.僅用OOP的思想,就會非常的困難.先說這些定律,他們無時不在,無處不在,只是看什么定律對你當前的行為有影響.如你要上上網,聽聽歌,可能感受不到萬有引力定律和牛頓定律的存在,而你要從12層的樓往下跳試試,萬有引力定律和牛頓定律直接決定了你的生死.用程序實現上上網,聽聽歌或跳跳樓都可做到.你聽歌可以計算對耳膜的震動量,音樂對你神經的刺激量;上網可以計算你頸部僵硬時間的長短,計算你網上泡mm的興奮度;跳樓則根據萬有引力定律計算你墜地時的速度和對身體觸地部位的沖量.在這些行為中,人是同一個人,也就是同一個對象,只是行為不同,也就是方法不同.那執行不同的方法時要遵循不同的定律.如果用OO的思想我們把定律抽象為對象,則定律起作用就是定律對象的方法被調用.同一個對象,在調用不同的方法時,要明確什么定律起主要作用,就必須要把相應定律接口申明到自己方法體中去.這樣就形成了耦合!當然使用Design Pattern能將這種耦合變成松耦合,如使用Observer模式,但即使這樣也會有很多的問題:如果同時多個定律起作用,或定律起作用有先后順序,或這些定律沒法形成一個統一的父類接口……還有observer模式其實也是主動的模式,它依賴于對象要主動notify這些observer.

          更有意思的是,如果一只雞或一只鴨從樓上掉下去,它也要遵守萬有引力定律和牛頓定律,而且計算方式與人完全一樣.如果用OOP的思想,一是使用繼承,定義一個父類,由它實現高處落下時的邏輯,這樣子類就可以自動獲得這些邏輯,但這樣勢必將因為影響行為的定律的復雜性,而帶來類層次的復雜性;二是使用代理,東西由高處落下就交給一個delegate對象去處理,而這樣需要多少種delegate對象,每用一個delegate對象,就意味著當前對象耦合了一個delegate對象,結果對象的耦合性越來越強.

          那么換個角度想,如果真有一個上帝,它監控著所有的對象,只要某一個對象從高處落下,它就把萬有引力定律和牛頓定律用到這個對象身上,而不管這個對象是否知道這兩個定律.這樣對象與這兩個定律完全解耦合,它只管做自己的事,比如一個人從窗臺跳下去, 萬有引力定律和牛頓定律也起作用,但他沒有什么損傷,接著就騎輛車上街去了……上街是這個人的主要目的,跳窗臺也許是為圖一時方便,下次他也許就不跳了.但只要他跳了,就得由上帝用萬有引力定律和牛頓定律計算一下,如果窗臺很高,計算結果或許就是他骨折了,只能躺醫院去.這個上帝就是自然規律.我們可能感覺不到它的存在,但它確實在那里,只要條件被觸發,它就會起作用,不依賴于任何個體.

          AOP正是這個上帝在程序世界的體現.一個Aspect就是一條定律或規范及其執行策略.對普適定律而言,他對所有系統中的對象起作用.而一些法律,比如未成年人法就只對未成年人起作用,一些規定比如車輛經過收費站要收費,卻對公車無效.一個Aspectpointcut就類似這些定律或法律或規定起作用的條件,它能確定對象的范圍,對象的行為,并將一些特權階級,特權行為剔除出去.advice就是他們的執行了.
              對AOP的具體語法,我不想涉及,大家很容易找到資料.我希望的是能有很多的人談談自己對AOP的認識,我的觀點也許也很片面,希望通過討論更加的完善.

          posted on 2005-08-10 13:59 pesome 閱讀(2234) 評論(10)  編輯  收藏 所屬分類: AOP

          評論

          # re: AOP之我見 2005-08-12 01:12 I love java!

          哈哈,有意思  回復  更多評論   

          # re: AOP之我見 2005-08-12 12:30 haozidong

          雖然說得有些多,但很正確的,吼吼  回復  更多評論   

          # re: AOP之我見 2005-09-05 23:02 airlink

          糾正一下。。 赫赫,萬有引力不是被觸發的,它總是在那兒的。。。  回復  更多評論   

          # re: AOP之我見 2005-09-06 09:16 pesome

          呵呵,謝謝閱讀。萬有引力的確總在這兒,但如果在平地上,重力和地面的彈力抵消,可以看作不起作用。而在空中就只有重力其作用,所以可以看作觸發了,呵呵!  回復  更多評論   

          # re: AOP之我見 2005-10-03 16:02 greenwater

          呵呵,再接再厲!  回復  更多評論   

          # re: AOP之我見 2005-10-19 22:02 joovle

          不錯阿,支持原創。  回復  更多評論   

          # re: AOP之我見 2006-01-30 20:11 ihybily

          有意思 我也剛剛開始看AOP 加油加油
            回復  更多評論   

          # re: AOP之我見 2006-04-15 12:13 一木

          恩,說的很有趣!  回復  更多評論   

          # re: AOP之我見 2006-12-14 11:49 hellostone

          很好很好。我不懂AOP的,如果你說的事正確的。那真是有意思啊。謝謝啦  回復  更多評論   

          # re: AOP之我見 2007-02-28 11:13 acer2006@hotmail.com

          有好多人說OOP跟AOP一點關系都沒有,而你卻說關系很大,可能個人站的立場不同.
          我認為了面向對象OOP是個通過繼承的多條豎線的話,那么AOP其實就是一條橫穿這些豎線的一條直線,或者說條直線有交叉的,也有不交叉的.隨便說著玩的,呵呵!  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
          相關文章:
           
          <2005年8月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導航

          統計

          公告

          主要記錄作者在學習java中的每一步足跡。除非特別說明,所有文章均為本blog作者原創,如需轉載請注明出處和原作者,如用于商業目的,需跟作者本人聯系。
          歡迎大家訪問:

          常用鏈接

          留言簿(16)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          java技術

          人間百態

          朋友們的blog

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 萍乡市| 中牟县| 延庆县| 南郑县| 西安市| 沙坪坝区| 平远县| 瓦房店市| 金阳县| 武夷山市| 南澳县| 北海市| 竹溪县| 桑植县| 宜昌市| 厦门市| 亳州市| 顺义区| 霍城县| 墨脱县| 贵港市| 微山县| 通榆县| 邯郸县| 景洪市| 南安市| 甘泉县| 泰兴市| 怀柔区| 博爱县| 军事| 瑞丽市| 上犹县| 皮山县| 浙江省| 柞水县| 湾仔区| 内丘县| 无极县| 河津市| 铁力市|