对象式程序设计方法 作者:夏寒

对象式程序设计方法 作者:夏寒 

  本世纪60年代中期,对象式语言诞生,和以前传统的程序设计方法相比,对象式程序设计给我们开辟了全新的"视听"空间,对象式程序设计引进了异于以前过程式程序设计的概念和术语;怎样用对象式程序设计方法实现防火墙中的规则集......

  本世纪60年代中期,对象式语言诞生,和以前传统的程序设计方法相比,对象式程序设计给我们开辟了全新的"视听"空间,对象式程序设计引进了异于以前过程式程序设计的以下几个概念和术语:
  1、对象,对象式程序设计中的对象是对象式程序运行中的概念,是类的实例化,它模拟了现实世界中具体存在的对象,有自己的属性(包括自己特有的属性和同类对象的共性)。属性的作用有:与其他对象通信,表现为特征调用;反映自身状态变化,表现为当前的属性值。因此,静态的看,对象式程序设计中对象可以表示为(接口,数据,操作),动态的看,对象可表示为具有输入输出功能的自动机。
  2、类,是对象式程序中的一个静态概念,它是对客观世界中一组具有共同属性的事物的抽象,类提供的是对象实例化的模板,它包括了这组事物的共性,在程序运行过程中,类只有被实例化成对象才起作用。类的概念是对象式程序设计的基本概念,是支持模块化设计的设施。
  3、继承性,反映的是类与类之间抽象级别的不同,根据继承与被继承的关系,可分为衍类和基类,基类也称为父类,衍类也称为子类,正如"继承"这个词给我们的字面提示一样,子类将从父类那里获得所有的属性和方法,并且可以对这些获得的属性和方法加以改造,使之具有自己的特点。一个父类可以派生出若干子类,每个子类都可以通过继承和改造获得自己的一套属性和方法,由此,父类表现出的是共性和一般性,子类表现出的是个性和特性,父类的抽象级别高于子类。继承具有传递性,子类又可以派生出下一代孙类,相对于孙类,子类将成为其父类,具有较孙类高的抽象级别。继承反映的类与类之间的这种关系,使得程序人员可以在已有的类的基础上定义和实现新类,所以有效的支持了软件构件的复用,使得当需要在系统中增加新特征时所需的新代码最少。
  4、多态性,与一名多用、动态定连紧密联系在一起。多态的一般含义是,某一论域中的元素可以有多种解释。多态性在形式上表现为一个方法根据传递给它的参数的不同,可以调用不同的方法体,实现不同的操作。将多态性映射到现实世界中,则表现为同一个事物随着环境的不同,可以有不同的表现形态及不同的和其他事物通信的方式。动态定连是将方法名与相应的方法体联系起来的设施,它使得特征能自动适用于对象。将多态的概念应用于对象式程序设计,增强了程序对客观世界的模拟性,使得对象式程序具有了更好的可读性,更易于理解。程序设计语言中提供了多种支持多态的设施,如一名多用、类属,继承机制是对象式语言中所特有的支持多态的设施。
  5、动态定连,正如上所讲,动态定连是与多态相关联的概念,动态定连侧重于实现级,它所实现的功能就是将变量与其值、过程调用与相应可执行代码的确定和关连。对于多态变量来说,编译时刻只能确定其多态变化的范围(即动态类型集),对多态操作来说,实现该操作的代码只能在运行时刻确定。动态定连设施增加了程序设计语言的简明性和易扩充性。
  对象式程序设计基于上述的基本概念,与传统程序设计方法相比有了很大的改进。传统程序设计方法是基于功能的、自顶向下的"黑箱法";对象式程序设计方法是基于对象的,自底向上?quot;白箱法"。与对象式程序设计方法相比,传统程序设计方法在以下几点上存在着明显的不足:
  1、"黑箱法"是基于功能的,功能是易变的,因而程序具有不稳定性、易变性,难以适应系统进化中的变动,往往功能的变化就意味着重新设计。
  2、"黑箱法"不能对客观世界进行直接模拟,因而从概念上讲是间接的,人机交互语言的自然性较差,增加了程序开发人员维护程序的难度。
  3、"黑箱法"基于功能,导致了程序的层次感较差,可扩充性、可移植性均较差,软件构件难以复用,软件的开发通常无法借用已有的劳动。
  对象式程序设计方法------"白箱?quot;,在以下几点有明显的优势:
  1、 用"类"、"对象"的概念直接对客观世界进行模拟,客观世界中存在的事物、事物所具有的属性、事物间的联系均可以在对象式程序设计语言中找到相应的机制,对象式程序设计方法采用这种方式是合理的,它符合人们认识事物的规律,改善了程序的可读性,使人机交互更加贴近自然语言,这与传统程序设计方法相比,是一个很大的进步。
  2、 对象式程序设计方法是基于问题对象的,问题对象的模板是现实世界中的实在对象,对象式程序设计从内部结构上模拟客观世界,与基于功能模拟的传统程序设计方法相比,问题对象比功能更稳定,功能也许是瞬息万变的、也许一天变一个样、也许十天半月变一个样,而问题对象却相对稳定,因而模拟问题对象比模拟功能使得程序具有较好的稳定性,也减轻了程序人员的工作难度。
  3、 对象式程序中提供了若干种增加程序可扩充性、可移植性的设施。如继承设施、多态设施、接口设施。继承设施和多态设施前已提及。接口是一个对象供外部使用者调用的设施,外部使用者通过调用一个对象的接口对该对象进行操作,完成相应功能,使得该对象的状态改变,或对其他对象进行动作,以实现生成新的对象或与其他对象通信的目的。接口设施的设置还有诸多益处,接口可看作一个对象与外界保持联系的窗口。一个对象通过接口从外界获得信息,也通过接口将信息传递出去,体现出一个对象由生成到活动到消亡的整个过程,接口的设置体现了对象的自治性和封闭性。自治性如上所述,对象通过与外界的消息传递,完成一个活动周期(生成,活动,消亡),对象与外界的消息传递都是通过接口完成的;封闭性是指对象仅仅通过接口与外界互通消息,实现自身状态的改变,外界不可以直接对对象状态进行操作,对象内部的私有属性是对外界屏蔽的。在某些对象式程序设计语言中,如JAVA,接口还可以实现类间的多重继承功能,并且避免了通常的多重继承也称为"钻石继承"所带来的属性继承路径不确定的问题。说明一个接口类型,以接口类型作为父类的子类只继承父类的约定而不继承实现,通过这种方法来解决实现的继承属性中路径不确定的问题,同时又实现了多重继承功能。
  4、 对象式程序中类与类之间的关系有继承关系、引用关系,这两种关系模拟了客观世界中事物间"是"和"有"的关系。当客观世界中存在两种事物,假设为事物A和事物B。如果A和B之间存在A中"有"B这样的关系,那么在用对象式程序模拟的时候,我们需要在类A和类B之间建立允引关系,A为引用类,B为允用类,且A中存在变量设为x,有x:B这样的语句;如果A和B之间存在"是"这样的关系,如A是B的一种特例,那么在用对象式程序模拟的时候,类A和类B间是继承关系,A为衍类,B为基类,在实现类A的继承部分,需要有Inherit B这样的语句。类间这两种关系的引入,给程序人员提供了很大的方便,可以在系统原有的类的基础上生成新类,节省了时间和空间。

  下面以我在项目中所用到的对象式程序设计为例,说明我对对象式程序设计的认识。
  网络防火墙是用来维护网络安全的有效工具。我们在项目中开发的防火墙产品由包过滤和各级应用代理构成,包过滤和应用代理通过配合工作可以有效实现保护内部网安全、阻止外部网非法访问内部网的功能,但是包过滤和应用代理怎样区分哪些是允许访问内部网的IP地址,哪些是允许访问诓客衿鞯挠没В饩托枰幸桓鍪孪仍级ǖ墓嬖蚣谡飧龉嬖蚣薪魅饭娑ê戏ǖ腎P(范围)、合法的用户、合法的访问时间、以及特定的用户通过特定的IP(范围)在特定的时间段里可以享受的特定服务,规则集中的每条规则应至少包括以下几个域:用户名、信源的IP地址、信宿的IP地址、用户要求的服务名、防火墙对用户的访问做出的动作,包括接受,拒绝,认证、规则发挥作用的有效时间,包括起始时间和结束时间,通过使用规则,来约束包过滤和应用代理的行为,产生拒绝某个用户访问,拒绝从某个IP来的访问的效果。
  以下讨论的便是怎样用对象式程序设计方法实现防火墙中的规则集。根据对象式开发过程,首要工作是识认应用领域中的基本对象及其相互关系,将客观世界中的实在对象抽象问题对象,通过对防火墙应实现的各功能的分析以及对各功能模块之间关系的分析,我们确定防火墙的规则集应起到约束各功能模块工作的作用,规则集应作为包过滤、应用代理模块工作的指导模块而存在,各功能模块在发挥具体功能前应先检查规则集,通过传递给规则集相关参数,实现与规则集模块的通信,匹配每条规则,获得从特定IP来的特定用户在特定时间里访问内部网的特定服务器时该功能模块应该采取的动作,是允许访问、拒绝访问、认证用户身份、还是跟踪用户访问信息,通过以上分析,我们明确了我们所要实现的规则集是由若干条单个规则,经过组织后形成的集合,每条规则由相关的域组成。防火墙规则集若作为一个具有自治性、封闭性的对象实体,还需要有和其他对象实体通信的能力,如防火墙管理员要能够对规则集进行各种操作,包括规则的添加、删除、检查,将这些用对象式程序设计语言实现的话,就表现为规则集类的移出特征,在问题对象中规则集也需要有相应的特征。因为规则集是由规则组成的,每条规则有自己独立的域,对规则集的匹配实际上是对每条规则的匹配,因此每条规则需要有匹配这样的对外属性,规则集与规则的关系?quot;有"的关系,将规则抽象成另一个问题对象,规则类与规则集类存在允引关系。这样我们便完成了由实在对象向问题对象的转化,下一步便是确定该用什么样的计算机对象来模拟问题对象。根据最常规的表示方法,规则集用链表表示,链表中的每个元素表示一条规则,链表有表头和表尾,链表中的每个元素用一个指针指向下一个元素,基于链表的操作有:AddRule,表示添加一条规则;RemoveAll,表示删除所有规则;CheckRule,表示检查规则集,同时返回检查结果。规则用另一个类表示,类中的各个属性对应于规则中的各个域:RuleID,是每条规则相互区别的唯一标志;UserList,表示用户名;DestBegin,DestEnd,表示信宿的IP范围;SourceBegin,SourceEnd,表示信源的IP范围;DestPortBegin,DestPortEnd,表示信宿的端口范围;Action,表示匹配成功的功能模块应该采取的动作;BeginTime,EndTime,表示规则有效的起止时间;ServiceName,表示允许的服务名;NextItem,指向下一条规则。规则类上的操作有:CheckRule,表示规则的匹配,它需要分别对规则的用户名、信源IP、信宿IP、信宿端口、有效时间进行匹配,它是对规则集类中CheckRule的具体实现。这样确定了计算机对象后,就可以着手实现了,以下是我们实现规则集和规则的例子:(用C++代码表示)
