Программирование. Принципы и практика использования C++ Исправленное издание, стр. 98
keep_window_open(); return 0; } ts.putback(t); cout << result << expression() << endl;}7.6.2. Использование функций
Функции должны отражать структуру программы, и их имена должны обеспечивать логическое разделение кода на отдельные части. В этом отношении наша программа до сих пор не вызывала нареканий: функции
expression()term()primary()get()main()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'';''%'caseToken_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("Неправильная лексема"); }}Разумеется, можно было бы поместить в отдельной строке раздел
caseget()'q'quitquit