AOP C#在行動

看過一本書,題目是《AscpectJ in Action》,正好這一段手上的項目搞一段落,所以有一點點空暇,決定寫一些東西。

AOP是Aspect-Oriented Programming的簡寫。曾經爲這個Aspect的中文翻譯傷透了腦筋,還有一個相似的AOP,那是Attribute-Oriented Programming,於是,有人譯作面向方面編程,後者則是面向特性編程。面向特性編程可以說得過去,總覺得面向方面編程翻譯的有些怪,一則中文理解不通:什麼叫面向方面?或者按臺灣的習慣“方面導向”?哈,不知所云。一個偶然的想法,Aspect又作形態解,這個形態不是我們平時所說的意識形態中的形態,那是思想中的形態,是無形的,這個形態是指對象表現出來的某種形式(它的行爲、特徵等)。所以,我個人認爲AOP翻譯爲面向形態編程似乎更爲合適。

AOP的研究逐漸成爲熱門,有關AOP的描述,在CSDN文章中也有人做了比較詳細的描述,也有一些對描述的爭論。《AspectJ in Action》的描述我認爲最爲經典,理由是:該書是AspectJ開發者的手筆,而AspectJ目前也是最成熟AOP的工具之一。

對方法調用的攔截,有人把它作爲對AOP的解釋,同大多數人一樣,我不這樣認爲。AOP的主要作用是解決對象之間的橫向關係,一種正交的錯綜複雜的關係。傳統的OOP不能很好的或者說是很容易的解決這個問題。這就是AOP有機會得以發揚光大的原因之一。那麼AOP是如何解決這個問題呢?編織(Weave),把對象間的相關行爲按照特定的規則編織到一起。而前面提到的攔截僅僅是爲完成編織而採用的手段。攔截不是目的,編織纔是。反過來說,編織不僅僅是攔截,它包括了多種知識和技術。這種編織的過程既可以是靜態的也可以是動態的,就像OOP中的先期綁定和後期綁定。

本文的標題提到C#(不好意思,C#是本人最愛的語言之一),是因爲AOP在C#中的研究比Java中的研究要落後好幾年。可以達到應用級的幾乎沒有(至少Java還有一個AspectJ,當前版本爲1.2)。或許是我孤陋寡聞,網絡上能找到的比較知名的恐怕只有LOOM和Aspect#了,說它們還屬於試驗室的成果一點也不爲過。那麼是否就是說AOP在C#的實現很難呢?回答:是,也不是。Java和C#的語言特徵如此相像(它們有共同的祖先C++)。沒有理由說Java可以實現,而C#不行。那麼問題在哪裏呢?這是C#的AOP的研究,大多數人堅持的一點是不能修改已有的C#語言規範,只能對C#語言進行擴展。同時產生的程序集(Assembly)必須能夠被CLR調用和執行。另外還要考慮程序的性能。如果MS沒有在C#乃至.NET中對AOP內建的支持(如目前所做的泛型的擴展),那麼難度一定是存在的。

幸運的是,MS並沒有完全忽略AOP,在.NET的框架類庫的設計中,我們可以隱隱約約的找到AOP的設計思想(雖然這是MS類庫實現者爲解決特定的問題而採用的方法)。這也爲我們在C#中實現AOP提供了設計思路。儘管如此,也還是有許多問題需要解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章