Пользователь
0,0
рейтинг
25 января 2014 в 21:07

Разработка → Шпаргалка по шаблонам проектирования


Перевод pdf файла с сайта http://www.mcdonaldland.info/ с описанием 23-х шаблонов проектирования GOF. Каждый пункт содержит [очень] короткое описание паттерна и UML-диаграмму. Сама шпаргалка доступна в pdf, в виде двух png файлов (как в оригинале), и в виде 23-х отдельных частей изображений. Для самых нетерпеливых — все файлы в конце статьи.

Под катом — много картинок.


Условные обозначения


Отношения между классами


  • — агрегация (aggregation) — описывает связь «часть»–«целое», в котором «часть» может существовать отдельно от «целого». Ромб указывается со стороны «целого».

  • — композиция (composition) — подвид агрегации, в которой «части» не могут существовать отдельно от «целого».

  • — зависимость (dependency) — изменение в одной сущности (независимой) может влиять на состояние или поведение другой сущности (зависимой). Со стороны стрелки указывается независимая сущность.

  • — обобщение (generalization) — отношение наследования или реализации интерфейса. Со стороны стрелки находится суперкласс или интерфейс.


Виды паттернов


  • — поведенческие (behavioral);

  • — порождающие (creational);

  • — структурные (structural).



Список шаблонов


Хранитель (memento)


Цепочка обязанностей (chain of responsibility)


Наблюдатель (observer)


Команда (command)


Состояние (state)


Интерпретатор (interpreter)


Стратегия (strategy)


Итератор (iterator)


Шаблонный метод (template method)


Посредник (mediator)


Посетитель (visitor)


Адаптер (adapter)


Прокси (proxy)


Мост (bridge)


Абстрактная фабрика (abstract factory)


Компоновщик (composite)


Строитель (builder)


Декоратор (decorator)


Фабричный метод (factory method)


Фасад (facade)


Прототип (prototype)


Приспособленец (flyweight)


Одиночка (singleton)


Файлы


  • все паттерны в pdf-файле.
  • то же самое, но в png — 1 и 2 части.
  • архив с нарезанными изображениями.


Upd. оригинальный pdf и изображения (1, 2).

P.S. По запросу «шаблоны проектирования» 636 топиков, а хаба нет; а по «bitcoin» — 278 топиков и хаб есть. Прошу восстановить справедливость!

Опросы

Стоит ли продолжать переводить шпаргалки?

Проголосовало 3123 человека. Воздержалось 305 человек.

Нужен ли хаб для паттернов?

Проголосовало 3045 человек. Воздержалось 452 человека.

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

