面向性編程
⑴ 面向方面編程的簡介
在考慮對象及對象與其他對象的關系時,我們通常會想到繼承這個術語。例如,定義某一個抽象類— Dog 類。在標識相似的一些類但每個類又有各自的獨特行為時,通常使用繼承來擴展功能。舉例來說,如果標識了 Poodle,則可以說一個 Poodle 是一個 Dog,即 Poodle繼承了 Dog。到此為止都似乎不錯,但是如果定義另一個以後標識為 Obedient Dog 的獨特行為又會怎樣呢?當然,不是所有的 Dogs 都很馴服,所以 Dog 類不能包含 obedience 行為。此外,如果要創建從 Dog繼承的 Obedient Dog 類,那麼 Poodle 放在這個層次結構中的哪個位置合適呢?Poodle 是一個 Dog,但是 Poodle 不一定 obedient;那麼 Poodle 是繼承於 Dog 還是 Obedient Dog 呢?都不是,我們可以將馴服看作一個方面,將其應用到任何一類馴服的 Dog,我們反對以不恰當的方式強制將該行為放在 Dog 層次結構中。
在軟體術語中,面向方面的編程能夠獨立於任何繼承層次結構而應用改變類或對象行為的方面。然後,在運行時或編譯時應用這些方面。舉一個關於AOP的示例,然後進行描述,說明起來比較容易。首先,定義四個關鍵的 AOP 術語,這很重要,因為我將反復使用它們:
接合點 (Joinpoint) — 代碼中定義明確的可識別的點。
切點 (Pointcut) — 通過配置或編碼指定接合點的一種方法。
通知 (Advice) — 表示需要執行交叉切割動作的一種方法
混入 (Mixin) — 通過將一個類的實例混入目標類的實例引入新行為。
為了更好地理解這些術語,可以將接合點看作程序流中定義好的一點。說明接合點的一個很好的示例是:在代碼調用一個方法時,發生調用的那一點被認為是一個接合點。切點用於指定或定義希望在程序流中截獲的接合點。切點還包含一個通知,該通知在到達接合點時發生。因此,如果在一個調用的特定方法上定義一個切點,那麼在調用該方法或接合點時,AOP 框架將截獲該切點,同時還將執行切點的通知。通知有幾種類型,但是最常見的情況是將其看作要調用的另一個方法。在調用一個帶有切點的方法時,要執行的通知將是另一個要調用的方法。要調用的這個通知或方法可以是對象中被截獲的方法,也可以是混入的另一個對象中的方法。我們將在後面進一步解釋混入。

