Динамо-машины  Метод Сократа 

1 2 3 4 [ 5 ] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

но дает кров над головой, можно было бы построить при тех же капиталовложениях? Наверное, ответ на этот вопрос мог бы впечатлить многих. Позвольте напомнить вам, что все мы работаем в той отрасли промышленности, где давление сроков разработки ощущается особо сильно - и в принципе несравнимо с таковым во времена постройки рассматриваемого здания.

Поддержка. Присмотритесь к фотографии, и вы увидите, что часть здания покрыта лесами. Реставрационные работы идут здесь годами, и на это затрачиваются такие суммы, что, пожалуй, было бы проще снести это здание и построить что-то новое. На фотографии не видно (да и не может быть видно) кое-что еще. Например, скульптуры, украшающие здание, были сделаны из плохо подобранного материала, который слишком легко разрушается, так что их реставрация и замена были начаты едва ли не сразу же после завершения строительства, и все эти украшения, рюшечки и финтифлюшечки --- предмет постоянной заботы реставраторов уже более века.

Так и в программировании -- очень важно найти золотую середину между стоимостью и функциональностью, между элегантностью и сопровождаемостью, между возможностями развития и украшательством.

С подобными проблемами и поиском компромиссов мы вынуждены сталкиваться ежедневно при разработке программного обеспечения на С++. Среди вопросов, которые рассматриваются в данной книге, есть и такие: делает ли безопасность кода по отношению к исключениям лучше сам код? Если да - то что именно означает делает его лучше , и не может ли возникнуть ситуация, когда это не так уж и хорошо? А как насчет инкапсуляции? Делает ли она программу лучше? Почему? При каких условиях это НС так? Если вас заинтересовати эти вопросы - книга перед вами, прочтите ее. Кстати, встраиваемые функции - это хорошая оптимизация? Следует ли к ней прибегать? (Будьте очень-очень осторожны при ответе на этот вопрос.) Что общего между возможностью экспорта в С++ и зданием парламента? А между std: :string и монолитной архитект7рой зданий на набережной Дуная?

После рассмотрения множества различных технологий и возможностей С+ + , в конце книги целый раздел отведен для анализа реальных примеров опубликованных исходных текстов. Мы выясним, что авторам этих фраг.ментов удалось, что не совсем, и как исправить баланс между затрачиваемыми усилиями и хорошим стилем.

Я надеюсь, что эта книга, а также предьщущие книги по данной теме помогут вам шире взглянуть на С+ + , прибавят вам знаний о деталях и тонкостях языка, расскажут о его внутренних взаимосвязях и помогут вам в поиске золотой середины при разработке собственных программ.

Взгляните еще раз на фотографию на обложке книги, в правый верхний угол. Видите там воздушный шар? Вот так и мы должны подняться над городом и увидеть его весь, во всей перспективе - красоту и изящество одних строений, простоту и надежность других, понять, что стиль и суть взаимосвязаны, и они не просто сосуществуют, но и взаимодействуют и дополняют друг друга. Поднявшись над городом, мы видим не отдельные дома, но весь город в его красоте и неповторимости, и выработать именно этот взгляд на С++ - во всей его красоте и целостности -- должна помочь нам данная книга.

Метод Сократа

Греческий философ Сократ обучал своих учеников, задавая им вопросы, которые были разработаны таким образом, чтобы направлять мышление учеников и помогать

Вышщшж в издательстве Вильяме объединеппыми в одну книгу: Саттер Г. Решение сложных задач на С++. Серия С++ In-Depth, т.4. М.: Издательский дом Вильяме , 2004. - Прим. ред.



им сделать верные выводы из того, что они уже знают, а также показать им взаимосвязь изучаемого материала с другими знаниями. Этот метод обучения стал так популярен, что сегодня мы называем его методом Сократа . С точки зрения учащихся подход Сократа включает их в процесс обучения, заставляет думать и помогает применить уже имеющиеся знания к новой информации.

