関数テーブルを使用する
コマンドに応じた処理を実行するのに、if文やswitch文を用いず、関数テーブルを使用する。関数テーブルを使用すると慣れていないと関数を追いにくくはなるが、分岐や状態遷移を綺麗に整理できるので、慣れると可読性は上がる。
以下は関数テーブルに対応するコマンドを実行する為のシンプルな形
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 #include <stdio.h>//コマンド一覧enum {CMD_0, //コマンド0CMD_1, //コマンド1CMD_2, //コマンド2};//コマンド - 関数の対応typedef struct {int cmd;void (*func)();} CMD_FUNC_T;//コマンド0の実施事項static void cmd0_action(){printf("this is cmd0\n");}//コマンド1の実施事項static void cmd1_action(){printf("this is cmd1\n");}//コマンド2の実施事項static void cmd2_action(){printf("this is cmd2\n");}//関数テーブルstatic const CMD_FUNC_T func_table[] = {{CMD_0, cmd0_action},{CMD_1, cmd1_action},{CMD_2, cmd2_action},};// コマンド番号で指定されたコマンドを実行する関数static void exec_cmd(int cmd_no){int i;int cmd_num = sizeof(func_table)/sizeof(func_table[0]);for (i=0; i < cmd_num; i++){if ( func_table[i].cmd == cmd_no ){func_table[i].func();}}}int main(){exec_cmd(CMD_0); //コマンド0を実行するexec_cmd(CMD_1); //コマンド1を実行するexec_cmd(CMD_2); //コマンド2を実行するreturn 0;}
コメント