Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 230
Текст из файла (страница 230)
7. ("2.5) Спроектируйте и реализуйте фасет телефонных номеров. Сдслаите это как минимум лля двух стран с непохожими соглашениями относительно написания телефонных номеров. Например; (973) 360 — 8000 и 1223343000. 8. (*2.5) Поэкспериментируйте и посмотрите, какие форматы ввода и вывода данных используются в вашей реализации. 9. ("2.5) Определите де( 11те1), которая «догадывается» о смысле дат, таких как 12 5 1995, но при этом отвергает все или почти все ошибочные данные.
Будьтс точны в определении того, какие именно «догадки» приемлемы; обсудите вероят ность ошибки. 10. (*2) Определите де1 1(те(), которая воспринимает значительно больше форматов, чем приведенная в 9 Г.4А.5. 11. (»2) Составьте список локализаций, поддерживаемых вашей системой. 12. (*2,5) Выясните, где в вашей системе хранятся именованные локализации. Если у вас есть доступ к той части системы, где хранятся локализации, создайте новую именованную локализацию, Будьте очень осторожны, чтобы нс испортить существующиелокалпзации. Гб.
Упражнения 1015 13. (*2) Сравните две реализации Ьеазоп (о (9 Г.3.2 и 9 Г.4.7.1). 14. (*2) Напишите и протестируйте фасет Е1а1е оий который записывает даты типа Ра1е с помощью формата, передаваемого в качестве аргумента конструктора. Обсудите плюсы и минусы такого подхода по сравнению с глобальным форматом, предоставляемым с(а1е ~т1(9 ГА,4.6). 15. ('2 5) Реализуйте ввод~вывод римских чисел (вида Х1 и МОСЕЙ). 16.
(*2.5) Реализуйте и протестируйте СМ 1о иррегЯ Г.4.6). 17. (*2.5) Воспользуйтесь с1осй11 для определения средней «стоимостиа: (1) вызова функции, (2) вызова виртуальной функции, (3) чтения сйаг, (4) чтения (п1 из одной цифры, (5) чтения 1п( из 5 цифр, (6) чтения с(оиЫе из 5 цифр, (7) з1г1пд из одного символа, (8) з1ппй'из 5 символов и (9) з1г(приз 40 символов. 18. ("6.5) Выучите еще один естественный язык. Приложение Безопасность исключений и стандартная библиотека Все произойдет в точности так, как Вы и ожидали, если только Ваши ожидания не ошибочны.
— Хайман Роузен Безопасность исключений — безопасные при исключениях методы реализации — представление ресурсов — присваивание — ривй Ьаск()— конструкторы и инварианты — гарантии стандартных контейнеров — вставка и удаление элементов — гарантии и компромиссы — зчоар[1 — инициализация и итераторы — ссылки на элементы — предикаты — в1г1пу, потоки, алгоритмы, оа1аг ау и сотр1ех — стандартная библиотека С вЂ” значение для пользователей библиотеки — советы — упражнения, Д.1. Введение оои/яоесгог<Х Ь о, еопвГХй у1 ( оР1=у; оривЬ Ьасуф; //присваиваниеХможет сгенерировать исключение // распределитель для вес~ос .Х.
может // сгенерировать исключение // операьия Х "меньше челс может // сгенерировать исключение // копирующйй конструктор Хможет // сгенерировать исключение еоЯо.Ьеутп~~, о.епйб; оессогчХ> и = о; //'и" здесь уничтожается:.мы должны гарантировать, // что деструктор Х сможет отработать правильно Функции стандартной библиотеки часто вызывают операции, предоставляемые пользователем в ниде аргументов функции или шаблона. Естественно, некоторые из этих предоставленных пользователем операций время от времени генерируют исключения. Другие функции, например распределители памяти, также могут генерировать исключения.
Рассмотрим пример: 1018 Приложение Д. Безопасность исключений и стандартная библиотека Что произойдет, если при попытке копирования ьт присваивание сгенерирует исклю- чение? Вектор в будет оставлен с недействительным элементом? Что произойдет, если конструктор, который используется в с.ризй Ьасд(1 для копирования д, сгене- рирует зЫсбас( айос? Число элементов изменится? В контейнер добавится недей- ствительный элемент? Что случится, если во время сортировки оператор Х «меньше чем» сгенерирует исключение? Элементы будут отсортированы частично? Может алгоритм сортировки удалить элемент из контейнера и не вернуть его туда? Составление полного списка возможных исключений в обсуясдаемом примере ос- тавлено в качестве упражнения Я Д.8111), Объяснение того, насколько корректно ведет себя подобный код для каждого хорошо определенного типаХ вЂ” даже такого Х, который генерирует исключения, — является одной из целей приложения Д.
Есте- ственно, львиная доля объяснения сводится к приданию смысла понятиям «хорошо (корректно) ведущий себя» («»те1! ЪеЪачес(») и «хорошо (корректно) определенный» («л е11 де(1пед») в контексте исключений, а также к выработке содержательной тер- минологии. Цели данного приложения; 111 указать, как пользователь может проектировать типы, которые удовлетворяют требованиям стандартной библиотеки; (21 сформулировать гарантии, предоставляемые стандартной библиотекой; 13~ сформулировать требования стандартной библиотеки к предоставленному пользователем коду; 14) продемонстрировать эффективные методы построения безопасных при исключениях (ехсерйоп-за1е) и эффективных контейнеров; и [5~ представить несколько общих правил безопасного при исключениях программирования.
Обсуждение безопасности исключений (ехсерйоп за1егу) обязательно сосредотачи- вается на поведении в самом худшем случае. Где исключение создаст больше всего проблем? Как стандартная библиотека защищает себя и своих пользователей от воз- можных затруднений? Как сами пользователи могут помочь предотвратить пробле- мы? И пожалуйста, не позвольте этому приложению отвлечь вас от того центрально- го факта, что генерация исключения есть наилучший способ сообщить об ошибке Я 14.1, э 14.9).
Обсуждение понятий, методов и гарантий стандартной библиотеки организовано следуюьчим образом: 9 Д,2. Содержит обсуждение понятия безопасности исключений, э Д.З. Представляет методы реализации эффективных и безопасных при исключениях контейнеров и операций. 9 ДА. Очерчивает гарантии, предоставляемые для контейнеров стандартной библиотеки и их операций. 8 Д.5. Резюмирует вопросы безопасности исключений для не контейнерных частей стандартной библиотеки, 8 Д.б.
Содержит обзор безопасности исключений с точки зрения пользователя стандартной библиотеки. Как и во всем, стандартная библиотека демонстрирует примеры различных рисков, которые следует иметь в виду при разработке подверженных подобным рискам при- ложений.
Методы, использованные в стандартной библиотеке для обеспечения безо- пасности исключений, применимы к широкому диапазону проблем. Д.2. Безопасность исключений 1019 Д.2. Безопасность исключений Говорят, что операция на обьекте безопасна при исключениях(ехсертюп за(е), если эт операция оставляет объект в действительном состоянии (ча)Ы зсаге), когда завершается генераппей исключения. Это действительное состояние мохсет быть ошибочным состоянием, требующим очистки, но оно должно быть хорошо определено, чтобы имелась возможность написать разумный код обработки ошибок для данного объекта.
Например, обработчик исключений мог бы уничтожить объект, восстановить его, повторить вариант операпии, просто возобновить работу и т. д. Иными словами, у объекта есть инвариант (9 243.7.1), конструкторы устанавливают этот инвариант, все дальнейшие операции соблюдают инвариант (даже и при генерации исключений), а деструктор выполняет заключительную очистку. Перед генерацией исключения операция обязана позаботиться о собл1одении инварианта, чтобы объект остался в действительном состоянии. Однако весьма вероятно, что зто действительное состояние окажется неудовлетворительным для приложения.
Например, оставленная пустой строка или контейнер, брошенный неотсортированным. «Восстановить» — значит дать объекту значение, которое является более подходящим/желательным для приложения незкели то, с которым объект был оставлен после неудачной операции. В контексте стандартной библиотеки наиболее интересные объекты — контейнеры. Мы рассмотрим, при каких условиях операции на контейнерах стандартной библиотеки могут считаться безопасными при исключениях.
Имеются всего две действительно простые концептуально стратегии: (1] «Без гарантии»: если сгеперировалось исключение, обрабатываемый контеинер, возможно, испорчен. (2] «Сильная гарантия»: если сгенерировалось исключение, обрабатываемый контейнер остается в состояниями, в котором он находился перед началом операции стандартной библиотеки. К сожалению, оба ответа слишком просты для реального использования. Альтернатива (1] неприемлема, потому что подразумевает, что после того, как в контейнерной операции сгенсрировалось исключение, к контейнеру нельзя обратиться; его даже нельзя уничтожить без риска вызвать ошибку этапа выполнения.
Альтернатива [2] неприемлема, потому что она навязывает стоимость семантики отката кюкдой операции стандартной библиотеки. Чтобы разрешить эту дилемму, стандартная библиотека С+ » обеспечивает набор таких гарантий безопасности при исключениях, которые распределяют бремя создания правильных программ между разработчиками стандартной библиотеки и ее пользователями; (За] . Основная гараяглия (Ьаз1с пцагапсее) для всех операций»: соблюдаются основные инварианты стандартной библиотеки, нет утечек рссурсов, например памяти.