0

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;
}
4

1 に答える 1

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

それを小さなビットに分割するのがばかげているまでそれを続けてください、そしてあなたは終わりです。また、作成するコードはできるだけ一般的なものにする必要があることに注意してください。これにより、後で(他のプロジェクトで)このコードを再利用できるようになります。

于 2012-09-14T10:16:32.903 に答える