Способ качественно изучить паттерны проектирования / Хабр

Паттерны

Цель обоих паттернов — развеять сомнения игрока в возможностей персонажей и помочь сориентировать на корректный путь.

Книга: «Паттерны проектирования JavaScript»

Раскройте потенциал паттернов проектирования JavaScript. Найдите структурированные решения распространенных задач разработки, пригодные для многократного использования и повышающие масштабируемость, производительность и удобство сопровождения кода. Узнайте, как применение этих паттернов позволяет создавать более чистый и понятный код, способствует организации совместной работы в команде, сокращает количество ошибок и экономит время и силы.Автор дает исчерпывающее представление о паттернах проектирования в современном JavaScript (ES6+) и приводит практические примеры их применения. Сначала вы познакомитесь с порождающими, структурными и поведенческими паттернами проектирования в идиоматическом для JavaScript стиле, а затем переключитесь на архитектурные паттерны и паттерны пользовательского интерфейса. Вы узнаете, как применять паттерны, характерные для таких библиотек, как React, и распространять их на фронтенд и микрофронтенд. В последней части книги представлены и проиллюстрированы паттерны улучшения производительности и безопасности, включая обмен сообщениями, события и стратегии загрузки ресурсов, а также паттерны высокопроизводительных асинхронных вычислений. В издании приводятся примеры использования React и Next.js, а также JavaScript и Web API. Они помогут выбрать и внедрить проверенные паттерны проектирования в различных веб-экосистемах и изменить ваш подход к разработке.

Для кого эта книга

Издание предназначено для разработчиков и архитекторов программного обеспечения (ПО), которые хотят использовать JavaScript и веб-платформу для повышения продуктивности, качества ПО и производительности своих приложений.

Знакомство с паттернами проектирования программного обеспечения будет преимуществом, но не является обязательным.

  • они знакомы с концепциями программирования, но не знают, как эффективно реализовать их на JavaScript;
  • им требуется структурировать код JavaScript и приложения таким образом, чтобы их можно было поддерживать и расширять;
  • они хотят обеспечить бо́льшую производительность для пользователей своих JavaScript-приложений

Структура издания

В главе 1 «Работа с порождающими паттернами проектирования» говорится о порождающих паттернах проектирования, которые помогают организовать создание объектов. Мы рассмотрим реализацию паттернов Прототип (Prototype), Одиночка (Singleton) и Фабрика (Factory) в JavaScript.

В главе 2 «Реализация структурных паттернов проектирования» рассматриваются структурные паттерны проектирования, помогающие выстроить связи между сущностями. Мы реализуем паттерны Заместитель (Proxy), Декоратор (Decorator), Приспособленец (Flyweight) и Адаптер (Adapter) в JavaScript.

Глава 3, «Использование поведенческих паттернов проектирования», посвящена поведенческим паттернам проектирования, которые служат для организации взаимодействия между объектами. Мы узнаем о паттернах Наблюдатель (Observer), Состояние (State), Стратегия (Strategy) и Посетитель (Visitor) в JavaScript.

В главе 4 «Изучение паттернов библиотек реактивных представлений» рассматриваются библиотеки реактивных представлений, такие как React. С этими библиотеками появляются новые паттерны для изучения, внедрения и сравнения.

В главе 5 «Стратегии рендеринга и гидратации страниц» говорится об оптимизации производительности страниц, что в наше время является одной из главных задач. Это важно как для повышения конверсии клиентов на странице, так и для поисковой оптимизации, поскольку поисковые системы, такие как Google, учитывают основные показатели сайта.

Глава 6, «Микрофронтенды, зоны и островные архитектуры», посвящена микрофронтендам. Подобно движению микросервисов на уровне сервисов, микрофронтенды предназначены для разделения большой площади на более мелкие фрагменты, которые можно быстрее обрабатывать и доставлять.

В главе 7 «Паттерны производительности асинхронного программирования» говорится об однопоточной модели параллелизма JavaScript, основанной на циклах событий. Она является одной из его самых сильных сторон, но часто неправильно понимается или недостаточно используется в ситуациях, когда важна производительность. Написание асинхронного кода на JavaScript с высокой производительностью и расширяемостью — ключевой момент в обеспечении бесперебойной работы пользователей при масштабировании системы.

В главе 8 «Паттерны событийно-ориентированного программирования» говорится, что событийно-ориентированное программирование на JavaScript имеет первостепенное значение для приложений, чувствительных к безопасности, поскольку это способ передачи информации из различных веб-контекстов и в них. Приложения, ориентированные на события, часто можно оптимизировать для повышения производительности и масштабируемости.

В главе 9 «Максимизация производительности — отложенная загрузка и разделение кода» рассказывается о том, как для достижения максимальной производительности JavaScript-приложения сократить количество загружаемого и интерпретируемого неиспользуемого кода JavaScript. Приемы, которые можно использовать для решения этой проблемы, называются отложенной загрузкой и разделением кода.

