對象技術難以對涉及全球約束和大流行爲行爲的問題進行定位,適當分離問題,並應用領域專有知識。
前端
面向方面編程(AOP)提供了攔截代碼執行的能力,目的是在一般執行的代碼以前,代替或以後插入進程。當您考慮到全部內容,調用方法,從方法返回時,檢索或分配值,處理異常,切換上下文等等都由代碼執行組成,您能夠開始考慮如何使用這樣的功能。若是這知足了你的好奇心,那麼再不要再看了。可是,這個定義很簡單,爲何會使用AOP的緣由徹底喪失了。還要警告,這個定義只針對一個特定的實現,在本做者看來,實際上與面向方面的軟件設計(或開發,即便首字母縮寫相同,這些術語彷佛是可互換的) - AOSD。此外,AOSD自己也是後期編程(POP)技術的一個子集。不幸的是,追求AOP和AOSD讓咱們很快失去了一種奇怪的術語和定製語言和擴展的泥潭。本文旨在簡要了解AOP而不只僅是AOSD的通常性問題。像許多最近的範例旨在解決複雜軟件開發中出現的一些問題,AOSD在實際實現的流出中包含了智慧寶庫。本文旨在簡要了解AOP而不只僅是AOSD的通常性問題。像許多最近的範例旨在解決複雜軟件開發中出現的一些問題,AOSD在實際實現的流出中包含了智慧寶庫。本文旨在簡要了解AOP而不只僅是AOSD的通常性問題。像許多最近的範例旨在解決複雜軟件開發中出現的一些問題,AOSD在實際實現的流出中包含了智慧寶庫。程序員
開發更簡單的系統的成功緻使更大的複雜性的願望1面試
AOSD的主要緣由是幫助解決凌亂對象架構的問題。AOSD的支持者聲稱面向對象的程序設計難以處理全球信息。此外,須要多個不一樣對象(可能收集到組件中)的功能會致使這些對象/組件之間的相互依賴。這使得應用程序易受依賴對象/組件的實現更改的影響。維護和加強也是問題,由於這些對象/組件之間的交互(不管交互規則是正式仍是非正式編碼)一般在包含對象內進行硬編碼。若是這是混亂的話,那麼在這些陳述中,AOSD術語解釋AOSD的緣由是特別避免的。這是故意的,以免把車放在馬以前。當AOSD的術語馬上陷入AOSD的術語時,試圖理解AOSD可能會很是混亂,沒有任何詞彙表。數據庫
當應用程序須要作的事情須要許多不一樣對象的參與時,會發生Messy對象體系結構。給定需求規範,面向對象設計(OOD)一般經過肯定支持要求所必需的對象來進行。目標是經過分析需求來劃分功能,直到發生足夠的抽象(包括其餘OOD目標)。在整個過程當中,設計人員常常忽視這樣一個事實,即最終這些對象將須要相互交互以知足實際功能的要求。這容易和潛意識地發生,由於需求交互的方式一般與對象交互的方式有根本的不一樣。設計模式中描述的概念是嘗試正式理解對象交互的問題,併爲設計人員提供一些很好理解和支持的方法來解決這個對象的相互依賴性問題。事實上,AOP語言的主要實現,即AspectJ,在很大程度上依賴於觀察者的設計模式。然而,AOSD倡導者所提出的批評之一就是,除了太多的設計模式(和不斷增加的)外,這些模式一般在設計過程當中「設計得太早」。所以,必須從新設計設計,或者更糟的是,當須要不一樣的設計模式時,實施必須從新進行。另外一個批評是設計模式與系統結構之間的相互做用。設計模式不只影響系統架構,但它自己受到系統架構的影響。結果,設計模式在實現中消失,失去了其模塊性。這一般會影響可重用性,由於設計模式(可重複使用的組件)和對象模型(另外一個可重複使用的組件)被集成到更加剛性,更少可重用的組件中。編程
就我的而言,雖然我贊成這個觀察的現實,但我不一樣意這代表設計模式的概念有一些缺陷。相反,我以爲這代表不完整的要求和分析,設計師/開發人員缺少教育和培訓,以及項目負責人差(有人應該比其餘人更聰明!)。若是你接受這個反駁論證,那麼它也會排除AOSD是壞對象架構的前提。另外一個考慮因素是,這些範例都不表示什麼時候被使用。許多有用的應用程序,包括基於Web的應用程序(複雜對象相互依賴在頁面刷新之間難以維護),不會遇到AOSD嘗試解決的問題。AOSD(和相似的範例)只有當應用程序跨越自動化簡單任務(例如具備剪切和粘貼和打印功能的簡單文本編輯器)之間的邊界,並自動執行由多個任務組成的複雜過程(如文字處理器提供嵌入式圖形,線條圖,拼寫檢查,佈局和格式化工具,協做,安全性和與其餘應用程序的集成)。這個邊界在何處,什麼時候在設計範式中轉變,仍然是藝術。個人經驗告訴我,模糊的需求,不明確的使用案例和潛在的無限加強是我在項目開始時考慮這些問題的指標,並相應地進行設計。什麼時候在設計範式中轉變,仍然是藝術。個人經驗告訴我,模糊的需求,不明確的用例和潛在的無限加強是我在項目開始時應考慮這些問題的指標,並相應地進行設計。什麼時候在設計範式中轉變,仍然是藝術。個人經驗告訴我,模糊的需求,不明確的用例和潛在的無限加強是我在項目開始時應考慮這些問題的指標,並相應地進行設計。設計模式
實踐要求是在實現過程當中引入橫切的問題1數組
到目前爲止,我已經避免使用與AOSD / AOP一塊兒使用的任何術語,試圖堅持以知名的面向對象的術語。至少對術語的初步瞭解是必要的,若是沒有其餘緣由,不要在下次面試中拋出一堆流行語。術語的良好定義是至關難以捉摸的,部分緣由是這些術語不是很是精確地使用(所以沒有人想要定義它們),AOSD的概念繼續發展(所以術語具備新的含義),由於學術界繼續表現出在沒有周圍環境的狀況下傳達無心義的術語的趨勢。安全
AOSD世界中的一個關注有幾個定義,但我最喜歡的是IEEE的定義:「...與系統的開發,運行或任何其餘方面有關的興趣,對於一個或多個利益相關者「。然而,將定義歸入現實世界的背景下,這並非頗有幫助,但它確實囊括了應用程序開發的各個階段,以下所列:網絡
這些階段中的每個都是一個或多個方或利益相關者感興趣的(僅舉幾例):架構
注意最後一個條目「應用程序自己」。重要的是要意識到應用程序自己是利益相關者,對如下問題有疑慮:
雖然最後一個關注的問題是由不一樣的人「持有」,可是應用自己就對這些問題有利害關係,由於它直接影響到實施和返工問題。不管前端設計工做如何,最後一個類別中的許多問題都不會被揭示,直到大多數組件已經粘合在一塊兒而且產品已經完成。所以,90%的工做是在最後10%的發展中完成的。若是AOSD有任何有價值的東西有助於軟件開發,事實上它將這些關注點帶入了意識,讓參與軟件生產的整個實體從不一樣的角度考慮這些問題。
這個術語在AOSD / AOP圈子中並不常見,但值得一提的是,一個觀點是從不一樣的角度來看待整個系統的方法,並根據這些立場來肯定問題。軟件供應商和客戶對軟件開發過程有不一樣的見解。在這兩組中(這並不意味着只有兩組),供應商與客戶(管理層,會計師,數據輸入人員)的觀點不一樣(管理,工程師,技術支持等) 。我從「辦公室女孩」的角度常常處理的一個問題是雙重的 - 「這很難學習?」 和「誰來提供培訓?」。諷刺地,
這是對應用程序開發中存在的問題的分析。每一個利益相關者對他/她/他/她參與申請有不一樣的擔心。關注問題的分離是一個重要的分析,它肯定了物理實施(見工件)最終涉及多個利益攸關方的領域,不管是部門/組織利益仍是對象。從不一樣的角度來看待顧慮,有助於分離問題的過程。當涉及多個利益相關者時,需求一般不會明確規定。相反,需求文件一般會針對具體部門的需求提出疑慮。對象設計也是如此(所以,上面的「it」),其中對象設計從預期輸入,產生的輸出和操縱方法的角度肯定其關注,而不考慮整個系統。所以,分離不一樣的問題(這意味着正確識別它們)在後來肯定應用程序中的實際信息流程(參見橫切)是相當重要的一步。
分離關注的目的是肯定以分權方式設計和實施的領域。這容許獨立的團隊並行工做,並擁有獨立和自主的決策過程。即便是簡單的應用也能夠利用這一律念。例如考慮一個簡單的網絡消息傳遞應用程序。該應用程序依賴於網絡協議已經徹底獨立可靠地開發,所以程序員不須要「關心」他/她本身的這個問題。從不一樣的角度來看,若是要在合理的時間內完成工做,大型應用程序(考慮運行航天飛機所需的軟件)必須將其問題分解爲可管理的「塊」。然而,這致使了AOSD試圖解決的問題,即從新整合這些單獨的關切。在一天結束時(比喻),全部不一樣的做品必須以有意義和一致的方式放在一塊兒。AOSD是在此過程當中檢測問題領域的工具。
從AOSD的觀點來看,關注一般是概念性的,而「文物」是受到關注的動機的具體建設。這引發了一些混亂,關於何時是一個問題,何時是一個神器。經驗法則是,若是它是一個概念(例如,需求屬性),那麼這是一個問題。若是它是一個具體的結構(例如對象的實現),那麼它是一個工件。術語「神器」在AOSD世界中並不經常使用。儘量地,將關注和工件視爲單獨的實體是有用的,以便二者能夠彼此獨立地考慮。這有助於設計師獨立於對實現(工件)的影響來考慮問題。做爲顧問,我發現這種技術是無價的,由於它有助於我識別部門之間的溝通問題,現有的手工流程中的問題,部門/人事目標的衝突等。所以,我常常花費個人一半以上的時間記錄和修復與編程徹底無關的過程,全部這些都不須要寫一行代碼。或者,若是我太快地沉浸在對象(工件)的設計中,我歷來沒有注意到在不一樣的問題之間存在衝突和斷開鏈接,直到我太參與項目設計/實施。那麼我必需要麼修改設計/實現,強制改變現有的進程,要麼二者兼而有之。最終的結果是,我被認爲是軟件交付遲到的緣由,或者是工人之間的焦慮。經過分別查看問題和工件,在編寫一行代碼以前,我能夠解決設計/實現問題。這種方法的反作用是,經過使扭結過程,一家公司當即開始節省資金。他們認爲他們須要一個程序來作到這一點!
將關注和僞影分開的目的之一是幫助建立編程語言(參見下面的「形式主義」),能夠在不處理實現(artifact)細節的狀況下表明關注點。迄今爲止,這是很是有限的。有興趣的讀者應參考AspectJ(Java擴展),Cosmos(建模關注工具)和CoCompose(一種設計方法)。
橫切是用於描述應用程序與多個工件接口的實現的術語。(看,咱們如今能夠開始使用術語)。因爲工件是不一樣顧慮的物理實現,所以橫切一般涉及試圖解決若干問題的操做(或工做流程)。因爲表示這些關注的工件一般被實現爲自主對象(由於咱們都在嘗試促進重用),因此咱們最終會出現凌亂的代碼。一般將對象傳遞到其餘對象(void ObjectD::DoSomething(ObjectA* a, ObjectB* b, ObjectC* c)
)或經過全局機制(AfxGetMainWnd()
)獲取。這是AOSD的關鍵 - 批評面向複雜的實現包含相互依賴關係,使得難以調試,測試,維護和擴展功能。經過明確肯定交叉的時間和地點,AOSD提供了一種識別全局相互依賴關係的機制,從而實現OOD的原則,即模塊化和重用。(Eek,我開始聽起來像我一直在閱讀的文章)。
最後咱們能夠解釋首字母縮略詞AOSD中第一個單詞的含義。一個方面只不過是在實現中強制橫切的東西。而橫切是實施使用多個工件,以執行其任務的過程的,一個方面是這種狀況,其中發生這種狀況。AOSD是識別方面或技術的技術,其中的實現致使了人造物的橫切。這真的意味着需求文件不多將總體性的事情進行規定。相反,需求文件是不一樣羣體組合的需求的集合,每一個不須要彼此考慮。這種遺漏一般不是' 直到對象設計完成而且將對象耦合在一塊兒以執行特定過程(或工做流)的問題纔會被發現。我看到不少設計省略了這一步。若是沒有省略,那麼每一個人都會拿出他們的設計模式書,識別適用的設計模式,以幫助將不一樣的對象綁在一塊兒,在對象圖上繪製更多的對象,每一個人都快樂地開始編碼。若是我是奧斯德先生坐在這些設計會議上,我會哭「停下來!」 並耐心地解釋,設計的元級別仍然是保持設計模式和對象不被糾纏的必要條件。這也將涉及到指出,大概只有10%(若是這樣) 強制橫切的方面已經獲得了適當的肯定。和,因爲大多數語言不直接實現AOSD,所以有必要實現一個正確處理這些方面的框架,從而維護咱們的設計模式和對象的模塊化/重用。(應用自動化層有多好!)
不幸的是,在至少有一篇關於分離問題的文章中,做者將「方面」定義爲組件的屬性。這與更常常遇到的AOSD / AOP定義相沖突。
編織就是用來描述任何用於解決方面問題的解決方案的奇怪術語。(哈,你覺得我不能用那個詞)。由於這涉及物理實現(工件),編織解決方案是很是任意的,只要產生的努力創造一個連貫的系統。術語「編織」多是因爲使用諸如AspectJ的AOP語言擴展造成的精神圖像。回想一下我對AOP的簡單定義 - 攔截代碼執行的能力,目的是在一般執行的代碼以前,以後或以後插入一個進程。AOSD經過注入pre,post和「around」過程,將方面的問題(!)實現「編織」到現有代碼中。(換一種說法,
這個術語的定義包括在這裏,而不是由於它在AOSD中使用(一般不是這樣),而是由於本文使用它。組件在Microsoft開發領域內變得模糊,由於它如今與非平凡的GUI控件有關。爲了本文的目的,術語組件被定義爲「...封裝的自治服務提供者,經過良好指定的接口提供有用的服務,使其存在於更普遍的上下文中,並與其餘組件協做實現共同目標。 「 5考慮這個定義,即「...並與其餘組件合做」,這意味着在其實現中的橫切。嗯
一種編程語言 (不,我不是在開玩笑)。
在系統設計中沒有適當的關注,管理系統的複雜性,可讀性,演進和組成將很難2
讓咱們看看這是如何工做的,以船廠運營管理爲例(個人一個客戶)。
一,關於處理零件的通常性陳述。請記住,當我開始看自動化操做時,沒有一個以任何一致的方式寫下來。這是20年語言「專門知識」的結果,並在數週內口頭傳達給我。正式的流程,圖表等都是徹底缺少的。所以,職業培訓費用昂貴,形成了許多錯誤。我以爲有諷刺意味的是,當更換系統是不完美的時候,有人能夠從計算機系統要求完美。
做爲一個全方位服務的船廠,除了小型內部工做外,客戶基本上不得在本身的船上工做。這部分是因爲環境法規,部分是由於它增長了利潤。客戶須要的任何零件都是經過店面進行處理的,除非場地經理另有規定,不然一般以零售價出售。客戶經過現金,信用卡,支票或經過海運商店帳戶支付零件費用。然而,一般,零件用於在客戶的船上執行的全部維修和維護。機師被告知,當院長用某種方式(一般是言語)寫出一份訂單,由客戶受權的工做時,須要在船上完成工做。隨着工單在手,機械師開始工做,這可能須要零件。零件有庫存,缺貨,或是特殊訂單。假設該部件庫存,機械師將進入零件臺並要求必要的部件。在結算時間,全部在各類工單上使用的全部零件均已計價,納稅,並向客戶收取費用。偶爾,場地經理會談談給客戶的特別價格。當客戶知道競爭是爲了少部分銷售時,這種狀況常常發生。這幾乎老是發生在特殊的訂單部分,院長經理知道什麼時候發佈工單。場地經理還將填寫一份材料申請表,指明部分和價格。採購人員負責訂購零件,並確保在機械師須要的時候及時進行庫存。最後,院長經理常常指出,全部爲客戶開展的工做都是以折扣結算,或只有某些工單有適用的折扣。不然,該部分在零售店收費。採購部門有興趣瞭解哪些工做單位用於哪些工做單,以便從此能更好地估計庫存的採購量,而院長經理想知道若是能夠採用成本削減措施。船廠還有一名會計師,很是有興趣瞭解部件的購買和出售狀況,由於船廠目前正在每月進行一次15,000美圓的庫存註銷 - 部件正在被購買,但彷佛正在消失一個黑洞。固然,業主認爲這是員工的盜竊。因爲這是一個徹底手動的過程,嘗試自動化這些過程的任何軟件都必須確保庫存被精確記錄,而且部件正確地向客戶收費。哦,還有一件事 請記住,船廠還擁有和經營幾艘船 - 啓動人員來往和離開他們的船隻,包機船等。這些船也須要修理和維護,零件須要正確計費給船廠本身的帳戶爲了稅收目的。與船廠工做相關的全部部件都以「成本」出售給船廠。這些船還須要維修和保養,部件須要正確計費給船廠本身的稅務賬目。與船廠工做相關的全部部件都以「成本」出售給船廠。這些船還須要維修和保養,部件須要正確計費給船廠本身的稅務賬目。與船廠工做相關的全部部件都以「成本」出售給船廠。
在本案例研究的範圍內,咱們來看看咱們如何用「關注」來重寫這個語句。
院長們關心:
採購部門關心:
會計師關心:
計費部門(或應收帳款)涉及:
店主擔憂:
在經過考慮文物(組件,對象和其餘結構實現)來混淆問題以前,讓咱們來看看本身的問題,看看咱們能夠學到什麼。會計師(15000美圓註銷)和全部者(誰竊取個人東西?)的關注其實是涉及能夠應用於任何流程或關注的常見主題的問題:驗證,糾錯和異常處理。這揭示了一些系統性的問題:
這些只是從考慮各類問題產生的一些問題。它不能誇張,所以我將再次說明:從驗證,糾錯和異常處理的角度來看,須要考慮全部問題。這些不是編程問題。這些是過程問題:現有業務流程如何處理這些狀況?可是,他們將始終在現有過程當中揭示重大問題,影響實施決策,並致使您對項目原始估計的時間和成本超支。經過使用AOSD來識別問題,而後應用這些基本規則,您能夠在不設計單個組件或編寫一行代碼的狀況下,發現大量的系統。
爲了樂趣,我將根據造船廠到達現場時如何操做來回答這些問題。
經過審查每一個賬單。若是院長經理記得特殊的命令,那就有機會犯錯誤。
沒有人。不執行標準庫存準確機制,如循環計數。
院長經理對於工做須要的部分有「感受」。
基本上沒有人 本質上,採購部門根據製造商的建議零售價格(MSRP)設訂價格,但零件一般沒有MSRP,所以是至關隨意的。
會計部門必須對帳單進行手動修改。若是賬單沒有及時收到,則會發出貸項憑證,下次在客戶的賬單上顯示。
沒有。該公司吃虧。此外,虧損不會轉交給會計師,因此它永遠不會顯示爲損失。
沒有人。沒有計算對船廠擁有船隻的部分。會計師估計每個月結算。
不,常常在忙碌的時候,會發出一個口頭的工單。
看起來能夠是欺騙性的,但區別是清楚的4
當我開始研究院子的過程和自動化時,不採用AOSD技術,由於我不明白問題的深度,因此我花了大約三到四個月的時間完成了錯誤的方向。諷刺的是,我已經作過幾年的過程自動化,我應該更好地知道。但外表多是欺騙。這個特殊的船廠從外面看起來很是好(這正是他們但願客戶如何看待它們),但在內部,事情正在發生。由於他沒有收到六個月前購買的6,000美圓的小費(這其實是這樣),因此打電話的客戶可能更好地瞭解了內部問題。
如今,我將採起大膽的步驟,從關注自己而不是任何正式的要求文件中肯定一組基本的組件。這使咱們擺脫了抽象的關注問題,並使咱們回到更具體的設計和實施問題。能夠經過通常性聲明的語義和關注點來識別如下組件:
這些彷佛是合理的組件,而無論實現細節和區域設置(例如,在內存對象,XML數據,數據庫表等中)。根據要求,這些組件可能以全部這些形式和其餘形式存在。
在這一點上執行的一個有趣的步驟是考慮這些工件的問題。工件的鍋爐問題包括如下問題:
請注意,這些關注能夠在組件中內部處理,而且在大多數狀況下不須要與其餘組件交互。例外狀況是最後三個項目,異常處理,信息完整性(生成問題警報)和日誌記錄,可能涉及其餘「幫助」組件。這些只是組件可能擁有的一些常見問題,不管要求如何。在應用程序的複雜性增長和添加新功能後,設計具備這些問題的組件可能會很是有用。除了這些樣板問題外,還能夠從需求文件和產品開發過程當中肯定具體的應用問題。
在提供給客戶的實際系統中,只解決了其中一些問題。在這一點上我感到遺憾的是,諸如變革歷史等關切並非原來實施的一部分。然而,因爲實現與橫切問題(使用應用自動化層框架!)有很好的關係,因此其餘問題的實現很是簡單,不會破壞現有的系統。
採起單一過程,肯定零件的價格,說明了實施的橫切(在這種狀況下,上述組件)。即便在這個早期的設計階段,沒有進入每一個組件的實現細節,能夠證實,肯定零件的價格應該出如今客戶的賬單上,這涉及系統的許多不一樣組件。下圖說明了使用「後箱」的概念來肯定價格。
不幸的是,AOSD並無提供任何關於如何處理這個橫切的指導方針,而不是幫助肯定其存在。「編織」的概念將在下面的AspectJ部分中進行討論,這是試圖提供形式主義(語言實現)來解決橫切問題。
在上述示例中,價格計算是一個方面,由於它迫使組件實現的橫切。我認爲正確的用法是「價格計算方面」。
像許多最近的範例旨在解決複雜軟件開發中出現的一些問題,AOSD在實際實現的流出中包含了智慧的寶石3
讓讀者注意我不是Java程序員,若是我有任何話,我但願永遠不會。所以,本節將至關簡短。若是您想了解此語言擴展的完整語法,您能夠參考如下參考部分。也就是說,在這個語言擴展中有一些有趣的(也許更合適的術語應該是「奇怪」)的功能,值得閱讀。爲了演示實現,須要定義一些額外的術語,在這些定義中,您將找到示例用法和進一步的討論。
鏈接點是程序執行中「明肯定義」的任何一點。從高級語言的角度來看,這將是調用方法,訪問數據,存儲值,對象建立和破壞(垃圾回收語言除外),異常處理程序等的地方。這基本上排除了算術和布爾運算(除非重載或處理setter / getter字段),而從低級彙編語言的角度來講,執行高級指令所必需的中間機器指令。
您可能認爲C#的「set」和「get」語言結構抽象了屬性的鏈接點的概念,或者C#和C ++的繼承和重載特徵抽象了方法和操做符的鏈接點的概念。不是這種狀況。鏈接點中涉及到的問題確實要求語言直接支持「一流公民」,而不是使用現有的面向對象技術。這主要是因爲能夠攔截鏈接點的豐富程度以及在現有語言結構中模擬此概念所需的體力勞動(參見下面的「切入點」)。
切入點(或切入點指示符)是在程序中選擇鏈接點的規範。給定一個鏈接點(程序執行中你感興趣的地方),切入點是用於使用正式語法向鏈接點傳達對編譯器或解釋器的興趣的語法和機制。不幸的是,你會看到諸如「到達切入點時運行的代碼」這樣的句子,這是至少使人困惑的。當程序執行到達鏈接點時,切入點向量程序執行到「通知」(見下文)。這種術語混淆使得很難理解,並且還要購買AspectJ中提出的語言擴展。
給定一個對象Point,指定截取對象Point的更改的切入點將以下[6]:
pointcut fieldChanged(Point changed) : call( * Point.set*(..)) && target(changed);
這種語言擴展的一個有趣(奇異的)功能之一是使用通配符。您能夠經過指定「call(*。*(..))」做爲切入點,在全部函數調用上建立切入點。您能夠經過指定「call(Point。*(..))」做爲切入點,爲類中的全部方法指定切入點。另外一個控制領域是指定呼叫源的能力。若是您有兩個類(Line和Rectangle),則此功能容許您區分並指定不一樣的切入點,當「線」操做點與「矩形」操做點時的操做。這些能夠嵌套到任何級別。還有另外的結構提供了更多的複雜性,例如「內部」,「內部代碼」,「cflow」和「cflowbelow」,這裏再也不贅述。
建議是當達到切入點指定的鏈接點時執行的代碼。在建議中,您能夠指定要在截取(或剪切)的代碼以前,以後和/或以後運行的代碼(「圍繞」)。經過這種機制,建議或加強功能被「編織」到現有的實施中。
after(Point changed ) : fieldChanged(changed) { changed.makeDirty(); }
從彙編語言程序設計的日子開始,這聽起來只不過是一個榮耀的「補丁」。此外,切入點規範與架構實現,程序流程和類實現密切相關。這致使更多的反作用,而不是更少,當實施變化。此外,這種實現使測試複雜化,由於它擴展了能夠達到代碼的路徑數量以及決定代碼執行的決策。雖然這種語言擴展提供了一些有趣的思想食物,但我根本不能相信它能夠被認爲是AOSD肯定的橫切問題的解決方案。AspectJ的支持者將認爲它容許輕鬆添加記錄和安全檢查等功能。這些是經過現有機制(如重構)處理得更好的簡單示例,坦率地說,經過更好的前端設計。使用這種語言擴展,應用程序將迅速演變成一個拼湊的切入點規範,將代碼的可讀性下降到零,由於代碼的相干結構具備編織的拼接。此外,這種語言擴展彷佛不適合複雜(我敢說「真實世界」)的例子,例如上面討論的案例研究。
實質上,AOP是一種編程技術1
顯然,AOSD不是軟件生產中涉及到的問題的完美解決方案,但若是您尚未本身制定,這是一個很好的起點。有了經驗,您應該能夠調整AOSD的概念,以更好地適應本身的工做環境,客戶羣體,團隊成員等。AOSD解決方案主流語言中幾乎沒有語言支持。就我的而言,我認爲語言擴展是徹底錯誤的方向。若是有的話,他們會戰勝AOSD的目的,由於至少在AspectJ的時候,組件之間的聯繫彷佛更爲緊密。此外,程序流程的單獨規定僅僅增長了程序員的混淆,而且須要跟蹤單獨但相關的實現細節。代替,經過設計適當的框架來管理橫切,AOSD提出的問題能夠在現有工具(如設計模式)和語言(如C#,C ++)中獲得更好的解決。這個做者(AAL的另外一個插件)的一個這樣的解決方案經過消除沒必要要的對象結構,將數據視爲一個單獨的事件能力的實體來實現這一點,而且經過腳本語言提供工做流機制以將自主組件粘合在一塊兒以實現所需的過程。
因爲這不是一份正式的論文(並且由於我太懶了),我沒有在文章自己中提到任何腳註,當我作出某些陳述時,我提到的其餘做者。我能夠聽到大學警察如今在敲門。不管如何,全部這些均可以在互聯網上找到(一些經過ACM,一個優秀的在線編程技術來源),在大多數狀況下,AOP,AOSD和AspectJ的信息來源不少。若是你本身閱讀,你能夠弄清楚我是改寫什麼,哪裏。對於那些可能冒犯的做者,請注意,除非另有說明,不然本文中沒有我直接引用你的內容。我更喜歡改寫和重寫,以便通常的編程社區有一些機會理解你的「
AOSD,AOSD 2002--1st International Conference Aspect-Oriented Software Development,http://trese.cs.utwente.nl/aosd2002/
馬克·克利夫頓
彼得·加布裏埃爾
Chitchyan,Sommerville和Rashid。橫切關注的設計方法分析
Graversen和Beyer。使用角色的概念編程
薩頓和塔爾。面向方面的設計須要關注建模
Wagelaar和Bergmans。使用基於概念的方法面向方面的軟件設計
Akkawi,Bader和Elrad。動態編織建築可重構軟件系統