KeaTestElements
本部分旨在解释 Kea 运行时数据管理类 KeaTestElements 的设计与实现。
功能设计与实现
KeaTestElements是Kea运行时存储用户自定义性质的数据结构,与用户继承并自定义的keaTest一一对应。 在kea启动时,keaTestElements会读取每个用户自定义的keaTest,并重新组织为方便kea进行读取的数据结构。 具体的转换过程可参考装饰器一章:从用户自定义KeaTest到运行时KeaTestElements的转换。
KeaTestElements的数据结构图示如下:
KeaTestElements 数据结构
其中,keaTest_name是一个字符串,用于存储用户定义的keaTest的类名。Rules是一个列表,用于存储Rule对象。 Initializers是一个列表,用于存储初始化函数对象Initializer。MainPaths是一个列表,用于存储主要路径对象MainPath。
其中,Rule、MainPath和Initializer对象的数据结构及定义可参见“装饰器”一章。
KeaTestElements的成员方法定义伪代码如下:
class KeaTestElements:
def load_rules(keaTest)
def load_initializers(keaTest)
def load_mainPaths(keaTest)
load_rules接收一个用户自定义的keaTest对象,读取其中的rule并将一个keaTest中的所有rule存储入rules列表。 load_initializers接收一个用户自定义的keaTest对象,读取其中的初始化函数对象Initializer并将其存储入initializers列表。 load_mainPaths接收一个用户自定义的keaTest对象,读取其中的主路径对象mainPath并将其存储入mainPaths列表。
具体而言,在三个load方法的执行步骤相似,其执行步骤可描述如下:
1. 传入一个keaTest对象。
2. 在传入的keaTest对象中查找含有相对应MARKER标记的函数对象。
3. 将其相应的数据结构(Rule, Initializer和MainPath)以列表的方式组织存储为成员变量。
KeaTestElements 的成员方法读取KeaTest中的数据,转换为方便Kea使用的数据结构
三个成员方法的具体实现如下:
load_rules
- 参数:
keaTest:KeaTest: 用户自定义性质的keaTest对象
- 返回:
无
def load_rules(self, keaTest:"KeaTest"):
for _, v in inspect.getmembers(keaTest):
rule = getattr(v, RULE_MARKER, None)
if rule is not None:
self.rules.append(rule)
load_initializers
- 参数:
keaTest:KeaTest: 用户自定义性质的keaTest对象
- 返回:
无
def load_initializers(self, keaTest:"KeaTest"):
for _, v in inspect.getmembers(keaTest):
initializer = getattr(v, INITIALIZER_MARKER, None)
if initializer is not None:
self.initializers.append(initializer)
load_mainPaths
- 参数:
keaTest:KeaTest: 用户自定义性质的keaTest对象
- 返回:
无
def load_mainPaths(self, keaTest:"KeaTest"):
for _, v in inspect.getmembers(keaTest):
mainPath = getattr(v, MAINPATH_MARKER, None)
if mainPath is not None:
self.mainPaths.append(mainPath)