class CRule
{
private:
CRule_Item *pRuleListHead, //表头
*pRuleListTail; //表尾
public:
CRule(void);
~CRule(void);
... ...
void RemoveAll(...);
void AddRule(...);
bool CheckRule(...);
};
class CRule_Item
{
public:
int RuleID; //目标规则号
CUserList UserList; //用户名
unsigned int DestBegin,DestEnd; //All in net order
unsigned int SourceBegin,SourceEnd;
WORD DestPortBegin,DestPortEnd;
char Action; //动作
SYSTEMTIME BeginTime; //规则有效的起始时间
SYSTEMTIME EndTime; //规则有效的结束时间
CString ServiceName;
CRule_Item *NextItem;

private:
... ...
bool IsSourceValid(...); //判断信源IP是否有效
bool IsDestValid(...); //判断信宿IP是否有效
bool IsDestPortValid(...); //判断信宿端口是否有效
bool IsTimeValid(...); //判断是否为规则的有效时间
bool IsUserValid(...); //两个IsUserValid函数是函数多态
bool IsUserValid(...); //表示的例子,判断用户名是否有 效
public:
CRule_Item(void);
~CRule_Item(void);
bool CheckRule(...);
};
  注:用"..."表示的部分在程序中已经实现,在这里略去。
  我们在项目实现中通过利用对象式程序设计方法,充分感受到它的种种便利之处,通过它编出的程序有了较好的可读性和可复用性,便利了程序人员,也便利了普通用户。

你可能感兴趣的:(code)