Рефакторинг длинного оператора switch с символами латинского алфавита


Исходный код

bool IsBukva(char symbol)
{
switch(symbol)
{
case 'a':return 1;break;
case 'b':return 1;break;
case 'c':return 1;break;
case 'd':return 1;break;
case 'e':return 1;break;
case 'f':return 1;break;
case 'g':return 1;break;
case 'h':return 1;break;
case 'i':return 1;break;
case 'j':return 1;break;
case 'k':return 1;break;
case 'l':return 1;break;
case 'm':return 1;break;
case 'n':return 1;break;
case 'o':return 1;break;
case 'p':return 1;break;
case 'q':return 1;break;
case 'r':return 1;break;
case 's':return 1;break;
case 't':return 1;break;
case 'u':return 1;break;
case 'v':return 1;break;
case 'w':return 1;break;
case 'x':return 1;break;
case 'y':return 1;break;
case 'z':return 1;break;
case 'A':return 1;break;
case 'B':return 1;break;
case 'C':return 1;break;
case 'D':return 1;break;
case 'E':return 1;break;
case 'F':return 1;break;
case 'G':return 1;break;
case 'H':return 1;break;
case 'I':return 1;break;
case 'J':return 1;break;
case 'K':return 1;break;
case 'L':return 1;break;
case 'M':return 1;break;
case 'N':return 1;break;
case 'O':return 1;break;
case 'P':return 1;break;
case 'Q':return 1;break;
case 'R':return 1;break;
case 'S':return 1;break;
case 'T':return 1;break;
case 'U':return 1;break;
case 'V':return 1;break;
case 'W':return 1;break;
case 'X':return 1;break;
case 'Y':return 1;break;
case 'Z':return 1;break;
default: return 0;
}
}

Что не так в этом коде

Здесь проигнорированы сразу несколько типовых подходов.

  1. После оператора return нет смысла добавлять оператор break — после первого сразу произойдёт выход из функции, соответственно, проход по операторам case тоже прервётся:
switch (symbol)
{
case 'a': return 1;
  1. Нет смысла ставить return после каждого case: несколько подряд case могут сопровождаться одним на всех действием, именно поэтому обычно case работает в паре с break.
switch (symbol) {
    case 'a':
    case 'b':
    // ...
    case 'Z':
        return1;
}
  1. Обычно при выяснении принадлежности символа к некоему диапазону пользуются фактом, что символ — это просто другое представление обычных чисел в языках C/C++, и можно символы сравнивать между собой и с числами через операции больше/меньше. Чтобы этот трюк сработал, нужно знать, в какой кодировке представлен текст. В широко распространённой кодировке ASCII латинские символы a-z и A-Z идут подряд, поэтому можно сравнивать исследуемый символ только с первыми и последними символами последовательностей:
return symbol >= 'a' && symbol <= 'z' || symbol >= 'A' && symbol <= 'Z';
  1. И наконец, смешение английских и русских слов: такое обычно не приветствуется. Поэтому функцию следовало назвать IsLetter, а учитывая, что подразумеваются только латинские буквы — IsLatinLetter.