1,软件编程技术的发展

软件编程技术与程序设计语言是分不开的。过去的几十年中,程序设计语言对抽象机制的支持程度不断提高:从机器语言到汇编语言,到高级语言,再到面向对象语言。每一种新的程序设计语言的出现都带来软件编程方法的飞跃。汇编语言出现后,开发者避免了直接使用0-l编码,而是利用符号来表示机器指令,从而更方便地编敲代码。当程序规模继续增大的时候,出现了以Fortran、C、Pascal等为代表的高级语言,这些高级语言使得编写复杂的程序变得easy,开发者能够更好地应付日益复杂的代码,这一阶段的软件开发方法被称为“面向过程的”。可是,随着软件产业的迸一步发展,更大、更复杂的软件系统在需求中被提出,即使开发者应用结构化程序设计的方法,仍然非常难把握软件开发的总体局势。在这样的情况下,作为减少开发复杂性的工具,诸如C++、Java等面向对象的语言产生了,面向对象程序设计也随之发展起来,软件编程方法学也由“面向过程”过渡到“面向对象(OOP)”时代。不难发现,编程技术与编程语言定义了人与机器之间的通信方式[1]。每一种新的技术都提供了一些新的方法来解决之前所未能非常好解决的问题。比如,通过独立于机器的代码将晦涩难懂的0-1指令抽象出来:通过面向过程的编程语言使人们能够採用结构化的设计方式来构造较为复杂的系统;通过面向对象编程语言中的类来封装具体数据和方法的实现细节使人们将复杂的系统进行具体的划分等。每一种新的技术都提供了一种更为自然的方式来将系统需求映射为编程结构。编程技术的不断发展能够使人们创建复杂度更高的系统,反之亦然,人们同意复杂度越来越高的系统存在,由于新的技术能够用来处理这样的复杂性。

2, OOP概念

OOP:Object-Orientedprogramming(面向对象程序设计)是一种程序设计范型,同一时候也是一种程序开发的技术。它将对象作为程序的基本单元,将程序和数据封装当中,以提高软件的重用性、灵活性和可扩展性。

OOP是一种运用对象,类,继承,聚合,消息传递,多态性来构造软件开发的方法,在系统构造中尽可能运用人类的自然思维方式。其基本的概念[2]例如以下:

(1)      对象(object):是系统中用来描写叙述客观事物的一个实体,它是构成系统的一个基本单位,一个对象由一组属性和对这组属性进行操作的一组服务构成。

(2)      类(class):具有同样属性和服务的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描写叙述,其内部包含属性和服务两个部分。

(3)      封装(encapsulation):把对象的属性和服务结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。

(4)      继承(inheritance):特殊类的对象拥有其一般类的所有属性和服务,称作特殊类对一般类的继承。

(5)      多态(polymorphism):指一般类中定义的属性或服务被特殊类继承之后,能够详细不同的数据类型或表现出不同的行为。

OOP能够看作一种在程序中包括各种独立而又互相调用的对象的思想,这与传统的思想刚好相反:传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每个对象都应该能够接受数据、处理数据并将数据传达给其他对象,因此它们都能够被看作一个小型的“机器”,即对象。
3,OOP的长处

OOP技术出现曾经,结构化设计是程序设计的主流。结构化程序设计又称为面向过程的编程方式。在面向过程的编程方式中,需求被看作一系列须要完毕的任务,函数用于完毕这些任务,解决这个问题的焦点集中于函数。当中函数是面向过程的,即它关注怎样依据规定的条件完毕指定的任务。

在多函数程序中,很多重要的数据被放置在全局数据区,这样它们能够被全部的函数訪问,同一时候每一个函数都能够具有自己的局部数据。图1.1显示了面向过程编程中函数与数据之间的关系。

AOP技术应用和研究--OOP_面向对象

这样的结构非常easy造成全局数据无意中被其它函数修改,因此程序的正确性不易保证。面向对象编程的出发点之中的一个就是弥补面向过程编程的这一缺点。在面向对象编程中,对象是程序的基本元素,它将数据和操作紧密地连结在一起,并保护数据不会被外界的函数意外地改变。图1.2显示了面向对象程序设计中对象、数据和方法之间的关系。

AOP技术应用和研究--OOP_软件开发_02

比較OOP和面向过程编程,还能够得到面向对象编程的其它长处[4]

(1)      数据抽象的概念能够在保持外部接口不变的情况下改变内部实现,从而降低甚至避免对外界的干扰。

(2)      通过继承机制不仅可大幅降低冗余的代码,并且还能够方便地扩展现有代码,从而提高了编码效率,降低了编码出错概率,降低软件维护的难度。

(3)      结合面向对象的分析、设计,同意将问题域中的对象直接映射到程序中,降低软件开发过程中中间环节的转换过程。

(4)      通过对对象的辨别、划分,能够将软件系统切割为若干相对独立的部分,在一定程度上便于控制软件复杂度。

(5)      以对象为中心的设计能够帮助开发者从静态属性和动态方法两个方面把握问题,从而更好地实现系统。

通过对象的聚合、联合,能够在保证封装与抽象的原则下实现对象内在结构和外在功能上的扩充,从而实现对象功能由低级到高级的转变。 4,OOP的缺点

面向对象的编程方法在软件开发领域引起了重大变革,极大地提高了软件开发的生产率,为解决软件危机带来了光明。可是,和其它编程方法一样,面向对象编程也并非完美无缺。比如,採用面向对象的编程方式可以非常好地解决软件系统中角色划分的问题,将软件开发中的很多关注点都模块化,并可以把这些关注点的详细实现细节封装在类中。可是,在系统中还存在还有一类关注点,它们并非某一个模块或者类所特有的,它们可能横跨多个模块或类,比如日志功能就行被系统中的很多模块引用。面向对象编程在处理此类关注点时所採用的办法就不够理想,从而造成了代码的混乱和分散[5~7]。可以通过一个简单的样例来说明採用向向对象编程实现横切关注点所带来的问题,这里给出一个封装了业务逻辑的类的实现框架:

public class BusinessClass extends BaseBusinessClass {
	//核心数据成员
	//其它数据成员:日志流,保证数据完整性的标志位等
	//重载基类的方法
	public void performSomeOperation(OperationInformation info) {
		//安全性验证
<span style="white-space:pre">	</span>//检查传入数据是否满足协议
<span style="white-space:pre">	</span>//锁定对象以保证当其它线程訪问时的数据完整性
<span style="white-space:pre">	</span>//检查缓存中是否为最新信息
<span style="white-space:pre">	</span>//记录操作開始运行时间
<span style="white-space:pre">	</span>//运行核心操作
<span style="white-space:pre">	</span>//己录操作完毕时间
	}
		//	一些相似操作
		public void save(PersitanceStorage ps) {}
}

在上面的代码中,存在两个问题:第一,其他数据成员不是这个类的核心关注点;第二,performSomeOperation()方法的实现做了很多核心操作之外的事,它要处理同志、验证、线程安全、协议验证和缓存管理等一些外围操作,并且这些外围操作相同也会应用于其他类。上述两个问题,归根究竟是因为OOP未能将系统中被多个模块所共同享用的需求非常好的模块化而引起的。为了解决横切关注点的模块化实现,一种新的编程技术—AOP面向方面编程(Aspect-OrientedProgramming)应运而生。


AOP技术应用和研究系列博客AOP技术应用和研究