对象式程序设计方法 作者:夏寒
本世纪60年代中期,对象式语言诞生,和以前传统的程序设计方法相比,对象式程序设计给我们开辟了全新的"视听"空间,对象式程序设计引进了异于以前过程式程序设计的概念和术语;怎样用对象式程序设计方法实现防火墙中的规则集......
本世纪60年代中期,对象式语言诞生,和以前传统的程序设计方法相比,对象式程序设计给我们开辟了全新的"视听"空间,对象式程序设计引进了异于以前过程式程序设计的以下几个概念和术语: 下面以我在项目中所用到的对象式程序设计为例,说明我对对象式程序设计的认识。
网络防火墙是用来维护网络安全的有效工具。我们在项目中开发的防火墙产品由包过滤和各级应用代理构成,包过滤和应用代理通过配合工作可以有效实现保护内部网安全、阻止外部网非法访问内部网的功能,但是包过滤和应用代理怎样区分哪些是允许访问内部网的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(...);
};
注:用"..."表示的部分在程序中已经实现,在这里略去。
我们在项目实现中通过利用对象式程序设计方法,充分感受到它的种种便利之处,通过它编出的程序有了较好的可读性和可复用性,便利了程序人员,也便利了普通用户。