⑵ 面向方面編程的特點
每個框架應用切點、通知或方面的方法都是獨特的,但是其目的和概念是相同的。在本文示例中,Encaser 包裝一個對象時真正進行的操作是,通過 System.Reflection.Emit 命名空間中的類產生 MSIL 代碼,從而隨時創建新的 Contact 類型。新 Contact 類型派生於 Contact 類,它仍然共享類型,但是新包裝的對象還持有對 ContactSave 對象的引用,後者是我們混入的。ISavable.Save 方法在新的 Contact對象上實現,因此在調用 Save 時,它實際上將調用委託給混入的 ContactSave 對象。這樣做的優點是能夠將新的 Contact對象轉換為在任何混入對象上實現的任何介面。
圖 2. 包裝對象的 UML 圖表。
您或許在想,通過 .NET Framework 2.0 的部分類語言功能,可以在另一個 partial 類中添加 Save 行為。這是可能實現的,但是本文沒有採用這種方法,這是為了使代碼與 .NET Framework 1.x 的其他版本向後兼容。既然有部分語言功能,那麼在正常情況下,前面的示例也就不需要使用混入 了。但是混入 仍然很有價值,因為通過它,開發人員可以混入可重用的對象行為,這些對象可以源自其他不相關的對象層次結構,它實現的功能比 partial 類更多。在使用 partial 關鍵字時,是在同一個類或類型中添加代碼,只不過物理位置不同。下一個混入示例說明的添加行為不只特定於 Contact 類,而是一個名為 FieldUndoer 的可重用類。FieldUndoer 實現了 IUndoable 介面,允許已修改的對象恢復為原來的狀態。
Public Interface IUndoable
ReadOnly Property HasChanges() As Boolean
Sub Undo()
Sub AcceptChanges()
End Interface
HasChanges 屬性表示,如果發生了更改,Undo 將對象恢復為原來的狀態,AcceptChanges 接收對象的當前更改,因此任何時候再調用 Undo 時都會恢復為上一次接收更改的狀態。如果該介面是在一個部分類中實現的,那麼在每個希望包含該行為的類中,都必須不厭其煩地重復實現這三個方法。作為一個實用主義編程人員,我嘗試堅持「一次且僅一次代碼」原則,所以我永遠不想重復任何代碼,復制和粘貼越少越好。通過使用混入,我能夠重用實現 IUndoable 的 FieldUndoer對象。在 ServiceManager 中我又混入了這個新功能。所有客戶端代碼仍然不知道新的混入,而且也不需要更改,除非需要使用 IUndoable 介面。更改 MainForm 中的 Contact對象,然後單擊「撤消」,測試這個行為。
Public Shared Function GetAllContacts() As ContactService.Contact()
Dim service As ContactService.Service = New ContactService.Service
Dim contacts() As ContactService.Contact = service.GetAllContacts
'//Wrap each contact object
For i As Integer = 0 To contacts.Length-1
'//Create a new instance of the encaser
'//responsible for wrapping our object
Dim encaser As encaser = New encaser
'//Add mixin instance of ContactSave
Dim saver As ContactSave = New ContactSave
encaser.AddMixin(saver)
'//Add mixin instance of FieldUndoer
Dim undoer As FieldUndoer = New FieldUndoer
encaser.AddMixin(undoer)
'//Creates a new object with Contact
'//and ContactSave implementations
Dim wrappedObject As Object = encaser.Wrap(contacts(i))
'//Assign our new wrapped contact object
'//to the previous contact object
contacts(i) = DirectCast(wrappedObject, _
ContactService.Contact)
'//Notice the wrapped object is still the same type
'//Assign the new wrapped Contact object to target fields
saver.Target = contacts(i)
undoer.Target = contacts(i)
Next
Return contacts
End Function
組合行為
混入還只是冰山一角。真正讓 AOP 聲名鵲起的功能是組合混入行為。以使用新 Contact對象為例,在調用 ISavable.Save 方法時,客戶端代碼還需要調用 IUndoable.AcceptChanges 方法,以便在下一次調用 IUndoable.Undo 時恢復到所保存的上一次更改。在這個小的 MainForm 中瀏覽和添加該對象很容易,但是在任何比用戶界面大得多的系統中對該規則編碼將是一項繁重的任務。您需要查找所有調用 Save 方法的情況,然後添加另一個對 AcceptChanges 的調用。而且在創建新代碼的過程中,開發人員也需要牢記,在每次調用 Save 時都添加這個新功能。這很快就會產生級聯效應,很容易會破壞系統穩定姓,引入一些難於跟蹤的 bug。而使用面向方面的編程則能夠組合這些方法。指定一個切點和通知,在調用 Save 方法時,Contact對象將自動調用後台的 AcceptChanges。
為了在應用程序中實現組合,需要在 ServiceManager 中再添加一行代碼。我們在加入 FieldUndoer 混入後添加這行代碼。
'//Specify join point save, execute the AcceptChanges method
encaser.AddPointcut(Save, AcceptChanges)
AddPointcut 方法通過幾個不同的簽名進行重載,這為指定切點提供了更大的靈活性。我們調用的 AddPointcut 接收了一個字元串類型的接合點名,它表示為 Save 方法,然後又接收了一個名為 AcceptChanges 的方法作為執行的通知。要查看這是否起作用,可以分別在 FieldUndoer.AcceptChanges 方法和 ContactSave.Save 方法前設置一個斷點。單擊 MainForm 上的 Save 按鈕將截獲接合點,您首先將中斷至通知 — 即 AcceptChanges 方法。通知執行後將執行 Save 方法。
這個簡單的示例說明如何添加貫穿整個應用程序的新行為,其功能強大無比。盡管有此功能,但它不僅僅是添加功能的一種很好的新方法。在眾多優點中,只有幾個涉及代碼重用,以及通過簡化新需求帶來的系統進化來改進系統的可維護性。與此同時,誤用 AOP 會對系統的可維護性造成顯著的負面效應,因此了解使用 AOP 的時機和方法很重要。
AOP 走了多遠?
將 AOP 用於多數大型系統或關鍵的生產系統還不完全成熟,但是隨著語言支持的提高,AOP 的應用將更容易。另外,提高支持也是新的軟體開發範例,例如利用面向方面的編程的軟體工廠。在 .NET 領域中有幾種可用的 AOP 框架,每個框架都有其自己的方法、正面屬性和負面屬性。
Encase — 本代碼示例中的 Encase 框架只是一個工具,幫助您快速了解並運行 AOP,以及理解 AOP 背後的概念。Encase 在運行時期間應用能夠單獨添加到對象的方面。
Aspect# — 一個針對 CLI 的 AOP 聯合兼容框架,提供聲明和配置方面的內置語言。
RAIL — RAIL 框架在虛擬機JIT 類時應用方面。
Spring.。。。 — 流行的 java Spring 框架的一個 .NET 版本。在下一個版本中將實現 AOP。
Eos — 用於 C# 的一個面向方面的擴展。

