Привет, Хабр! Когда я изучал паттерны проектирования, я делал это с помощью прочтения двух книг: простую и понятную книгу от Head First одновременно со сложной и менее понятной книгой от Банды Четырех. Ниже описан мой опыт того, как именно я это делал, плюс выводы, впечатления и советы


Дисклеймер: я не утверждаю, что паттерны проектирования безусловно необходимы, и что если человек не прочитал паттерны Банды Четырех, то он не может называться разработчиком. Я лишь делюсь своим опытом, как изучал паттерны именно я. И надеюсь, что кому-то этот опыт окажется полезным

Итак, для изучения паттернов читал я одновременно следующие книги:

  1. Издание Head First - Паттерны проектирования

  2. Банда Четырех - Приёмы объектно-ориентированного проектирования. Паттерны проектирования

Первая книга читается легко и просто, там всё понятно; вторая книга читается сложнее, она более техническая, но там и больше полезной информации.

В чем смысл чтения двух книг одновременно: можно идти последовательно по темам (≈ паттернам), сначала читать главу из простой книги, а потом главу на ту же тему из сложной. У такого подхода есть следующие плюсы:

  • Более сложная информация из сложной книги усваивается качественнее за счет того, что ты уже подготовлен к потреблению этой информации

  • Информация из обеих книг в целом усваивается лучше за счет повторения материала и взгляда на одну и ту же проблему с разных сторон

Соответствие глав/тем

Авторы книги от Head First не скрывают, что брали за основу книгу Банды Четырех. В частности, в книге от Head First обсуждаются ровно те же самые паттерны, что и в книге от Банды Четырех - какие-то больше, какие-то меньше. Таким образом, составить соответствие по темам между двумя книгами не очень сложно.

Ниже я привел некоторый план прочтения обеих книг (объяснение, как читать этот план, находится под самим планом):

# Введения и предисловия

[ ]     Введение
    [ ] Предисловие
    [ ] Введение в паттерны

# Паттерны, хорошо описанные в обеих книгах

    [ ] Предисловие к паттернам поведения
[ ] [ ] Strategy (Стратегия)
[ ] [ ] Observer (Наблюдатель)
    [ ] Предисловие к структурным паттернам
[ ] [ ] Decorator (Декоратор)
    [ ] Предисловие к порождающим паттернам
[ ]     Фабрика (фабричный метод и абстрактная фабрика)
    [ ] Factory Method (Фабричный метод)
    [ ] Abstract Factory (Абстрактная фабрика)
[ ] [ ] Singleton (Одиночка)
[ ] [ ] Command (Команда)
[ ]     Адаптер и фасад
    [ ] Adapter (Адаптер)
    [ ] Facade (Фасад)
[ ] [ ] Template Method (Шаблонный метод)
[ ]     Итератор и компоновщик
    [ ] Iterator (Итератор)
    [ ] Composite (Компоновщик)
[ ] [ ] State (Состояние)
[ ] [ ] Proxy (Заместитель)
[ ]     Составные паттерны
[ ]     Паттерны для лучшей жизни

# Паттерны, хорошо описанные только Бандой Четырех

[ ] [ ] Bridge (Мост)
[ ] [ ] Builder (Строитель)
[ ] [ ] Chain of Responsibility (Цепочка обязанностей)
[ ] [ ] Flyweight (Приспособленец)
    [ ] Обсуждение структурных паттернов
[ ] [ ] Interpreter (Интерпретатор)
[ ] [ ] Mediator (Посредник)
[ ] [ ] Memento (Хранитель)
[ ] [ ] Prototype (Прототип)
    [ ] Обсуждение порождающих паттернов
[ ] [ ] Visitor (Посетитель)
    [ ] Обсуждение паттернов поведения

# Заключения от Банды Четырех

    [ ] Проектирование редактора документов
    [ ] Заключение

Здесь названию главы/темы соответствует два столбца - первый столбец означает наличие главы/темы в книге от Head First, а второй - в книге Банды Четырех. Например, тема "Visitor (Посетитель)" есть в обеих книгах, а вот "Обсуждение паттернов поведения" - только в книге Банды Четырех. Порядок глав/тем соответствует порядку из Head First.

