可配置的自定义代码

时间:2017-06-07 14:20:03

标签: c architecture refactoring

我们客户提供的源代码包含将根据工具类型执行的部分代码。下面给出了示例代码部分。该功能具有公共部分和工具特定(硬件平台)部分。代码用C语言编写,在VxWorks中运行。添加或删除新工具类型具有代码修改。客户希望添加或删除新工具类型,只需最少的代码更改和测试工作

int vsp_recv(char *const recv_text)
{
    int rc  = 0;
    const int       type =  get_tool_type();
    // Common Code  

    if (MODEL_CR == type)
    {
        rc = beamoff(recv_text);                
    }
    else
    {
        rc = vsp_set(recv_text);
    }

    return(rc);
}

将代码分离为两种方法是正确的技术,如下所示,将它们保存在单独的源文件中并定义单独的make文件以生成特定于工具的二进制文件?有没有更好的方法来做到这一点?

工具类型MODEL_CR代码

int vsp_recv_tool_speccific(char *const recv_text)
{
    return beamoff(recv_text);              
}

工具类型MODEL_CV代码

int vsp_recv_tool_speccific(char *const recv_text)
{
    return vsp_set(recv_text);              
}

重构方法

int vsp_recv(char *const recv_text)
{
    int rc  = 0;
    const int       type =  get_tool_type();
    // Common Code  

    rc = vsp_recv_tool_speccific(recv_text);                
}

2 个答案:

答案 0 :(得分:0)

为每个工具定义一个共享库,并定义一个配置文件,用于定义为每个工具调用哪些函数。在启动时加载共享库,并在配置文件更改时提供信号捕获器以重新加载。

答案 1 :(得分:0)

OPs问题(和发布的代码)说需要修改3个地方。

  1. 功能:get_tool_type()
  2. 包含MODEL_CVMODEL_CR
  3. 定义的头文件
  4. if-then-else列表。
  5. 是我,我会实现一个函数指针表,让get_tool_type()返回该表的索引。然后所有if / then / else代码都将成为从表中调用函数的单个语句。

    然后任何更新都会添加到表中,修改'get_too_type(), and the additional functions like beam_off()`

    丢失工具类型不需要更改任何代码。

    添加工具类型需要在表格中添加条目,mod get_tool_type()以识别新工具,以及处理新工具类型的新功能。

    当然,这可能会导致代码永远不会被执行。