结构合法值约束配置继承

时间:2014-02-23 19:37:05

标签: c inheritance configuration struct tcl

为了维护和测试大量结构,这些结构对其许多字段的合法值有各种限制,我们正在构建一个附加结构的通用系统,用于描述每个项目的合法值范围。面临的挑战是尽可能多地防止代码重复,我认为这是一种类似于继承的机制,其中特定案例可以从更通用的父案例中继承。

例如,假设我们有一个通用的car struct,并且合法值是(伪代码):

struct car-constraints {
    max-speed-range [80  - 220] //unit is in MPH
    total-weight    [0.5 - 4.0] //unit is in tons
    door-count      [2.0 - 6.0] //unit is integer
}

现在想象一下,结构实际上只包含几十个字段,实际上描述了一些特定网络功能的配置。现在我们有一个非常相似的结构,我们只想修改其中一个约束(例如):

struct sports-car-constraints (inherits) car-constraints{
    max-speed-range [150  - 370] //unit is in MPH -> The original value is overriden
}

我是如何在C中实现这一点的,所以我可以轻松地为系统中的每个对象设置并获得具有正确合法值范围的结构体?

我需要代码中的约束的原因:

  1. 它允许我们随机创建一个具有合法或错误字段值的实例用于测试目的。
  2. 它会鼓励开发人员编写描述合法价值范围的自我记录代码。
  3. 这可以防止大量代码重复。
  4. 我面临的主要挑战是c本身不支持继承。我们正在使用tcl进行脚本编写,这是非常灵活的,但我不知道如何编写通用代码来启动tcl并获取具有正确值的结构。

3 个答案:

答案 0 :(得分:1)

您可能需要考虑编写代码生成器。这种方法的概述如下:

  1. 使用恰好是您最喜欢的配置文件语法(以及用于解析该语法的库),编写一个配置文件,作为您希望在C结构中具有的内容的规范。

  2. 编写一个代码生成实用程序,该实用程序解析该配置文件并使用print语句生成一对.h.c文件,这些文件定义了C结构以及所需的任何支持函数。获取/设置他们的字段并进行范围检查。

  3. 您的Makefile应运行代码生成实用程序,然后编译生成的代码以及项目的手写代码。

  4. 代码生成应用程序不必在C中实现。相反,您可以使用您认为最适合该任务的任何语言编写代码生成应用程序。例如,由于您在项目中使用Tcl,因此可以在上面的列表中对项目1和2使用Tcl。

答案 1 :(得分:0)

C没有您在问题中描述的继承。

如果你只是在基础结构中添加新字段(而不是覆盖字段),我可以想到一个预处理器技巧,可以最大限度地减少要编写的代码量:

#define BASE_CAR_CONSTRAINTS \
   max_speed_range ...       \
   total_weight ...          \
   door_count ...            
   .
   .
   .

struct car_constraints {
   BASE_CAR_CONSTRAINTS
};

struct sports_car_constraints {
   BASE_CAR_CONSTRAINTS
   wheel_diameter_range ...
   .
   .
};

为了立即需要覆盖“基类”(基础结构)中的字段,为什么不使用上述方法,创建sports_car_constraints的实例并只覆盖字段max_speed_range

这样你就是:

  • 不再重复整个结构
  • 仅在'derived struct'中逐步修改'base struct'的增量

答案 2 :(得分:0)

执行此类操作的主要方法之一是将父结构包含为子结构的第一个成员值:

struct car-constraints {
    max-speed-range [80  - 220] //unit is in MPH
    total-weight    [0.5 - 4.0] //unit is in tons
    door-count      [2.0 - 6.0] //unit is integer
}

struct sports-car-constraints {
    struct car-constraints parent;
    max-speed-range [150  - 370] //unit is in MPH -> The original value is overriden
}

然后,您可以安全地将sports-car-constraints *转换为car-constraints * NB:指向结构的指针!)并重用现有的约束管理代码。

但是,您可能应该在真实的car-constraints中放置一个字段,该字段包含指向实现实际约束检查器的函数的指针,以便您可以将有关如何检查约束的知识委派给将执行的代码这是正确的东西,无论它有哪种类型。那么只有工厂功能必须了解一切;代码的客户端(包括Tcl接口)可以忽略复杂性。 (如果有几个这样的函数,将它们分解为它们自己的结构;也可以在那时正确地重新实现vtables ......)