Все темы можно поделить на следующие группы:

  • Введения и предисловия

  • Паттерны, хорошо описанные в обеих книгах. Это те паттерны, которые прошли проверку временем и были доступно описаны Head First

  • Паттерны, хорошо описанные только Бандой Четырех. Это менее популярные паттерны, но тоже имеющие право быть изученными. Head First уделяет этим паттернам буквально по несколько страниц, в то время как Банда Четырех описывает эти паттерны так же, как и все остальные

  • Заключения от Банды Четырех. Здесь, помимо самого заключения, содержится пример использования паттернов на практике

Впечатления от книг

Head First

Специфическая обложка и кол-во страниц (600+) для такой, казалось бы, не очень серьезной книги могут оттолкнуть от прочтения, но на самом книга читается очень просто, интересно, местами даже забавно, но при этом рассказываются там вполне полезные вещи. На фоне Банды Четырех чтение этой книги воспринимается чуть ли ни как отдых.

Читать эту книгу имеет смысл последовательно, а не в случайном порядке. Именно поэтому порядок глав/тем при одновременном чтении обеих книг соответствует Head First.

Примеры кода написаны на Java.

Банда Четырех

В отличие от Head First, здесь нет определенного порядка. Книга является скорее справочником паттернов, и читать ее от корки до корки необходимости нет. Информация здесь более сухая и техническая, но рассмотрено значительно больше деталей и нюансов, связанных с реализацией и применением как конкретных паттернов, так и их комбинаций.

Примеры кода написаны на C++ и SmallTalk. Последний язык, как мне показалось, имеет довольно специфический синтаксис, но в целом можно понять, что хотят показать авторы.

Итого

Могу предложить 4 пути:

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

  2. Прочитать только книгу от Банды Четырех. Подходит для тех, кто уже неплохо знает паттерны и хочет изучить их глубже

  3. Прочитать только книгу от Head First. Подходит для тех, кто хочет начать изучать паттерны, но не хочет углубляться слишком сильно

  4. Не читать ничего. Ибо кому вообще нужны эти паттерны в реальном мире

На этом всё. Надеюсь, кому-нибудь эта статья будет полезна, и спасибо за внимание!

P.S. Избежать большого кол-ва повторений слова "книга" не удалось, прошу простить.