В главе 10, «Стратегии загрузки активов и выполнение кода вне основного потока», рассматривается, как в жизненном цикле приложения возникают ситуации, когда загрузка большего количества кода JavaScript или активов неизбежна. Вы узнаете об оптимизации загрузки активов в конкретном случае JavaScript, а также других веб-ресурсов и, наконец, о том, как выполнять JavaScript вне основного потока браузера.

Файлы примеров

Файлы кода для этой главы можно найти на GitHub по адресу github.com/PacktPublishing/Javascript-Design-Patterns.

Bad title

The requested page title is invalid. It may be empty, contain unsupported characters, or include a non-local or incorrectly linked interwiki prefix. You may be able to locate the desired page by searching for its name (with the interwiki prefix, if any) in the search box.

Possible causes are:

  • an attempt to load a URL such as https://en.wikipedia.org/wiki/| (the | character is unsupported);
  • an attempt to load a URL pointing to a «non-local» interwiki page (usually those not run by the Wikimedia Foundation). For example, the URL https://en.wikipedia.org/wiki/meatball:WikiPedia will give this error, because the «meatball:» interwiki prefix is not marked as local in the interwiki table. Certain interwiki prefixes are marked as local in the table. For example, the URL https://en.wikipedia.org/wiki/meta:Main_Page can be used to load meta:Main_Page. All interlanguage prefixes are marked as local, and thus URLs such as https://en.wikipedia.org/wiki/fr:Accueil will work as expected. However, non-local interwiki pages can still be accessed by interwiki linking or by entering them in the search box. For example [[meatball:WikiPedia]] can be used on a page, like this: meatball:WikiPedia.

Retrieved from «https://en.wikipedia.org/wiki/Special:Badtitle»

  • Privacy policy
  • About Wikipedia
  • Disclaimers
  • Contact Wikipedia
  • Code of Conduct
  • Developers
  • Statistics
  • Cookie statement
  • Mobile view

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

Head First

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

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

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

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

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

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

Абстрактная фабрика (Abstract Factory)

Паттерн «Абстрактная фабрика» — это порождающий паттерн, который отвечает за создание семейств объектов. Основным её преимуществом является то факт, что её удобно использовать для создания категорий объектов, где в каждой категории аналогичные типы. Также мы можем легко добавить новую категорию. Но есть и большой недостаток: добавление нового типа приведёт к существенным изменениям в иерархии классов.

В качестве примера можно привести фабрику мороженого. Мороженое бывает сливочным, ванильным, шоколадным, фруктовым и ореховым. То есть как минимум пять типов. Но также мороженое может производиться разными странами: российское, китайское, тайское. Итого имеем три категории, а в каждой из них по пять типов. В этом случае удобно применить абстрактную фабрику.

abstract class IceCreamFactory < public abstract Creamy GetCreamy(); public abstract Vanilla GetVanilla(); public abstract Chocolate GetChocolate(); public abstract Fruit GetFruit(); public abstract Walnut GetWalnut(); >class RussianFactory : IceCreamFactory < public override Chocolate GetChocolate() < return new RussianChocolate(); >public override Creamy GetCreamy() < return new RussianCreamy(); >public override Fruit GetFruit() < return new RussianFruit(); >public override Vanilla GetVanilla() < return new RussianVanilla(); >public override Walnut GetWalnut() < return new RussianWalnut(); >> class ChineseFactory : IceCreamFactory < public override Chocolate GetChocolate() < return new ChineseChocolate(); >public override Creamy GetCreamy() < return new ChineseCreamy(); >public override Fruit GetFruit() < return new ChineseFruit(); >public override Vanilla GetVanilla() < return new ChineseVanilla(); >public override Walnut GetWalnut() < return new ChineseWalnut(); >> class ThaiFactory : IceCreamFactory < public override Chocolate GetChocolate() < return new ThaiChocolate(); >public override Creamy GetCreamy() < return new ThaiCreamy(); >public override Fruit GetFruit() < return new ThaiFruit(); >public override Vanilla GetVanilla() < return new ThaiVanilla(); >public override Walnut GetWalnut() < return new ThaiWalnut(); >> #region Abstract Items abstract class Creamy < >abstract class Vanilla < >abstract class Chocolate < >abstract class Fruit < >abstract class Walnut < >#endregion #region Russian Items class RussianCreamy : Creamy < >class RussianVanilla : Vanilla < >class RussianChocolate : Chocolate < >class RussianFruit : Fruit < >class RussianWalnut : Walnut < >#endregion #region Chinese Items class ChineseCreamy : Creamy < >class ChineseVanilla : Vanilla < >class ChineseChocolate : Chocolate < >class ChineseFruit : Fruit < >class ChineseWalnut : Walnut < >#endregion #region Thai Items class ThaiCreamy : Creamy < >class ThaiVanilla : Vanilla < >class ThaiChocolate : Chocolate < >class ThaiFruit : Fruit < >class ThaiWalnut : Walnut < >#endregion class IceCreamManager < public IceCreamFactory GetRussianFactory() < return new RussianFactory(); >public IceCreamFactory GetChineseFactory() < return new ChineseFactory(); >public IceCreamFactory GetThaiFactory() < return new ThaiFactory(); >> private static void Main(string[] args)

