c - 将简单的算牌功能重构为多种功能?

标签 c

我刚刚开始从 Head First C 学习 C,但我很难理解如何将我的代码重构为多个函数,更具体地说,我不知道如何让函数工作,并且很困惑如何接受用户输入。

如何将如下所示的函数合并到主函数中?我可以使用哪些其他函数示例来重构?非常感谢!

void get_card_name(char *prompt, char *card_name)

主要功能

int main()
{
char card_name[3];
int count = 0;
while ( card_name[0] != 'X' ) {
    puts("Enter the card_name: ");
    scanf("%2s", card_name);
    int val = 0;
    switch(card_name[0]) {
    case 'K':
    case 'Q':
    case 'J':
        val = 10;
        break;
    case 'A':
        val = 11;
        break;
    case 'X':
        continue;
    default:
        val = atoi(card_name);
        if ((val < 1) || (val > 10)) {
            puts("I dont understand that value!");
            continue;
        }
    }
    if ((val > 2) && (val < 7)) {
        count++;
    } else if (val == 10) {
        count--;
    }
    printf("Current count: %i\n", count);
}
return 0;
}

最佳答案

涉及重构时的通用答案是“如果它看起来很复杂或难以阅读,请尝试将其分解为更容易阅读(和理解)的更小的部分。”。

在你的情况下,你有这个:

int main() {
  /* Initial state needed later on */

  /* Do some complicated stuff */
}

要重构它,您需要找出初始状态的哪些部分需要与您要移至其自己的函数中的内容保持接近。在您的示例中,card_namecount 都在复杂位内部使用,而不是在其他地方使用。因此,您可以而且应该将这些内容保留在复杂的部分附近:

void do_card_stuff() {
  char card_name[3];
  int count = 0;

  /* Do some complicated stuff */
}

int main() {
  do_card_stuff();
}

而且,你瞧,您已经重构了您的代码。如果您仍然认为卡片内容看起来很复杂,请尝试将其分解为更多部分:

int get_card_value(char card) {
  /* Do some complicated stuff */

  return value;
}

int do_card_stuff() {
  char card_name[3];
  int count = 0;
  int value;

  /* Loop */
    /* Get card value from user */
    value = get_card_value(card_name[0]);

}

int main() {
  do_card_stuff();
}

只要坚持下去,直到把它分成更小的部分是愚蠢的,你就完成了。另外,请记住,您分解的代码应尽可能通用,因为这将使您稍后可以重复使用此代码(可能在其他项目中)。

关于c - 将简单的算牌功能重构为多种功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12409506/

相关文章:

将控制序列转换为正确的字符

c - 在哪里可以找到 eventfd_write 文档?

c - mkl 界面运行时出现段错误

objective-c - 您可以从枚举元素的数值访问实际标识符吗?

c - C 中的结构数组缺少数据?

c - 从自定义系统调用生成段错误

c - C 中的日期格式 dd.mm.yyyy

c - 通过管道传递 c 中的整个结构

c - log4c - 我怎样才能只看到信息消息?

c - 将 openssl 库添加到我的项目中,出现错误 'openssl/ossl_typ.h' 找不到文件