Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий.
Козьма Прутков, Плоды раздумья, мысль.
Мое первое знакомство с объектно-ориентированным программированием на С++ состоялось в 1991 году, когда я прочитал первую книгу Б. Страуструпа «Язык программирования С++», выпущенную в русском переводе издательством «Радио и связь». Хотя к тому времени я был уже опытным программистом с 15-летним стажем разработки разнообразнейших программ, я почти ничего не понял. И это при том, что с языком С я уже был знаком! И дело совсем не в отсутствии упорства или недостатке сообразительности — на западе эту книгу называли «руководством для экспертов».
Много времени спустя, когда я прочитал большое количество других книг по языку С++ и сам стал преподавать его в университете, я пришел к твердому убеждению, что начинать изучать объектно-ориентированное программирование по книгам Б. Страуструпа — все равно что посадить начинающего водителя за руль болида «Формулы-1». Книги мэтра предназначены для крепких профессионалов, уже немало «понюхавших» объектно-ориентированного «пороху».
Сегодняшние реалии требуют начинать изучение «объектно-ориентированности» как можно раньше. Однако опыт преподавания С++ начинающим программистам показал, что С++ не должен быть первым изучаемым языком программирования. Более того, прежде чем изучать объектно-ориентированную часть С++, начинающему требуется овладеть первичными навыками программирования на этом языке — у него не должно вызывать проблем написание функций на С++. Поэтому в тексте книги вы не найдете описания элементарных конструкций С++ — в первой же главе вводится концепция класса.
Совершенно очевидно, что начинающие программисты сначала должны усвоить простую техническую информацию: как определить класс, что такое поле и как определить метод, как создать простой тип данных. По мере усвоения простого
материала можно переходить к более сложным вопросам: перегрузка операций, наследование, виртуальные функции, шаблоны и т. д. На базе усвоенной технической информации можно детально изучать обобщенное и порождающее программирование, использование стандартной библиотеки шаблонов, паттерны проектирования, взаимодействие стандартного языка С++ с API-функциями операционной системы.
Однако сначала я попытался ответить на вопрос: а зачем вообще потребовалось «городить» объектно-ориентированный «огород»? Какими преимуществами обладает он по сравнению с обычным (процедурным) программированием? Аналогичные вопросы часто задают и начинающие программисты. Более того, обычно такие же вопросы возникают по поводу каждого нового понятия или конструкции. Формальное определение в таких случаях практически бесполезно — начинающий может прекрасно его знать, но не понимать. Поэтому изложение построено на таких примерах, которые естественным образом показывают необходимость той или иной объектно-ориентированной конструкции, того или иного основополагающего принципа. Например, вы не найдете в книге формального определения инкапсуляции, однако на нее обращается внимание практически в каждом примере.
Многие понятия, термины и конструкции упоминаются в тексте книги задолго до их подробного описания. Например, операции newndelete используются уже в главе 1, хотя подробности управления динамической памятью описаны только в главе 5. В главе 5 впервые рассказывается о спецификации исключений, при этом детали механизма исключений раскрываются в главе 7. Наследование рассматривается в главе 8, однако уже в главе 7 приводится иерархия классов исключений. Во-первых, чрезвычайно трудно, если вообще возможно, описать С++ без таких «ссылок вперед» — даже в стандарте [1] ссылки вперед встречаются на каждом шагу. Во-вторых, опыт обучения студентов показал, что такое «предварительное» упоминание или использование конструкций в простых ситуациях в дальнейшем существенно облегчает усвоение сложных технических деталей.
Стандартная библиотека шаблонов (STL) является неотъемлемой частью С++, поэтому каждый программист обязан знать ее и уметь использовать. Однако я убежден, что квалифицированный программист должен хорошо понимать принципы, положенные в основу STL, и прекрасно разбираться в ее «внутренностях» — настолько хорошо, чтобы самостоятельно реализовать динамические контейнеры и итераторы, функторы и обобщенные алгоритмы. Поэтому реализации различного вида динамических контейнеров довольно часто используются в качестве примеров (см. главы 5 и 6). Итераторы упоминаются уже в главе 4 и вводятся в главе 6 как объекты, обеспечивающие последовательный доступ к элементам контейнера. Обобщенные алгоритмы и функторы рассматриваются в главе 12. Практически каждое реализованное решение сравнивается с решениями, принятыми при разработке STL, Это в дальнейшем существенно облегчает изучение самой библиотеки.
И наконец, в настоящее время квалифицированный программист просто обязан ориентироваться в стандарте С++ [1]. Это — не самая простая задача даже для опытного программиста. Поэтому при написании книги я не только постоянно сверялся со стандартом (использовалась вторая редакция от 15 октября 2003 года), но и приводил ссылки на соответствующие разделы и пункты стандарта. Например, функции форматного ввода описаны в стандарте в пункте 27.6.1.2 — ссылка в книге дается как (см. п. п. 27.6.1.2 в [1]). Если некоторая тема описана в нескольких разных местах стандарта (например, исключения), то ссылки на пункты перечисляются через запятую, например (см. п. п. 18.6, 19.1 в [1]). Если в некотором разделе стандарта много нумерованных пунктов, то ссылка может быть уточнена номером пункта, например (см. п. п. 14.1/2 в [1]) — в этом пункте описывается использование слова typename вместо слова class при объявлении параметров шаблона.
Опубликовал Kest
August 13 2013 19:50:44 ·
0 Комментариев ·
4191 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.