TTCN3新执行器系列-实现类型兼容问题

来源:互联网 发布:淘宝618是什么时候 编辑:程序博客网 时间:2024/05/17 04:14

ttcn3语言有类型兼容这样一个概念,主要用于赋值情况。

最简单就是简单类型兼容,如integer类型,

由于ttcn3的integer属于内建类型,但同时你可以在asn文件中重定义并加上范围限制。

于是,一般的asn文件定义的integer类型是非常多的,可以有数十种之多。

如果我们把ttcn3内建的integer看做是基类,则asn重定义的应该就是派生类了。

 

因为我们的新执行器是基于C++实现的,所以也看看C++的情况。

以函数形参来举例,我们支持值传递和引用传递方式(指针传递实际是值传递)。

如果是值传递,

1、形参是派生类,实参是基类,这要求派生类提供一个带基类的构造函数。

2、形参是基类,实参是派生类,这是危险的处理,会导致类型截取操作。

3、形参是派生类A,实参是派生类B?

 

如果是引用传递

1、形参是派生类引用,实参是基类?

2、形参是基类引用,实参是派生类,这是使用很多的用法。

3、形参是派生类A引用,实参是派生类B?

 

由于C++是强类型的语言,所以要处理类似这样的问题,建议使用引用传递的方案1。

 

但正如C++一样,ttcn3语言对于形参,可以使用in或者out的方式,也就是用户有权利选择值传递和引用传递。

但值传递是很难处理兼容性问题的。。。

更麻烦的是,ttcn3以out方式操作时,形参和实参的类型不一致的情况。

因为out方式就是C++的引用传递,值在函数内部的改变,需要带出到函数外部中。

 

 所以,单单依靠纯C++语言的构造函数功能,是无法支持上述功能实现的。

 

这个问题的最后解决,得益于软件开发的一句真理名言:任何技术问题都可以通过中间量方式进行解耦实现。

 

于是,我们想出使用CInParam和COutParam类来实现参数in和inout方式,

因为形参的类型T是非常重要的,不能丢失,所以这两个类实现为模板类,用于保留形参的T信息。

 

这样,在实参和形参中间,增加了这样一个封装处理,操作起来就简单多了。

 

我们可以在类中对形参和实参的类型进行检测,如果不一致,则:

对于in值传递类型,需要生成一份形参实体,然后通过实参来赋值之;

对于out引用传递类型,需要生成一份形参实体,然后通过实参赋值之,在函数结束时反赋值为实参;

 

我们把大量逻辑处理工作都通过类的方式封装起来了,

外部看起来代码相对简洁,通过能处理各种各样的类型兼容问题,无论是in还是out方式。

 

当然,类型兼容情况,是会导致性能损耗情况的(内部会有新建和销毁临时实体的动作),

但这应该是用户需要关心的问题,如果用户确实有这个需要,那我们能实现功能就是了,不应该过分强制这个或那个。

 

 

C++语言的三个核心,封装、继承和多态,我觉得封装是更基础的。

现在boost的bind和function能很好的实现继承和多态的问题,也印证了这点。

 

 

原创粉丝点击