我们客户提供的源代码包含将根据工具类型执行的部分代码。下面给出了示例代码部分。该功能具有公共部分和工具特定(硬件平台)部分。代码用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);
}
答案 0 :(得分:0)
为每个工具定义一个共享库,并定义一个配置文件,用于定义为每个工具调用哪些函数。在启动时加载共享库,并在配置文件更改时提供信号捕获器以重新加载。
答案 1 :(得分:0)
OPs问题(和发布的代码)说需要修改3个地方。
get_tool_type()
MODEL_CV
,MODEL_CR
等if-then-else
列表。是我,我会实现一个函数指针表,让get_tool_type()
返回该表的索引。然后所有if / then / else代码都将成为从表中调用函数的单个语句。
然后任何更新都会添加到表中,修改'get_too_type(), and the additional functions like
beam_off()`
丢失工具类型不需要更改任何代码。
添加工具类型需要在表格中添加条目,mod get_tool_type()
以识别新工具,以及处理新工具类型的新功能。
当然,这可能会导致代码永远不会被执行。