Анимация
JavaScript
|
Главная Библионтека задачи на С++ Место действия: Будапешт. Жаркий летний вечер. Мы смотрим через Дунай, на восточный берег реки. На обложке книги вы видите фото, на котором изображена эта пастельная европейская картина. Что первое бросается вам в глаза? Почти наверняка - здание парламента в левой части фотофафии. Массивное неоготическое здание приковывает взгляд своим изящным куполом, массой вычурных шпилей, десятками статуй и прочими украшениями, контрастируя с простыми строгими линиями зданий на набережной Дуная. Откуда же такое отличие? Строительство здания парламента было завершено в !902 году, в то время как остальные здания на набережной были построены в разрушенном Будапеште после второй мировой войны. "Ну и что же, - скажете вы, -- какое отношение это имеет к книге?" Стиль........это всегда нечто большее, чем просто внешний вид, и за ним скрывается целая философия и мировоззрение - будь то в архитектуре строительства или в архитектуре профаммного обеспечения. Я думаю, что вам попадались программы, напоминающие своей "пышностью" и размерами здание парламента, равно как уверен, что вам доводилось видеть и профаммы, напоминающие блоч1Ю-панельное строительство. Стиль или суть? Что же важнее? Чему лучше и правильнее отдать предпочтение? Вы уверены, что знаете точный ответ на этот вопрос? Так, понятие "лучше" лишено смысла, пока не определена мера, которой следует мерить. Лучше для чего? Лучше в какой ситуации? Скорее всего, ответ на этот вопрос представляет собой определенный компромисс и начинается со слов "Это зависит от,,." Это книга о поиске баланса между многими мелкими аспектами дизайна и реализации программ на С+ + , Глубокое знание ваших инструментов и исходных материалов весьма способствует пониманию того, когда их стоит использовать. Так лучше ли здание парламента и его стиль, чем у зданий, находящихся рядом с ним? Очень легко, не думая, ответить "да". Но ответ должен основываться не только на эмоциях, но и на логике. Представьте, насколько не просто построить такое здание и поддерживать его в должном состоянии, • Строительство. В 1902 году, когда закончилось его строительство, это здание было самым большим в мире зданием парламента. Эта грандиозность, конечно же. сказалась на его стоимости, продолжительности строительства и количестве затраченных усилий. Так был создан "белый слон", т.е, нечто интересное само по себе, но со стоимостью, которую не оправдывает никакой интерес. Как вы думаете, сколько обычного жилья, которое пусть и не потрясает воображение, но дает кров над головой, можно было бы построить при тех же капиталовложениях? Наверное, ответ на этот вопрос мог бы впечатлить многих. Позвольте напомнить вам, что все мы работаем в той отрасли промышленности, где давление сроков разработки ощущается особо сильно -- и в принципе несравнимо с таковым во времена постройки рассматриваемого здания. • Поддержка. Присмотритесь к фотографии, и вы увидите, что часть здания покрыта лесами. Реставрационные работы идут здесь годами, и на это затрачиваются такие суммы, что, пожалуй, было бы проще снести это здание и построить что-то новое. На фотографии не видно (да и не может быть видно) кое-что еще. Например, скульптуры, украшающие здание, были сделаны из плохо подобранного материала, который слишком легко разрушается, так что их реставрация и замена были начаты едва ли не сразу же после завершения строительства, и все эти украшения, "рюшечки и финтифлюшечки" --- предмет постоянной заботы реставраторов уже более века. Так и в программировании - очень важно найти золотую середину между стоимостью и функциональностью, между элегантностью и сопровождаемостью, между возможностями развития и украшательством. С подобными проблемами и поиском компромиссов мы вынуждены сталкиваться ежедневно при разработке программного обеспечения на С++. Среди вопросов, которые рассматриваются в данной книге, есть и такие: делает ли безопасность кода по отношению к исключениям лучше сам код? Если да - то что именно означает "делает его лучше", и не может ли возникнуть ситуация, когда это не так уж и хорошо? А как насчет инкапсуляции? Делает ли она программу лучше? Почему? При каких условиях это не так? Если вас заинтересовали эти вопросы - книга перед вами, прочтите ее. Кстати, встраиваемые функции - это хорошая оптимизация? Следует ли к ней прибегать? (Будьте очень-очень осторожны при ответе на этот вопрос.) Что общего между возможностью экспорта в С++ и зданием парламента? А между std: :string и монолитной архитектурой зданий на набережной Дуная? После рассмотрения множества различных технологий и возможностей С+ + , в конце книги целый раздел отведен для анализа реальных примеров опубликованных исходных текстов. Мы выясним, что авторам этих фраг.ментов удалось, что не совсем, и как исправить баланс между затрачиваемыми усилиями и хорошим стилем. Я надеюсь, что эта книга, а также прсдьщущие книги по данной теме помогут вам шире взглянуть на С+ + , прибавят вам знаний о деталях и тонкостях языка, расскажут о его внутренних взаимосвязях и помогут вам в поиске золотой середины при разработке собственных программ. Взгляните еще раз на фотографию на обложке книги, в правый верхний угол. Видите там воздушный шар? Вот так и мы должны подняться над городом и увидеть его весь, во всей перспективе - красоту и изящество одних строений, простоту и надежность других, понять, что стиль и суть взаимосвязаны, и они ие просто сосуществуют, но и взаимодействуют и дополняют друг друга. Поднявшись над городом, мы видим не отдельные дома, но весь город в его красоте и неповторимости, и выработать именно этот взгляд на С++ - во всей его красоте и цслостьюсти - должна помочь нам данная книга. Метод Сократа Греческий философ Сократ обучал своих учеников, задавая им вопросы, которые были разработаны таким образом, чтобы направлять мышление учеников и помогать Вышщшж в издательстве "Вильяме" объединенными в одну книгу: Cammep Г. Решение сложных задач на С++. Серия С++ 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 Название задачи и уровень ее сложности подсказывают вам, для кого она предназначена. Обычно в задаче есть вопрос для новичка, что позволяет размяться прежде [ 0 ] 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 |