Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:
1. Функция
main
описывает общую логическую структуру: начало программы, конец программы и обработку фатальных ошибок. 2. Функция
main
выполняет цикл вычислений.
main
выполняет оба эти действия, то это затемняет структуру программы. Напрашивается выделение цикла вычислений в виде отдельной функции calculate
.
void calculate //
цикл вычисления выражения
{
while (cin) {
cout << prompt;
Token t = ts.get;
while (t.kind == print) t=ts.get; // отмена печати
if (t.kind == quit) return;
ts.putback(t);
cout << result << expression << endl;
}
}
int main
try {
calculate;
keep_window_open; // обеспечивает консольный режим Windows
return 0;
}
catch (runtime_error& e) {
cerr << e.what << endl;
keep_window_open("~~");
return 1;
}
catch (...) {
cerr << "exception \n";
keep_window_open("~~");
return 2;
}
Этот код намного более четко отражает структуру программы, и, следовательно, его проще понять.
7.6.3. Расположение кода
Поиск некрасивого кода приводит нас к следующему фрагменту:
switch (ch) {
case 'q': case ';': case '%': case '(': case ')':
case '+': case '–': case '*': case '/':
return Token(ch); // пусть каждый символ обозначает сам себя
Этот код был неплох, пока мы не добавили символы
'q'
, ';'
и '%'
, но теперь он стал непонятным. Код, который трудно читать, часто скрывает ошибки. И конечно, они есть в этом фрагменте! Для их выявления необходимо разместить каждый раздел case
в отдельной строке и расставить комментарии. Итак, функция Token_stream::get
принимает следующий вид:
Token Token_stream::get
// считываем символ из потока cin и образуем лексему
{
if (full) { // проверяем, есть ли в потоке хотя бы одна лексема
full=false;
return buffer;
}
char ch;
cin >> ch; //
Перевод:" оператор >> игнорирует разделители пробелы,
// переходы на новую строку, табуляцию и пр.)"
switch (ch) {
case quit:
case print:
case '(':
case ')':
case '+':
case '–':
case '*':
case '/':
case '%':
return Token(ch); // пусть каждый символ обозначает сам себя
case '.': // литерал с плавающей точкой может начинаться с точки
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9': // числовой
// литерал
{ cin.putback(ch); // возвращаем цифру обратно во входной
// поток
double val;
cin >> val; // считываем число с плавающей точкой
return Token(number,val);
}
default:
error("Неправильная лексема");
}
}
Разумеется, можно было бы поместить в отдельной строке раздел
case
для каждой цифры, но это нисколько не прояснит программу. Кроме того, в этом случае функция get
вообще осталась бы за пределами экрана. В идеале на экране должны поместиться все функции; очевидно, что ошибку легче скрыть в коде, который находится за пределами экрана. Расположение кода имеет важное значение. Кроме того, обратите внимание на то, что мы заменили простой символ 'q'
символическим именем quit
. Это повышает читабельность кода и гарантирует появление сообщения компилятора при попытке выбрать для имени quit
значение, уже связанное с другим именем лексемы.
7.6.4. Комментарии
При разработке кода мы включили в него несколько комментариев. Хорошие комментарии — важная часть программирования. В рабочей суматохе мы часто забываем об этом. Момент, когда мы возвращаемся к коду для приведения его в порядок, лучше всего подходит для проверки следующих свойств комментариев.
Поделиться:
Популярные книги
Бастард Императора
1. Бастард Императора
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
На границе империй. Том 10. Часть 1
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Имя нам Легион. Том 7
7. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Измена. Вторая жена мужа
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Буря империи
6. Медорфенов
Фантастика:
аниме
фэнтези
фантастика: прочее
эпическая фантастика
5.00
рейтинг книги
Пенсия для морского дьявола
1. Первый в касте бездны
Фантастика:
попаданцы
5.29
рейтинг книги
На изломе чувств
Любовные романы:
современные любовные романы
6.83
рейтинг книги
Тринадцатый II
2. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сирота
1. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 9
9. Граф Берестьев
Фантастика:
городское фэнтези
попаданцы
аниме
дорама
фэнтези
фантастика: прочее
5.00
рейтинг книги
Красноармеец
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Огненный князь 4
4. Багряный восход
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Начальник милиции. Книга 5
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Инкарнатор
1. Стеллар
Фантастика:
боевая фантастика
рпг
7.30