Когда упоминается Sales_data
, то подразумевается программист, который использует класс. Если речь идет о
В простых приложениях пользователь класса вполне может быть и его разработчиком. Но даже в таких случаях имеет смысл различать роли. Разрабатывая интерфейс класса, следует думать о том, чтобы его было проще использовать. При использовании класса не нужно думать, как именно он работает.
Авторы хороших приложений добиваются успеха потому, что понимают и реализуют потребности пользователей. Точно так же хорошие разработчики класса обращают пристальное внимание на потребности программистов, которые будут использовать их класс. У хорошо разработанного класса удобный, интуитивно понятный интерфейс, а его реализация достаточно эффективна для решения задач пользователя.
Sales_data
Прежде чем думать о реализации нашего класса, обдумаем то, как можно использовать функции его интерфейса. В качестве примера использования этих функций напишем новую версию программы книжного магазина из раздела 1.6, работающую с объектами класса Sales_data
, а не Sales_item
:
Sales_data total; //
if (read(cin, total)) { //
Sales_data trans; //
//
while(read(cin, trans)) { //
if (total.isbn() == trans.isbn()) //
total.combine(trans); //
else {
print(cout, total) << endl; //
total = trans; //
}
}
print(cout, total) << endl; //
} else { //
cerr << "No data?!" << endl; //
}
Сначала определяется объект класса Sales_data
для хранения текущей суммы. В условии оператора if
происходит вызов функции read()
для чтения в переменную total
первой транзакции. Это условие работает, как и другие написанные ранее циклы с использованием оператора >>
. Как и оператор >>
, наша функция read()
будет возвращать свой потоковый параметр, который и проверяет условие (см. раздел 4.11.2). Если функция read()
потерпит неудачу, сработает часть else
, выводящая сообщение об ошибке.