⑶ 面向csdn編程是什麼意思
面向過程編程: 面向過程編程可以理解為始終以過程為目的,始終圍繞著函數以一個個的函數為解決問題的方法逐步實現。其運用三種基本結構:(順序結構,循環結構,選擇結構)運用面向過程編程思想的語言有:C語言。這種語言的優點是符合人的基本思維,編寫起來比較簡單。但是它的缺點也顯而易見,它的可維護性和可擴展性比較差,不利於現在工業化軟體開發。
面向對象編程: 面向對象編程是站在真實世界的角度下考慮問題的解決辦法。其思想是將某些具有相同屬性及方法的對象歸為一類,類與類之間也會有繼承等關系。通過調用類對象,完成類與類之間的協作,最終完成整個系統的功能。面向對象編程的優點就是復用性強,可維護性和可擴展性性較強。是軟體更加模塊化實現了高內聚低耦合,適用於大型軟體產品的開發。
⑷ 什麼是面向對象編程
在我理解,面向對象是向現實世界模型的自然延伸,這是一種「萬物皆對象」的編程思想。在現實生活中的任何物體都可以歸為一類事物,而每一個個體都是一類事物的實例。面向對象的編程是以對象為中心,以消息為驅動,所以程序=對象+消息。
面向對象有三大特性,封裝、繼承和多態。
封裝就是將一類事物的屬性和行為抽象成一個類,使其屬性私有化,行為公開化,提高了數據的隱秘性的同時,使代碼模塊化。這樣做使得代碼的復用性更高。
繼承則是進一步將一類事物共有的屬性和行為抽象成一個父類,而每一個子類是一個特殊的父類--有父類的行為和屬性,也有自己特有的行為和屬性。這樣做擴展了已存在的代碼塊,進一步提高了代碼的復用性。
如果說封裝和繼承是為了使代碼重用,那麼多態則是為了實現介面重用。多態的一大作用就是為了解耦--為了解除父子類繼承的耦合度。如果說繼承中父子類的關系式IS-A的關系,那麼介面和實現類之之間的關系式HAS-A。簡單來說,多態就是允許父類引用(或介面)指向子類(或實現類)對象。很多的設計模式都是基於面向對象的多態性設計的。
總結一下,如果說封裝和繼承是面向對象的基礎,那麼多態則是面向對象最精髓的理論。掌握多態必先了解介面,只有充分理解介面才能更好的應用多態。
⑸ 面向對象編程是什麼意思
面向對象編程是以建立模型體現出來的抽象思維過程和面向對象的方法。對象的含義是指具體的某一個事物,即在現實生活中能夠看得見摸得著的事物。
在面向對象程序設計中,對象所指的是計算機系統中的某一個成分。在面向對象程序設計中,對象包含兩個含義,其中一個是數據,另外一個是動作。對象則是數據和動作的結合體。對象不僅能夠進行操作,同時還能夠及時記錄下操作結果。
方法是指對象能夠進行的操作,方法同時還有另外一個名稱,叫做函數。方法是類中的定義函數,其具體的作用就是對對象進行描述操作。

