使用switch-case/if-else
对于条件/分支处理的程序设计,我们惯性地会选择switch-case
或者if-else
,这也是C语言老师当初教的。以下,我们用一个播放器的例子来说明,要实现的功能如下:
收到用户操作播放器命令请求,如“播放”、“暂停”等,程序要对命令作区分;
针对不同的命令请求,作相应的处理;
输出必要的辅助信息。
首先,将命令定义成enum
类型:
enum{
CMD_PLAY, CMD_PAUSE, CMD_STOP, CMD_PLAY_NEXT, CMD_PLAY_PREV,};
然后,用switch-case
的分支处理:
switch(cmd){
case CMD_PLAY: // handle play command break; case CMD_PAUSE: // handle pause command break; case CMD_STOP: // handle stop command break; case CMD_PLAY_NEXT: // handle play next command break; case CMD_PLAY_PREV: // handle play previous command break; default: break;}
实际上,这也没什么毛病。但是,时间长了,需求不断变更,程序不断迭代,这个switch-case
会变得非常冗长而很难维护。你不相信?我曾经见到过>1000行的类似这样的代码。如果让你接手维护这样的代码,你内心会不会狂奔着万千草泥马?
但是,我不敢更改这个祖传的switch-case
啊,那么小心翼翼地将这些命令处理封装成函数。像这样:
#define FUNC_IN() printf("enter %s \r\n", __FUNCTION__)void func_cmd_play(void* p){
FUNC_IN();}void func_cmd_pause(void* p){
FUNC_IN();}void func_cmd_stop(void* p){
FUNC_IN();}void func_cmd_play_next(void* p){
FUNC_IN();}void func_cmd_play_prev(void* p){
FUNC_IN();}void pl