вторник, 11 июля 2017 г.

Переосмысление STL через паттерны проектирования

Об изучении паттернов и немного о шаблонах

Юрий «yurembo» Язев

Каким образом мы изучаем STL? Обыкновенно это бывает следующим образом: изучив C++, сразу переходим к изучению STL. Хорошо, если при изучении первого, должным образом отнеслись к шаблонам, обычно этого нет. Их синтаксис пугает, их применение не понятно, решаемые с помощью них задачи покрыты мглой.

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

Далее изучение стандартной библиотеки можно отложить. Конечно, потоковый ввод, вывод, строки уместно изучить вместе с языком, а STL отложить до того времени, когда будут усвоены паттерны проектирования. Они не представляют готовых к применению компонентов, они являются лишь рекомендациями – рецептами. Их знание позволяет применять удачные решения известных или близких к ним проблем. С помощь них удается использовать опыт других разработчиков, но решать самому.

Компоненты STL построены на основе шаблонов с примесью паттернов. Чисто на паттернах ничего построить не удастся, так как последние представляют собой абстракции. Их с некоторыми изменениями можно применить к любому языку программирования. STL включает контейнерные классы, итераторы, адаптеры, функциональные объект и прочее. Устройство этих механизмов легче понять, зная соответствующие паттерны.

Учебники по C++ часто кроме самого языка охватывают стандартную библиотеку и содержащую ею STL. Было бы хорошо, если бы там был раздел, посвященный паттернам. Но в таком случае и так не тонкая книга по основам C++ приобрела бы совсем угрожающий вид. Взгляните на «Язык программирования C++. Специальное издание» Бьерна Стауструпа – внушительная книжка. Но в ней нет ни слова о паттернах. Нельзя объять необъятное. C++ как раз относится к этой теме.

Я могу выделить 3 книги по паттернам проектирования. Библией о паттернах заслуженно считается книга 1995-го года выпуска «Приемы объектно-ориентированного проектирования. Паттерны проектирования», написанная широко известной «бандой четырех», куда входят: Гамма, Хелм, Джонсон, Влиссидес. В ней рассмотрены 23 самых распространенных паттерна, предназначенных для «общего пользования». Материал хорошо структурирован: есть описание каждого паттерна, область его применения, пример использования вместе с исходным кодом на C++ или Smalltalk (ныне незаслуженно забытый язык; yurembo лет 5 назад пытался его изучить, но его применению на нашлось места). Тем не менее, для тех персонажей, кто впервые сталкивается с паттернами, книжка тяжело читается.

Много лет спустя вышла книжка «Паттерны проектирования» Эрика и Элизабет Фриман. У издательства O’Reilly, которое издала эту книгу, есть особая категория «Head First». В книгах, попадающих под эту категорию, материал подается особым образом. Если в процессе чтения обычной книги по программированию читатель ведет беседу с автором, то в «Head First» кроме автора на страницах книги можно встретить других персонажей, которые ведут диалоги между собой наподобие комиксов. Плюс уместные, логически верные иллюстрации помогают лучше усвоить предлагаемый материал.

Материал книги построен относительно языка Java, то есть все примеры приведены на этом языке. Однако для их понимания будет достаточным лишь поверхностного знания языка. Поскольку в первую очередь я ориентирую этот пост на C++-программистов. В книге подробно с примерами и доскональным объяснением описаны 14 паттернов проектирования. Сначала я рекомендую прочесть эту книгу, а потом, когда будет общее понимание паттернов, как их использовать и с чем их едят, для более глубокого усвоения материала перейти к библии «банды четырех».

Примерно в том же году, что предыдущая книжка, в другом издательстве вышла книга «Принципы, паттерны и методики разработки на языке C#» Роберта и Мика Мартин(ов). Рекомендую ее товарищам, которые программируют на C#. Сам ее еще не читал, не было необходимости, но говорят: «хорошая книга».

Все перечисленные издания были переведены на великий и могучий русский язык. Поэтому читать дважды приятнее.

Между тем к этим трем книгам, посвященным использованию паттернов проектирования на разных языках программирования, я могу прибавить еще одну книженцию. Много-много лет назад по своей неопытности (только-только начал изучать C++) я купил книгу «Современное проектирование на C++» Андрея Александреску, предназначенную явно не для начинающих программистов. Эта книга взорвала мне мозг и на многие годы вперед заставила меня искать ответы на появившиеся вопросы, за что я ей и автору благодарен. Книг посвящена обобщенному программированию на C++ с использованием шаблонов, так же в ней описана разработка компонентов библиотеки, созданной автором, на основе паттернов проектирования.

В упомянутых выше книгах обсуждаются паттерны «общего пользования». Они будут одинаково полезны во всех областях разработки программного обеспечения. Вместе с тем существует такие паттерны, которые являются полезными в узком направлении разработки специфического ПО. Например, в программировании многопоточных приложений есть свои паттерны, которые будут бесполезны в других видах ПО. Есть отдельная область применения паттернов – GameDev. Использование общих паттернов там имеет свою специфику. Кроме того, в игрострое есть свои особенные паттерны, которые не будут иметь большого смысла в других областях. Таких областей применения паттернов проектирования ровно столько, сколько видов ПО существует: мобильное, системное, веб и многое другое. Везде есть свои наблюдения, общеизвестные решения распространенных задач, поэтому везде есть паттерны.

И под конец. Изучение STL не представляет проблемы, имеется огромное количество учебников по теме. Все эти книги довольно старые, но при этом они нисколько не утратили своей значимости, вот некоторые из них: «C++ и STL. Справочное руководство» Дэвида Мюссера, Жилмера Дерджа, Атула Сейни. Прекрасное, довольно краткое, но при этом подробное описание STL с примерами использования. Мюссер, к слову, участвовал в разработке черновых версий библиотеки.
«Обобщенное программирование и STL: использование и наращивание стандартной библиотеки шаблонов STL» - более подробное руководство по теме.
«C++. Стандартная библиотека» кроме STL включает описание стандартной библиотеки. Книга еще старее, приведенных выше, но при этом в ней есть описание «скользких» мест C++, которые не освещены в других более современных изданиях.
И моя любимая книга по теме: «Эффективное использование STL» Скотта Мейерса. Крутой чувак. В этой книге он дает 50 классных советов по использованию STL. Каждый из них подкреплен интересным примером.

Комментариев нет:

Отправить комментарий