|
Материалы книги получены с http://www.itlibitum.ru/
Три великие идеи С++
О нетривиальном использовании C++ написано так много, что я даже не знаю, с чего начать. Вам когда-нибудь приходилось видеть стереограммы? С первого взгляда они похожи на случайный узор, но после медленного и внимательного разглядывания на них проявляется слон, спираль или что-нибудь еще. Чтобы увидеть смысл в точках и пятнах, нужно рассматривать их в контексте объединяющей темы. Именно здесь кроется одно из самых больших разочарований при изучении архитектуры и идиом C++. Сначала кажется, что перед вами - огромная куча разрозненных приемов и ни одного правила того, как ими пользоваться. Эта книга научит вас «видеть слона». Существует множество классификаций нетривиальных аспектов C++, но я разделил их на несколько простых тем:
• Косвенные обращения.
• Гомоморфные иерархии классов.
• Пространства памяти.
В основе каждой темы лежит конкретный синтаксис и средства C++, и их совместное применение позволяет решать самые разные задачи. Существует много других приемов и принципов, которые тоже стоило бы включить в эту книгу, но эти три категории помогают организовать очень большое количество тем в логически стройную структуру.
В первой части приведен обзор многих важных аттракционов синтаксического цирка C++. Например, многие программисты C++ не имеют большого опыта работы с перегруженными операторами и лишь теоретически знают, как они применяются. Оказывается, большинство программистов никогда не использует шаблоны или обработку исключений и лишь немногие умеют пользоваться потоками ввода/вывода за рамками простейших обращений к объектам cout и cin. В части 1 стараюсь выровнять уровни подготовки читателей, заполнить пробелы в ваших знаниях C++ и подготовиться к
игре. Часть 1 можно читать от корки до, бегло просматривать или пропускать целые разделы в зависимости от того, насколько хорошо вы знакомы с нюансами C++.
Термин косвенное обращение (indirection) относится к разным конкретным темам, однако везде используется одна и та же концепция: клиентский объект обращается с запросом к другому объекту, который, в свою очередь, поручает работу третьему объекту. Косвенность связана со средним объектом в цепочке. Иногда годится слышать, что это определение почти совпадает с определением делегирования (delegation), одного из краеугольных камней объектно-ориентированного программирования. Тем не менее, в C++ идиомы, используемые с этой концепцией, и ее языковая поддержка выходят далеко за рамки того, что считается делегированием в других языках. В этой книге часто используется термин указатель (pointer); вы встретите его в каждой главе. Указатели C++
способны на многое. Они могут определить, где в памяти, на диске или в сети находится объект, на который они ссылаются; когда он уничтожается; изменяется ли он или доступен только для чтения; и даже то, существует ли объект или просто представляет собой некую область в абстрактном пространстве памяти - и все это происходит без активного участия самого объекта, который может ничего не знать об этих низкоуровневых операциях. Возможности, что и говорить, впечатляющие, однако они основаны на нескольких очень простых идиомах.
О проектировании иерархии классов говорили все кому не лень - одни по делу, другие болтали об «имитации объектов реального мира». Большинство аргументов в равной степени относится к любому объектно-ориентированному языку, и я вовсе не намерен захламлять книгу по C++ своими личными взглядами на объектно-ориентированный дизайн. Тем не менее, один конкретный тип наследования -гомоморфное наследование (homomorphic derivation) - оказывается исключительно полезным в сочетании со специфическими средствами C++. В гомоморфной иерархии все производные классы
получают свой открытый интерфейс от некоторого базового класса-предка. Как правило, «мать всех базовых классов» девственно чиста - она не содержит ни одной переменной, а все ее функции являются чисто виртуальными. В C++ с этой концепцией ассоциируются многие полезные идиомы проектирования и программирования.
За концепцией пространства памяти (memory space) кроется нечто большее, чем обычное управление памятью. Перегружая в C++ операторы new и delete, вы определяете, где создаются объекты и как они уничтожаются. Кроме того, можно создавать абстрактные коллекции, в которых не всегда понятно, с чем вы имеете дело - с настоящим объектом или с абстракцией. На горизонте уже видны контуры новых распределенных объектно-ориентированных структур, разработанных такими фирмами, как Microsoft, Apple и Taligent. Правда, вам придется пересмотреть некоторые базовые представления о
том, где находятся объекты и как они перемещаются в другое место - все эти темы я выделил в категорию пространств памяти. Пространства памяти позволяют определить тип объекта во время выполнения программы - возможность, которой до обидного не хватает в C++. Конечно, мы поговорим и об управлении памятью, но этим дело не ограничится.
Назад Содержание Далее
|