“命令终端”的实现4-优化之解耦
Posted 李迟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“命令终端”的实现4-优化之解耦相关的知识,希望对你有一定的参考价值。
这段时间一直在做测试的工程(不是测试的工作),为了应付不同的测试场景,代码使用了解释器风格,至于实现,则使用了多年前写的命令终端代码。那会刚毕业不久,写的代码还是有提升空间。现在重新拾起,打破一般认知中的看不懂6个月前写的代码的刻板印象。
存在问题
原来的工程使用C代码编写,并不严格区分测试代码和实现代码,其中最大的问题是将命令列表做成全局变量并依赖于外部的定义,这样耦合程序非常高。因此需要分离出来。
原工程的文件命名也不太好,如common.h
这样的文件,在与其它工程整合时容易冲突,此次一并修改了。
解耦
依赖定义全局的命令列表,但只是指针,添加注册命令接口,由外部使用者调用。将默认的帮助命令调整至内部实现,外部直接使用。代码如下:
static cmd_tbl_t* cmd_table;
static int cmd_table_len = 0;
/*
register command
*/
void register_command(cmd_tbl_t* table, int len)
{
cmd_table = table;
cmd_table_len = len;
}
int do_help_default(int argc, char* argv[])
{
_do_help_default(cmd_table, argc, argv);
return 0;
}
在原有测试代码基础上,添加初始化命令函数,如下:
/* 定义命令列表 */
cmd_tbl_t my_cmd_table[] =
{
// do_help_default为默认函数,可重新实现
{"help", CONFIG_SYS_MAXARGS, do_help_default, "print help info."},
{"print", 2, do_print, "print the env."},
{"exit", 1, do_exit, "exit..."},
{"quit", 1, do_exit, "exit..."},
};
// 初始化,注册命令
void cmd_init()
{
int len = sizeof(my_cmd_table) / sizeof(my_cmd_table[0]);
register_command(my_cmd_table, len);
}
这样,在主体函数开始处调用cmd_init();
即可。如此一来,结构清晰,逻辑也清晰。
以上是关于“命令终端”的实现4-优化之解耦的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript进阶:如何写出优雅的JavaScript代码