“命令终端”的实现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-优化之解耦的主要内容,如果未能解决你的问题,请参考以下文章

系统管理之组织机构树形化结构优化篇

Java代码实现设计模式之工厂模式

C#之发送邮件模板+封装ZJ版

JavaScript进阶:如何写出优雅的JavaScript代码

Day784.网络通信优化之序列化:避免使用Java序列化 -Java 性能调优实战

Spring中如何使用工厂模式实现程序解耦?