Сообщений 3 Оценка 49 [+1/-0] Оценить |
Эта книга написана для программистов, уже владеющих языком C++ и желающих поднять свою квалификацию на новый уровень. Давая представление о стиле и идиоматике языка, книга знакомит читателя с теми нетривиальными знаниями, которые опытные программисты C++ получают на личном опыте. Она показывает, что C++ можно использовать и для разработки простых абстракций данных, и для полноценной реализации абстрактных типов данных, и для объектно-ориентированного программирования различных стилей. Кроме того, в ней исследуются идиомы, не поддерживаемые напрямую на базовом уровне C++, например, функциональное и фреймовое программирование, а также расширенные методы "сборки мусора".
Эту книгу надо было перевести еще до того, как она появилась в английском варианте! - это, конечно, шутка, но правды в ней значительно больше, чем шутки. Джефф Элджер сравнил изучение С++ с подъемом на лифте, а мне приходит сравнение с мостом. Программист, изучивший конструкции С++ и принципы объектно-ориентированного программирования, но никогда не создававший реальных программ, стоит на одном берегу реки. Это - берег начального знания. Другой берег - это берег истинного знания, глубокого знания и С++, и программирования вообще. Программист обычно, на свой страх и риск, пускается в плавание по реке, надеясь быстро достичь противоположного берега.
Однако на реке есть мост. Этот мост "построили" Эрих Гамма и Джон Влиссидес, Скотт Мейерс и Джеф Элджер, Николай Джосаттис и Дэвид Вандевурд, Андрей Александреску и Герб Саттер, Стенли Липпман и Эндрю Кениг и, конечно, сам Бъярн Страуструп. Но этот мост не был достроен, в нем не хватало самого первого пролета от берега начального знания. Эта книга - как раз тот самый недостающий начальный пролет "моста".
Это, конечно, излишне эмоциональное отступление, но именно такую реакцию вызвало у меня прочтение этой книги.
Начнем с того, что русское называние не соответствует действительности - в английском варианте название гораздо более точно отражает содержание: "Advanced C++. Programming Styles and Idioms". Джеймс Коплиен (James Coplien) написал ее еще в 1992 году (значительно раньше, чем появилась знаменитая книга "Банды четырех"), и эта именно та книга, которой так не хватало российским программистам и мне в частности.
Во второй главе при постоянном сравнении со структурами С описываются базовые понятия класса и его составляющих. В частности, описываются статические поля и статические методы, константность, в том числе логическая и физическая. На очень простом примере разъясняется понятие указателя на элемент (поле или метод) класса. Даны элементарные правила организации программного кода со "стражами" включения.
Третья глава - очень важная по информационной наполненности. Во-первых, автор вводит "каноническую" форму класса и описывает перегрузку операций, объясняя, между прочим, что такое l-value. Во-вторых, в ней начинаются более серьезные вещи - подсчет ссылок на классическом примере строк. Причем он описывает три решения, а заодно объясняет идиому "манипулятор/тело", которая у Герба Саттера называется "Pimpl", и которая является основой паттерна Bridge (Мост). Здесь же есть пример, как ввести подсчет ссылок для классов, которые изначально не были для этого спроектированы. Когда я прочитал эту главу, у меня возникло стойкое убеждение, что остальные авторы списывали у Коплиена - настолько просто и понятно он написал. Не знаю, может быть, сам он списывал у Страуструпа, но читать Коплиена на множество порядков легче.
Четвертая глава целиком посвящена вопросам, связанным с простым наследованием, но без виртуальных функций - это в пятой главе. На 25 страницах более информативно сказать о наследовании, разъяснив, между прочим, и открытое, и закрытое, и принцип подстановки, наверное невозможно. В конце главы разработан пример иерархии классов с селектором типа. Коплиен, в отличии от Страуструпа, который аналогичный пример приводит как пример отрицательный, собирается использовать его для объяснения механизма виртуальных функций и в нетривиальных идиомах.
В пятой главе объясняется механизм виртуальных функций. Глава большая и, пожалуй, центральная во всей книге - она как раз "по центру" и стоит. Здесь виртуальность объясняется со всех сторон: от простых виртуальных функций, к виртуальным деструкторам, чисто виртуальным функциям и абстрактным классам. Но этим содержание главы не исчерпывается- далее Коплиен немного меняет "угол зрения" на идиому "манипулятор/тело", и объясняет идиому "конверт/письмо", а также рассматривает делегирование, виртуальные конструкторы (причем два разных подхода), итераторы и курсоры. В этой же главе определяются функторы (в 92 году!) и описывается парадигма аппликативного и функционального программирования на С++! А есть еще множественное наследование и виртуальные базовые классы.
И опять хочется сказать несколько "теплых" слов нашим издательствам: где ж вы были раньше, почему я держу эту книгу в руках только сейчас, а не 10 лет назад, когда она действительно была нужна мне позарез! Формулировки настолько простые и точные, что виртуальные функции, которые обычно у новичка вызывают массу вопросов, кажутся "проще пареной репы". Например: "Стиль программирования, в котором этот механизм (виртуальных функций) логически последовательно применяется к конкретным типам данных, называется объектно-ориентированным программированием; эта методика является наиболее прямолинейным способом поддержки объектно-ориентированного проектирования в С++". И ни в одной книге вы не найдете такого точного и абсолютно ясного определения делегирования: "динамическая имитация наследования на стадии выполнения:". Я, конечно, и раньше встречал разные описания делегирования, но только Коплиен сказал: "Делегирование" открывает перед экземплярами объектов те же возможности, что и наследование перед классами - то есть возможности совместного использования кода и автоматического применения кода одной абстракции для обработки запросов, обращенных к другой абстракции".
Далее в книге разбираются более общие вопросы, связанные с проектированием и повторным использованием кода, которые, однако сопровождаются многочисленными примерами на С++ и иллюстрациями на UML (в той старой версии Гради Буча). Глава о прототипах - это блестящее объяснение паттерна "Фабрика объектов" в различных вариантах.
Глава 9 хоть и называется "Эмуляция символических языков на С++", однако по словам самого Коплиена "приемы, описанные в этой главе, не должны рассматриваться как замена для SmallTalk или объектно-ориентированных сред программирования на базе Lisp. Представленные идиомы помогут вместе с С++ пройти несколько шагов в указанном направлении:". В этой главе, например, приводится пример обобщенного класса коллекции (Элджер, наверное, списывал это и некоторые другие вещи, у Коплиена ;). Здесь же есть и основы сборки мусора, и мультиметоды.
Главу 10 и 11 мне еще самому нужно освоить, но думаю, для многих программистов в них содержится немало интересной и полезной информации.
Что еще понравилось. В каждой главе есть небольшой набор упражнений, в которых можно встретить отнюдь не тривиальные вопросы, например: может ли конструктор определить, вызван ли он в результате выполнения оператора new или же для объекта, для которого уже была выделена память? Почему?
В книге много полезных приложений, в том числе и к отдельным главам. Кстати, приложение Ж можно взять за основу словаря терминов для RSDN.
В общем, книга совершенно не производит впечатление устаревшей, однозначно "must have" практически для всех программистов.
Сообщений 3 Оценка 49 [+1/-0] Оценить |