特徵
(1)對象唯一性。
每個對象都有自身唯一的標識,通過這種標識,可找到相應的對象。在對象的整個生命期中,它的標識都不改變,不同的對象不能有相同的標識。
(2)抽象性。
抽象性是指將具有一致的數據結構(屬性)和行為(操作)的對象抽象成類。一個類就是這樣一種抽象,它反映了與應用有關的重要性質,而忽略其他一些無關內容。任何類的劃分都是主觀的,但必須與具體的應用有關。
(3)繼承性。
繼承性是子類自動共享父類數據結構和方法的機制,這是類之間的一種關系。在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,並加入若干新的內容。
⑹ aop是什麼
AOP是OOP的延續,是Aspect Oriented Programming的縮寫,意思是面向方面編程。AOP實際是GoF設計模式的延續,設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,AOP可以說也是這種目標的一種實現。
⑺ 面向對象編程是什麼意思
面向對象編程又稱OOP,是一種計算機編程架構。本質是以建立模型體現出來的抽象思維過程和面向對象的方法。
OOP的一條基本原則是計算機程序由單個能夠起到子程序作用的單元或對象組合而成。OOP達到了軟體工程的三個主要目標:重用性、靈活性和擴展性。OOP=對象+類+繼承+多態+消息,其中核心概念是類和對象。
面向對象程序設計方法是盡可能模擬人類的思維方式,使得軟體的開發方法與過程盡可能接近人類認識世界、解決現實問題的方法和過程,也即使得描述問題的問題空間與問題的解決方案空間在結構上盡可能一致,把客觀世界中的實體抽象為問題域中的對象。

(7)面向性編程擴展閱讀
面向對象程序設計以對象為核心,該方法認為程序由一系列對象組成。類是對現實世界的抽象,包括表示靜態屬性的數據和對數據的操作,對象是類的實例化。對象間通過消息傳遞相互通信,來模擬現實世界中不同實體間的聯系。在面向對象的程序設計中,對象是組成程序的基本模塊。
模型是用來反映現實世界中事物特徵的。任何一個模型都不可能反映客觀事物的一切具體特徵,只能對事物特徵和變化規律的一種抽象,且在所涉及的范圍內更普遍、更集中、更深刻地描述客體的特徵。通過建立模型而達到的抽象是人們對客體認識的深化。
⑻ 什麼是面向對象編程
1.面向對象的編程產生的歷史原因:由於面向過程編程在構造系統時,無法解決重用,維護,擴展的問題,而且邏輯過於復雜,代碼晦澀難懂。人們開始讓計算機直接模擬現實的環境,以人類解決問題的方法,思路,習慣和步驟來設計相應的應用程序。於是,面向對象的編程思想出現。
2.面向對象編程概念:面向對象的編程的主要思想是把構成問題的各個事物分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描述一個事物在解決問題的過程中經歷的步驟和行為。對象作為程序的基本單位,將程序和數據封裝其中,以提高程序的重用性,靈活性和可擴展性。類是創建對象的模板,一個類可以創建多個對象。對象是類的實例化。
⑼ 什麼是面向對象編程
前言:面向對象程序設計(Object-Oriented Programming,以下簡稱OOP)是一種起源於六十年代的Simula語言,發展已經將近三十年的程序設計思想。其自身理論已經十分完善,並被多種面向對象程序設計語言(Object-Oriented Programming Language,以下簡稱OOPL)實現。如果把Unix系統看成是國外在系統軟體方面的文化根基,那麼Smalltalk語言無疑在OOPL領域和Unix持有相同地位。由於很多原因,國內大部分程序設計人員並沒有很深的OOP以及OOPL理論,很多人從一開始學習到工作很多年都只是接觸到c/c++,java,vb,delphi等靜態類型語言,而對純粹的OOP思想以及作為OOPL根基的Smalltalk以及動態類型語言知之甚少,不知道其實世界上還有一些可以針對變數不綁定類型的編程語言。而這些對比卻是深刻理解OO理論的重要部分,而國內這方面的資料也為數不多。故把自己的一些OO學習心得寫下來做為一個系列文章(一共三篇,第一篇描敘OOP的一些基本但容易被誤解的理論,第二篇主要說明各種OOPL演化和發展以及對於OOP理論的支持,第三篇主要是說模式和組件在OOP中的地位以及展望OOP的未來),由於文章描敘的只是自己對於OOP/OOPL的理解,錯誤以及淺薄之處在所難免,只是希望對大家能起到拋磚引玉的作用。
