2009年6月25日星期四

Something about tcl programming for Spirent TestCenter

前两天为了解决遗留程序的一个bug,动手写了点TCL程序。

TCL作为解释型的语言,并不在你第一次定义变量时给你预设一个值,哪怕是随机的值。所以,刚用起来有点不顺手。
TCL的数组其实很类似hashtable,tcl数组的index可以是任意值。所以,虽然tcl不支持多维数组,但是依旧有些小技巧模拟多维数组。这很重要,因为tcl同时没有structure类型。复杂的需要分层的数据结构只能依赖所模拟出来的多维数组了。

如下的一段代码,就是用来模拟多维数组的:

set trafficConfig($trafficHandle,Transmit_mode) $transmit_mode;
set trafficConfig($trafficHandle,LoadUnit) $loadUnit;
set trafficConfig($trafficHandle,FixedLoad) $loads;

需要注意的是,必须跟后面的字符串紧挨着。

有了“多维”数组,再利用tcl的namespace eval 语句,就可以完成基本的数据结构的定义了。再写点函数,就可以模拟一个类了。

package provide DataCenter 0.1

set trafficConfig(NULL) NULL;

namespace eval StcTools {

namespace eval Traffic {

proc construct { trafficHandle transmit_mode loadUnit loads} {
global trafficConfig;

puts "Traffic construct() for $trafficHandle "

set trafficConfig($trafficHandle,Name) $trafficHandle;
set trafficConfig($trafficHandle,Transmit_mode) $transmit_mode;
set trafficConfig($trafficHandle,LoadUnit) $loadUnit;
set trafficConfig($trafficHandle,FixedLoad) $loads;
}

proc setting { trafficHandle name value } {
global trafficConfig;
set trafficConfig($trafficHandle,$name) $value;
}

proc printTrafficSettingInfo { } {
global trafficConfig;
puts "trafficSettingInfo:"
foreach {key value} [array get trafficConfig] {
puts " trafficConfig($key)= $value";
}
}


StcTools ::Traffic就可以理解为一个类。
construct()就是构造方法。
setting(handle, name, value)就可以理解为setter方法, 业务逻辑的方法就可以自己随便起名、定义了。

用这种思路写出程序比遗留代码强多了---清晰。清晰了,当然就易维护。这种思路是从TCPMP项目中学来的。TCPMP利用C语言开发,但是它利用c的结构体,以及其它技术,也构造了自己的简单的面向对象架构。我都怀疑面向对象的初始想法可能就是基于这种简单的程序架构发展而来的了。

程序开发中数据与逻辑的分离,数据层次的划分、组织,是很基本的事情。
数据的组织,又是直接和业务模型的抽象、建立相关的。