Программирование. Принципы и практика использования C++ Исправленное издание, стр. 374
Рассмотрим примеры, иллюстрирующие каждый из перечисленных пунктов.
26.3.3.1. Зависимости
Рассмотрим следующую бессмысленную функцию.
int do_dependent(int a,int& b) // плохая функция // неорганизованные зависимости{ int val; cin>>val; vec[val] += 10; cout << a; b++; return b;}Для тестирования функции
do_dependent()cincoutvecДля того чтобы протестировать функцию
do_dependent()• Входные данные функции
• Значение переменной
a• Значения переменной
bintb• Ввод из потока
cinvalcin• Состояние потока
cout• Значение переменной
vecvec[val]• Выходные данные функции
• Возвращаемое значение.
• Значение переменной типа
intb• Состояние объекта
cin• Состояние объекта
cout• Состояние массива
vecvec[val]• Любые исключения, которые мог сгенерировать массив
vecvec[val]
Как только мы идентифицировали входные и выходные данные, мы тут же оказываемся в ситуации, в которой уже побывали, тестируя
binary_search()do_dependent()valvalvec26.3.3.2. Управление ресурсами
Рассмотрим бессмысленную функцию.
void do_resources1(int a, int b, const char* s) // плохая функция // неаккуратное использование ресурсов{ FILE* f = fopen(s,"r"); // открываем файл (стиль C) int* p = new int[a]; // выделяем память if (b<=0) throw Bad_arg(); // может генерировать исключение int* q = new int[b]; // выделяем еще немного памяти delete[] p; // освобождаем память, // на которую ссылается указатель p}Для того чтобы протестировать функцию
do_resources1()Перечислим очевидные недостатки.
• Файл
s• Память, выделенная для указателя
pb<=0• Память, выделенная для указателя
q0<bКроме того, мы всегда должны рассматривать возможность того, что попытка открыть файл закончится неудачей. Для того чтобы получить этот неутешительный результат, мы намеренно использовали устаревший стиль программирования (функция
fopen()void do_resources2(int a, int b, const char* s) // менее плохой код{ ifstream is(s); // открываем файл vector<int>v1(a); // создаем вектор (выделяем память) if (b<=0) throw Bad_arg(); // может генерировать исключение