ТОП-23 курса по компьютерной графике: обучение с нуля для детей и взрослых

Рассмотрим 10 лучших программ по компьютерной графике, а также дополнительные полезные курсы для CG-художников и бесплатные сервисы.

Комьюнити
04 окт в 16:22

Анализ известного высказывания

Учитывая предыдущие разделы, давайте кратко рассмотрим утверждение, которое вы можете встретить, просто загуглив паттерны проектирования:

Функциональные языки не нуждаются в паттернах проектирования.

Вы можете найти пример здесь. Это утверждение неверно, поскольку подразумевает, что паттерны проектирования относятся только к объектно-ориентированной парадигме. Однако паттерны проектирования — это концепция, которая может присутствовать как в парадигме функционального программирования, так и в объектно-ориентированной парадигме. Просто паттерны проектирования могут быть специфичны для проблем и требований целевой парадигмы. Например, парадигма функционального программирования включает паттерны проектирования, специфичные для ее контекста.

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

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

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

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

№7 Царапины на полу

Секретный проход / путь за шкафом или иным объектом с обязательной подсказкой в виде царапин на полу. Царапины сигнализируют о возможности подвинуть объект.

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

Цель паттерна: скрыть проход, оставив его «на виду». Требует от игрока повышенного внимания для его поисков.

Паттерн может использоваться во всех типах игр.

404: Page not found

The page you’ve requested can not be displayed. It appears you’ve missed your intended destination, either through a bad or outdated link, or a typo in the page you were hoping to reach.

  • You can return to the home page if you’re feeling lost.
  • If you think this is our mistake, you can also contact us. We’ll be thankful.
  • Or you can use the search box to find the information you’ve been looking for.
  • Premium Content
    • Design Patterns eBook
    • Refactoring Course
    • What is Refactoring
      • Clean code
      • Technical debt
      • When to refactor
      • How to refactor
      • Bloaters
        • Long Method
        • Large Class
        • Primitive Obsession
        • Long Parameter List
        • Data Clumps
        • Switch Statements
        • Temporary Field
        • Refused Bequest
        • Alternative Classes with Different Interfaces
        • Divergent Change
        • Shotgun Surgery
        • Parallel Inheritance Hierarchies
        • Comments
        • Duplicate Code
        • Lazy Class
        • Data Class
        • Dead Code
        • Speculative Generality
        • Feature Envy
        • Inappropriate Intimacy
        • Message Chains
        • Middle Man
        • Incomplete Library Class
        • Composing Methods
          • Extract Method
          • Inline Method
          • Extract Variable
          • Inline Temp
          • Replace Temp with Query
          • Split Temporary Variable
          • Remove Assignments to Parameters
          • Replace Method with Method Object
          • Substitute Algorithm
          • Move Method
          • Move Field
          • Extract Class
          • Inline Class
          • Hide Delegate
          • Remove Middle Man
          • Introduce Foreign Method
          • Introduce Local Extension
          • Self Encapsulate Field
          • Replace Data Value with Object
          • Change Value to Reference
          • Change Reference to Value
          • Replace Array with Object
          • Duplicate Observed Data
          • Change Unidirectional Association to Bidirectional
          • Change Bidirectional Association to Unidirectional
          • Replace Magic Number with Symbolic Constant
          • Encapsulate Field
          • Encapsulate Collection
          • Replace Type Code with Class
          • Replace Type Code with Subclasses
          • Replace Type Code with State/Strategy
          • Replace Subclass with Fields
          • Decompose Conditional
          • Consolidate Conditional Expression
          • Consolidate Duplicate Conditional Fragments
          • Remove Control Flag
          • Replace Nested Conditional with Guard Clauses
          • Replace Conditional with Polymorphism
          • Introduce Null Object
          • Introduce Assertion
          • Rename Method
          • Add Parameter
          • Remove Parameter
          • Separate Query from Modifier
          • Parameterize Method
          • Replace Parameter with Explicit Methods
          • Preserve Whole Object
          • Replace Parameter with Method Call
          • Introduce Parameter Object
          • Remove Setting Method
          • Hide Method
          • Replace Constructor with Factory Method
          • Replace Error Code with Exception
          • Replace Exception with Test
          • Pull Up Field
          • Pull Up Method
          • Pull Up Constructor Body
          • Push Down Method
          • Push Down Field
          • Extract Subclass
          • Extract Superclass
          • Extract Interface
          • Collapse Hierarchy
          • Form Template Method
          • Replace Inheritance with Delegation
          • Replace Delegation with Inheritance