Влад @WarAngel_alk
карма
61,7
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

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

  • +1
    Отлично! Захотелось сразу даже блокнотик сделать со шпаргалками. Спасибо вам, очень полезно!
  • +3
    все читают теги
    • +19
      Прочитал только после этого комментария. А так никогда не читаю. :)
      • +4
        А они и не нужны для того, чтобы их читали вместе со статьей. По ним надо искать, вводя в строку ввода "[тег]".
    • +1
      Спасибо пунктуации на новый тег «я верю» %)
    • +8
      Сейчас будет крик души.

      Когда уже основная масса хабраавторов поймёт, что теги не для того, чтобы их читали, а для того, чтобы нужный материал было легче найти по заданному тегу как в общем поиске, так и в избранном. Поэтому нужно указывать четкие однозначные метки, а не писать сочинение в стиле «теги никто не читает, потому напишу сюда какую-нибудь лабуду».
      Постоянно приходится дописывать свои теги к постам при добавлении в избранное, но проблему общего поиска по тегам это не решает.
      Сейчас у меня в избранном полно информационного мусора в тегах: «никто не читает теги», «тег который никто не читает», «зачем я пишу такие подробные теги?» и пр. А по тегу «всё равно никто не читает теги» на хабре аж 43 топика.
      • +1
        И наверняка в каждом из них есть комментарий о том, что кто-то их всё таки читает)

        Но ладно, убедили, пора завязывать с этой традицией…
      • 0
        А ещё, не секрет, по ним строится колонка «похожие публикации», которую многие смотрят
  • +10
    Попытки использовать какую-то ужасную нотацию, то ли куски UML, то ли сами что-то напридумывали. Где-то типы указаны, где-то нет, где то вообще поля какие-то берутся, а то вот, пустые прямоугольники. Не вижу шпаргалки тут, вижу набор субъективных представлений выраженных в плохих рисунках.
    • +14
      Да и вообще, в виде схем воспринимается сложнее — привычнее такое видеть в виде кода на любом распространенном языке с Си-образным синтаксисом.
      • –4
        Согласен. Только лучше Python (код короче и нагляднее) и примеры на одной и той же задаче «почувствуйте разницу».
        freehabr.ru/blog/designpatterns/2565.html
        • +1
          А это как?

          Ведь каждый паттерн — это решение своей задачи, нельзя одним паттерном решить все задачи и нельзя всеми паттернами решить одну и ту же проблему…
          • 0
            Возможно имеется в виду задача как проект, в котором с помощью паттернов решаются те или иные архитектурные проблемы более удачным или, хотя бы, более понятным большинству, способом.
            • 0
              В таком контексте поддержу просьбу.

              Хотелось бы увидеть практическое применение в пределах одного проекта с объяснением бывалых почему для конкретного случая было выбрано применение определенного паттерна, потому как суть некоторых основываясь лишь на теории самому не очень ясна.
              • 0
                Так в оригинальной книге GoF как раз с примерами, как по отдельным паттернам, так и в пределах проекта «Текстовый редактор». Эта шпаргалка — выжимка из той книги.
        • 0
          Структурные паттерны на питоне? Ну-ну :)
          Нет, я не спорю, написать то можно что угодно, только вот показывать плохие примеры для языка это не правильно…
          • 0
            Структурные Порождающие конечно же
            • 0
              У меня там freehabr.ru/blog/designpatterns/2565.html приведены следующие паттерны.
              Behavioral: interpreter, iterator;
              Creational: abstractfactory, builder, singleton;
              Structural: facade, flyweight.
              А так, примеры есть на все из «книги четырех» я их просто не выкладывал.
              А Вы уж определитесь какие из «плохие примеры для языка». Плохо иметь единый пример, чтобы четко различать и чувствовать разницу в реализации, или надо было их делать не на Python, а на PHP, а лучше на Pascal/Delphi, которые Вы типа знаете, но испортили ими в молодости своей неокрепший разум.
              • +1
                После изучения Ваших примеров я просто признаю что нам с Вами нечего обсуждать.
  • 0
    в описании у каждого патерна указан тип 'поведенческий'. А судя по списку в начале должны ещё быть порождающие и структурные.
    • 0
      Упс… извиняюсь, глупая ошибка, сейчас исправлю.
    • –4
      Всё же очевидно, они по цвету различаются. Легенда цветов в начале. Я на неё посмотрел и дальше не читал подписи.

      Ах, у кого-то проблемы с цветовосприятием? Так это их проблемы, и вообще их всего несколько процентов. Зачем ещё придумывать, как продублировать цветовую информацию?

      В общем, это надо не в хаб «Паттерны», а в хаб «Анти-Accessibility». Точно будет популярным.
      • +1
        Это точно ко мне вопросы? Для меня очевидно какой паттерн куда относится вообще без цветов и подписей. Да и без этой статьи тоже :-)
        Но если автор делает шпаргалку по теме, то информация должна быть либо верной либо отсутствовать вообще.
        Там есть ещё файлы для скачки и печати, в которых тот же косяк. после их распечатки цветовая маркировка уже сильно не поможет
    • +2
      Обновил пост: поменял типы паттернов, обновил ссылки на файлы.
  • 0
    А ссылку на исходник на английском добавьте плз
    • 0
      Эх, и это забыл… Добавил оригинальные файлы.
  • +2
    В общем, мораль понял: поспешишь — людей насмешишь :(
  • +9
    А как их предлагается использовать?

    Вот сидишь, значит, проектируешь новое приложение, перебираешь шпаргалки, какой паттерн куда вставить… Что-то мне кажется, что если так делать, то ничего дельного в итоге не получится.
    • 0
      Думаю, для изучения, закрепления и повторения материала пригодится.
    • 0
      А вот в этом и заключается редкое и ценное умение использовать паттерны.
    • 0
      Программисту их надо просто знать, чтобы не изобретать велосипед и уметь применять там, где в этом есть смысл.
      Начинающему программисту с ними надо хотя бы ознакомиться, чтобы узнать, что в его любимом языке программирования можно еще и вот такие штуки вытворять. Также начинающему программисту при ознакомлении с паттернами наставник должен сказать о том, что не стоит теперь всё писать используя только паттерны.
      • +3
        Я, конечно, говорю не про то, что делать с паттернами, а что делать с такими шпаргалками по паттернам? Разобраться с шаблонами проектирования по ним явно не получится.
    • –1
      Например, я шпаргалки по паттернам просматриваю перед собеседованиями. Книга банды четырех была прочитана и усвоена уже давно и я периодически начинаю путать названия паттернов, хотя и продолжаю помнить их смысл. Вот в такие моменты и пригодится шпаргалка.

      Еще неплохо в ситуации, когда тебе коллега говорит «Вкратце, то, что я здесь реализовал похоже на паттерн N», а ты подзабыл который из паттернов называется N, но, быстро взглянув на шпаргалку, вспомнил.
  • 0
    На английском есть очень похожая реализация (Refcardz на DZone) — http://cdn.dzone.com/sites/all/files/refcardz/rc008-designpatterns_online.pdf — подготовленная для печати версия.
  • +3
    Честно говоря, вообще никак не воспринимаю картинки-схемы, для меня это пустое место. Вот код — другое дело.
  • +1
    Я такую своим ребятам раздал, пользы от нее никакой правда )
    Найти бы подобную по TDD: 5 правил TDD (типа NO PRODUCTION CODE BEFORE RED TEST), паттерны и операции рефакторинга применяемые при этом и т.п.
    Т.е. 3 часть «Экстремального программирования» Кента Бека но на одну страничку :)
  • –2
    вместо целого поста автор мог бы просто указать ссылку на эту книгу
    • +2
      Тоже как-то не понял в чем смысл поста. Схемки? Так особого плюса от них нет. Они ничего фактически не объясняют. Кажется очередным популистским постом, которых сейчас в интернете много из серии 10 штук, чтобы ваши штуки выглядели штуками.
  • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      Мне кажется это бесполезным. Ну будет у вас сниппет, например, на фабричный метод? Его цена равна нулю если не знать когда и зачем его применять. Это же самое главное.
      • +1
        Если постоянно их проглядывать, то быстро научишься узнавать признаки паттернов в своём коде и подгонять их под стандарт.
    • 0
      После прочтения фразы про «цветовую дифференциацию штанов» (конечно же, из многими любимого фильма «Кин-дза-дза») вспомнил лекции по мат. логике, где были задачки с этой фразой… Ностальгия.
    • +1
      Как это в плюсах нет функций высших порядков? Есть std::function, есть std::bind, есть std::mem_fn, есть лямбды, есть функциональные объекты. По коду будет длиннее, чем в JS, но работать код будет заметно шустрее, особенно если функцию можно заинлайнить.
      А вообще для меня эта шпаргалка скорее нужна чтобы давать более менее устоявшиеся названия сущностям в коде чтобы другие понимали, а сама по себе она не учит ничему.
      Для того, чтобы научиться видеть и применять шаблоны нужен цикл задач на применения того или иного шаблона проектирования, есть ли в интернете именно задачники причем желательно с какой-нибудь возможностью тестирования эффективности полученного решения?
      • 0
        Как это в плюсах нет функций высших порядков? Есть std::function, есть std::bind, есть std::mem_fn, есть лямбды, есть функциональные объекты.

        Да функция, принимающая в качестве аргумента указатель на другую функцию (или возвращающая его), уже есть функция высшего порядка. Это даже в простом Си работает.
        • 0
          Подозреваю, что имелось в виду всё-таки first class citizen, таким свойством в С++ только некоторые функции обладают.
      • НЛО прилетело и опубликовало эту надпись здесь
        • +1
          Лямбды страшноватые из за статической типизации, да и не слишком это страшнее, чем
          var result = foo(a, function(a, b, c) {… });
          Хотя конечно это не функциональные языки и ленивые вычисления не поддерживаются а из за отсутствия сборки мусора за временем жизни захваченных переменных нужно самому следить, но зато работают они очень быстро.

          Вот раз сборника задач и нет, то, как мне кажется, он бы имел весьма большой успех. Хорошо бы их сделать вместе с тестировщиком, но я ума не приложу как тестировать архитектуру кода, это не входные и выходные данные через stdio подсовывать и забирать.
    • 0
      Выберите короче свой любимый язык и постарайтесь сделать шпаргалку именно по паттернам для него.
      Естественно, ведь по сути фраза «я использовал паттерн X» — это «выразительных возможностей используемого мной языка не хватает, чтобы записать X очевидным образом». Даже сами GoF говорят о том, что их книга с паттернами направлена на языки с выразительностью уровня Java. Возможности языков различаются, так что паттерны не имеют смысла без привязки к языку. Где-то есть поддержка функций высшего порядка — там нет Strategy, там просто создаётся и передаётся функция. Где-то сигналы-слоты заменяют велосипедные Observers. Где-то есть поддержка мультметодов — и там не нужен Visitor. Где-то есть встроенные синглтоны. Где-то классы являются являются объектами и Factory сводится к простому вызову функции make.
  • +3
    Такие вещи полезны, что бы вставлять их в слайды лекций.
  • 0
    Вот к примеру, очень хорошо рассматриваются паттерны на dofactory.com в разделе ".NET Design Patterns". Там есть и простые и из реального мира примеры на каждый паттерн :). Я пользуюсь этим ресурсом.
  • +1
    Вот еще шпаргалка, только без картинок itdumka.com.ua/index.php?cmd=shownode&node=11
  • 0
    Было бы также не менее интересно посмотреть частотность использования тех или иных паттернов программистами. Ведь часто бывает так, что программист знаком с паттерном, но решить проблему он пытается «в лоб», т.е не в обход с помощью паттернов.
  • 0
    В статье можно бы добавить ясности, если придерживаться группировки шаблонов как в книге. Так будет проще и быстрее найти то что нужно. В идеале, и той же последовательности паттернов лучше придерживаться. В книге они группировались на 3 раздела Creational, Structural и Behavioral patterns. Здесь же идут в перемешку… например Visitor -> Adapter -> Proxy…
  • 0
    Спасибо!
  • 0
    Шпаргалки — это прекрасно. Они структурируют все, что лежит у тебя в голове.
  • 0
    Большое спасибо!
    Пожалуйста, если у Вас будет возможность, продолжайте!
  • 0
    Очень структурно. информативно и полезно!
    Thanks a million!
  • 0
    Получается, что агрегация вообще нигде не используется, но зачем-то описана.

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