面向性编程
⑴ 面向方面编程的简介
在考虑对象及对象与其他对象的关系时,我们通常会想到继承这个术语。例如,定义某一个抽象类— 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的理解,错误以及浅薄之处在所难免,只是希望对大家能起到抛砖引玉的作用。