Комментарии (15)


  1. casnerano
    30.10.2021 21:32
    +4

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

    А вторая книга - подходит в качестве справочника.

    я не утверждаю, что паттерны проектирования безусловно необходимы, и что если человек не прочитал паттерны Банды Четырех, то он не может называться разработчиком

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

    Вам потом проще кому-то сказать "возьми библиотеку http-клиента, и напиши к ней декоратор логов" или "для использования такой библиотеки-логирования в нашем проекте, необходимо написать к нему адаптер".


    1. oleg-m1973
      30.10.2021 22:08
      -1

      Вам потом проще кому-то сказать "возьми библиотеку http-клиента, и напиши к ней декоратор логов" или "для использования такой библиотеки-логирования в нашем проекте, необходимо написать к нему адаптер".

      В обоих случаях выглядит отвратительно.


  1. OlegZH
    30.10.2021 22:14
    +4

    Кто-нибудь проводил исследования того, что было до и что стало после применения паттернов?


    1. cosmolev
      30.10.2021 23:42
      +19

      shit in, shit out


  1. pin2t
    31.10.2021 12:43
    +2

    Мне кажется эти книги вообще надо изъять из продажи и запретить их издание в будущем. Так как они очень быстро и слишком сильно разъедают мозги программистам, Первым делом съедают ту часть которая отвечает за здравый смысл и критическое мышление. Программисты начинают воспринимать эти паттерны как догму, без которой нельзя написать ни строчки кода. Частично, наверное, это ещё и усиливается процессами найма, на каждом собеседовании спрашивают про эти паттерны.

    В результате для решения совершенно простой задачи используются все эти паттерны, и получается ужасный код, полностью напичканый фабриками и строителями. Совершенно не поддерживаемый код. FizzBuzz Enterprise edition в чистом виде.

    Да паттерны нужны но в очень редких случаях, и скорее они про дизайн в целом приложения. И приложение должно быть достаточно большое.

    Но когда простейшее приложение, которое читает CSV-файл с диска и просто загружает его в табличку БД полностью напичкано фабриками, билдерами и вот этим всем - зачем.


    1. vya
      31.10.2021 13:02
      +5

      "А на каждую кнопку повесьте system.sleep(5000), чтобы заказчик видел, что это не наколенная поделка, а высоконагруженный бизнес инструмент решающий сложные задачи"


    1. GoodLuckGuys
      31.10.2021 23:09
      +1

      Мне кажется эти книги вообще надо изъять из продажи и запретить их издание в будущем.

      Зачем такие радикальные методы? Шаблонами пользоваться гораздо легче, нежели новыми велосипедами без сидушки. Просто нужно в головы несведующих вбивать на каждой странице, что это не требования, а обобщения, инструмент, если угодно, но никак не руководство к действию. В том, что везде нужна мера я с Вами полностью согласен, но такие книги нужны. Вопрос в том, что должно пройти время, чтобы понять где это действительно можно и НУЖНО применять.

      на каждом собеседовании спрашивают про эти паттерны.

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


    1. lrsvolk
      31.10.2021 23:09
      +1

      Хочу всё-таки немного поспорить с такой позицией.

      Если на выходе получается "FizzBuzz Enterprise" -- это означает, что у кандидата/разработчика нет понимание того, что и зачем он делает, какую проблему решает и т.д. и т.п

      Само по себе знание паттернов тут не причём, имхо. Мне не кажется правильным обвинять микроскоп в том, что кто-то забивает им гвозди


    1. StupidMouse
      01.11.2021 11:38

      И конечно же нужно процитировать классику:

      «In the OO world you hear a good deal about "patterns". I wonder if these patterns are not sometimes evidence of case (c), the human compiler, at work. When I see patterns in my programs, I consider it a sign of trouble. The shape of a program should reflect only the problem it needs to solve. Any other regularity in the code is a sign, to me at least, that I'm using abstractions that aren't powerful enough-- often that I'm generating by hand the expansions of some macro that I need to write.».


  1. panzerfaust
    31.10.2021 13:50
    +4

    я не утверждаю, что паттерны проектирования безусловно необходимы, и что если человек не прочитал паттерны Банды Четырех, то он не может называться разработчиком

    От вас, кажется, ускользнуло главное. Паттерны не то что "нужны или не нужны". Они просто есть. Есть ряд стандартных задач - есть ряд стандартных решений. Даже если кого-то трясет в негодовании от одного слова "паттерны", то это ничего не меняет. В коде таких людей тоже гарантированно есть повторяющиеся приемы. Просто умные дяди GOF эти приемы обобщили.

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


  1. Arbane
    31.10.2021 17:47
    +1

    Мне одному кажется, что когда человек говорит "Банда Четырех" то, "Банда Четырех" сё, он как будто привстает на маленькую скамеечку.


  1. bagdasar
    31.10.2021 23:09

    Я спустя 10 лет работы начал читать GoF. Правда, она читается очень сложно.

    Но книга хорошая. Наконец разобрался с паттернов Визитор.


  1. oji
    01.11.2021 13:21
    +3

    Вот ещё одна неплохая книга по теме: Александр Швец - Погружение в паттерны проектирования. Подача материала где-то посередине между упомянутыми в посте, без натужного юмора, но и не чересчур сухая. В тексте примеры на псевдокоде, а в сопутствующих репозитариях ещё на десятке популярных языков.


  1. arTk_ev
    01.11.2021 14:47

    Лучше сначала изучить функциональное программирование. Потом SOLID. Тогда эти паттерны станут очевидными.

    Head First - можно прочитать для ознакомления. Вторая уже устарела, как и объектно-ориентированное проектирование.


  1. shogonoro
    02.11.2021 12:28

    Знать паттерны и понимать как они реализуются в реальном мире - это два разных знания.

    Как и в любом мастерстве, можно узнать миллион умных слов и миллион умных идей. Но если ты не одну из них не реализовал на конкретном примере, то все они остаются лишь надуманными представлениями о реальности.

    Решайте задачи и ищите пути оптимизации в паттернах. Тогда и паттерны выучите и поймёте их быстрей, т.к. они будут прикреплены к реальному опыту.