将简单的卡片计数功能重构为多个功能?

时间:2012-09-13 15:14:50

标签: 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;
}

1 个答案:

答案 0 :(得分:1)

重构的一般答案是“如果它看起来很复杂或难以阅读,请尝试将其分解为更易于阅读(并理解)的小块。”。

在你的情况下你有这个:

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();
}

只要坚持下去,直到把它分成更小的部分并且你已经完成是愚蠢的。另外,请记住,您突破的代码应尽可能通用,因为这将允许您稍后重新使用此代码(可能在其他项目中)。