Эта книга вполне следует методу Сократа, как и ее предшественницы [SutterOOj и [Sutter02]. Предполагается, что вам приходится заниматься написанием промышленного программного обеспечения на языке С++: в книге используются вопросы и ответы для обучения эффективному применению стандарта С++ и его стандартной библиотеки, причем особое внимание уделяется разработке надежного программного обеспечения с использованием всех возможностей современного С++. Многие из рассмотренных в книге задач появились в результате работы автора и других программистов над своими программами. Цель книги - помочь читателю сделать верные выводы, как из хорошо известного ему материала, так и из только что изученного, и показать взаимосвязь между различными частями С++.

Данная книга не посвящена какому-то конкретному аспекту С++. Нельзя, однако, сказать, что она охватывает все детали С++ - для этого потребовалось бы слишком много книг, -- но, тем не менее, в ней рассматривается широкая палитра возможностей С++ и стандартной библиотеки и, чт немаловажно, демонстрируется, как кажущиеся на первый взгляд несвязанными между собой веши могут совместно использоваться для получения новых решений старых и хорошо известных задач. Здесь вы найдете материал, посвященный шаблонам и пространствам имен, исключениям и наследованию, проектированию надежных классов и шаблонам проектирования, обобщенному программированию и магии макросов, - и не просто винегрет из этих вопросов, а задачи и решения, выявляющие взаимосвязь всех этих частей современного С++.

Эта книга продолжается с того места, где заканчивается изложение материала в [SutterOO] и [Sutter02], и следует той же традиции: Материал книги подается в виде задач, сгруппированных по темам. Читатели первых книг найдут здесь наполненные новым содержанием уже знакомые им темы - безопасность исключений, обобщенное программирование, методы оптимизации и управления памятью. Основное внимание уделяется вопросам обобщенного программирования и эффективного использования стандартной библиотеки С+ + .

Большинство задач первоначально были опубликованы в Internet и некоторых журналах, в частности, это расширенные версии задач 63-86, которые можно найти на моем узле Guru of the Week [GotW], a также материалы, опубликованные мною в таких журналах, как C/C++ User Journal, Dr. Dobbs Journal, бывшем С++ Report и др. Последние исправления и дополнения к книге можно найти на Web-узле по адресу www.gotw.ca.

Как читать данную книгу

Предполагается, что читатель уже хорошо знаком с основами С++. Если это не так, начните с хорошего введения и обзора по С++. Для этой цели могу порекомендовать вам такие книги, как [StroustrupOO], [Lippman98], а также [Meyers961 и [Meyers97].

Каждая задача в книге имеет заголовок, который выглядит, как показано ниже.

Задача №. Название задачи Сложность: X

Название задачи и уровень се сложности подсказывают вам, для кого она предназначена. Обычно в задаче есть вопрос для новичка, что позволяет размяться прежде



чем приступить к главной части - вопросу для профессионала. Замечу, что указанный уровень сложности задач -- это мое субъективное мнение относительно того, насколько сложно будет решить ту или иную задачу большинству читателей, так что вы вполне можете обнаружить, что задача с уровнем сложности 7 решена вами гораздо быстрее, чем задача с уровнем сложности 5. Со времени выхода в свет предыдуших книг я получил немало писем, в которых читатели утверждали, что задача М сложнее (проще) задачи N. Это только подтверждает мой тезис о субъективности оценок и их зависимости от конкретных знаний и опыта читателя.

Чтение книги от начала до конца - неплохое решение, но вы не обязаны поступать именно так. Вы можете, например, читать только интересующие вас разделы книги. За исключением того, что я называю мини-сериями (связанные между собой задачи с одинаковым названием и подзаголовками Часть 1 , Часть 2 и т.д.), задачи в книге практически независимы друг от друга, и вы можете читать их в любом порядке. Единственная подсказка: мини-серии лучше читать вместе; во всем остальном - выбор .за вами.

Все примеры кода - всего лишь отрывки программ, если не оговорено иное, и не следует ожидать, что эти отрывки будут корректно компилироваться при отсутствии остальных частей программы. Для этого вам придется самостоятельно дописывать недостающие части.

И последнее замечание - об URL: нет ничего более изменчивого, чем Web, и более мучительного, чем давать ссылки на Web в печатной книге: зачастую эти ссылки устаревают еще до того, как книга попадает в типографию. Так что ко всем приведенным в книге ссылкам следует относиться критически, и в случае их некорректности - пишите мне. Дело в том, что все ссылки даны через мой Web-узел www.gotw.ca, и в случае некорректности какой-либо ссылки я просто обновлю перенаправление к новому местоположению страницы (если найду ее) или укажу, что таковой больше нет (если не смогу се найти).

Благодарности

в первую очередь я хочу поблагодарить мою жену Тину (Tina) за ее терпение, любовь и поддержку, а также всю мою семью за то, что они всегда со мной, как при написании книг, так и в любое другое время. Без их безграничного терпения и участия книга бы не получилась такой, какой вы се видите.

Я выражаю особую признательность редактору серии Бьерну Страуструпу (Bjarne Stroustrup), а также редакторам Питеру Гордону (Peter Gordon) и Дебби Лафферти (Debbie Lafferty), Тирреллу Альбах (Tyrrell AJbaugh), Бернарду Гафни (Bernard Gaffney), Курту Джонсону (Curt Johnson), Чанда Лири-Куту (Chanda Leary-Coutu), Чарльзу Лед-ди (Charles Leddy), Мелиндс Мак-Кейн (Malinda McCain), Чати Прасерсиху (Chuti Prasertsith) и всем остальным членам команды Addison-Wesley за их помощь и настойчивость в работе над данным проектом. Трудно представить себе лучшую команду для работы над данной книгой; их энтузиазм и помощь помогли сделать эту книгу тем, чем она, я надеюсь, является.

Еще одна группа людей, заслуживающих особой благодарности, - это множество экспертов, чья критика и комментарии помогли сделать материал книги более полным, более удобочитаемым и более полезным. Особую благодарность я хотел бы выразить Бьерну Страуструпу (Bjarne Stroustrup), Дэйву Абрамсу (Dave Abrahams), Стиву Адамчику (Steve Adamczyk), Андрею Александреску (Andrei Alexandrescu), Чаку Алли-сону (Chuck Allison), Мэтту О стер ну (Matt Austern), Йоргу Барфурту (Joerg Barfurth), Питу Беккеру (Pete Becker), Брендону Брею (Brandon Bray), Стиву Дьгохарсту (Steve Dewhurst), Джонатану Кейвзу (Jonathan Caves), Питеру Димову (Peter Dimov), Хавьеру Эстрада (Javier Estrada), Аттиле Фехеру (Attila Feher), Марко Далла Гасперина (Marco Dalla Gasperina), Дугу Грсгору (Doug Gregor), Марку Холлу (Mark Hail), Кэвлину Хен-



1 2 3 4 [ 5 ] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90