我正在编写一个带有菜单和不同部分(创建/查看等)的简单ncurses程序,所有这些都使用键盘。目前我有一个getkey例程,然后切换以确定键盘输入的部分,如下所示:
ch = getch();
if(menu){
switch(ch){
...
if(create){
switch(ch){
...
if(view){
switch(ch){
...
这是最好的方法,或者我应该为每个部分(menu_getkey(),view_getkey()等)提供不同的getkey例程 - 这是最好的方法吗?
答案 0 :(得分:0)
这进入了一些设计(因此可能有点主观),但我认为你的方法很好。它允许您在深入了解详细信息之前处理接近getch()
的公共输入逻辑,并且通常,如果可能的话,在单个位置处理事件(例如,键盘输入)通常是个好主意 - 随着程序的增长,有多个事件循环会变得混乱。
编写它的等效方式如下:
enum { MENU, CREATE, VIEW } input_focus = MENU;
...
void input_loop(void) {
for (;;) {
int ch = getch();
/* Put common input logic here. */
switch (input_focus) {
case MENU:
handle_menu_input(ch);
break;
case CREATE:
handle_create_input(ch);
break;
case VIEW:
handle_view_input(ch);
break;
}
}
}
您的个人case
可能需要更多逻辑,但您明白了。
功能短有助于提高可读性。现代编译器非常智能,只能调用一次内联函数(删除函数调用并直接插入代码),因此不要担心性能问题。 (如果有人挑剔这个 - 是的,它需要对不同编译单元中的函数进行链接时优化。)
让你更新的函数指针总是指向当前的输入焦点,而不是switch
是另一种选择,但这里有点过分。它有点像C ++对虚函数的作用。