JavaScript Паттерны. Шаблоны проектирования. 17 Примеров

JavaScript Паттерны. Шаблоны проектирования. 17 Примеров

Владилен Минин

4 года назад

286,501 Просмотров

Ссылки и html тэги не поддерживаются


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

Сергій
Сергій - 13.08.2023 17:20

ты что фабрикой синглтон реализуешь?))) ууууу, нормально так настроение поднял инфоциган =)

Ответить
black label
black label - 23.05.2023 16:37

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

Ответить
MAKSYM CHERNETSKYY
MAKSYM CHERNETSKYY - 24.03.2023 22:18

а разве тут показана фабрика? по мне это выглядит как абстрактная фабрика, а это немного другое

Ответить
The14Some1
The14Some1 - 20.03.2023 19:23

Chain of responsibility, показанный тут, на самом деле является паттерном под названием "Builder". "Chain of responsibility" сам по себе подразумевает, что у нас есть разные классы, совместно выполняющие какую-то сложную задачу, и реализован механизм передачи данных от одного класса к другому по мере обработки данных.

Ответить
The14Some1
The14Some1 - 20.03.2023 18:33

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

Ответить
MinePlay
MinePlay - 23.01.2023 02:12

Почему в паттерне Constructor не сделать static create() ? Зачем создавать new MemberFactory ? )

Ответить
макогон денис
макогон денис - 18.01.2023 21:50

Можете допомогти,а принцип open-close не нарушається патерном factory,ми ж порушимо незмінну класу при добавлении нового класа?

Ответить
амирхан шамгонов
амирхан шамгонов - 13.01.2023 15:48

СПАСИБО!

Ответить
Владимир Мельников
Владимир Мельников - 14.12.2022 03:18

Не уверен в правильности примеров цепочки ответственности и фасаде.

Ответить
Вадим Колисниченко
Вадим Колисниченко - 01.12.2022 05:10

Владилен, это нереально полезный урок для меня. Спасибо огромное!

Ответить
Juris
Juris - 25.10.2022 13:41

@Владилен Минин
JavaScript и OOP? Серьёзно? Если нет нормального OOP, то нет и паттернов. Я ещё бы понял Typescript, но не JS.

Ответить
Хакохо
Хакохо - 24.10.2022 19:56

Спасибо Владилен! Чтобы не открывать Википедию на слове "инфлюментированы", пожалуйста говори эти слова "по-русски", ну или поясни сразу что это значит. Спасибо.

Ответить
Антон Шавермин
Антон Шавермин - 04.10.2022 06:08

чотко, спасибо))) с ходу жирный лайк от его величества кодера - СЕООНЛИ

Ответить
ĐÎĞŁ ĪXƏØ PŘØFFI KĪBĔŘĞ
ĐÎĞŁ ĪXƏØ PŘØFFI KĪBĔŘĞ - 28.09.2022 17:23

Круто Владилен

Ответить
Dmitry Pupinin
Dmitry Pupinin - 28.09.2022 13:38

Есть несколько спорных моментов в понимании автором паттернов:
1. Декоратор. Автор описал скорее порождающий паттерн, похожий на Прототип. Основная особенность декоратора - возможность навесить на объект несколько штук одновременно, при этом каждый из них будет расширять возможности базового класса. Например: на стандартный вывод лога в файл можно навесить декораторы отправляющий данные по почте, в телеграм, в слак. Причем повесить можно динамически в любой комбинации.
2. Фасад. Описана скорее Фабрика. Пример фасада: вы берете некую библиотеку (например компрессия видео) в которой милион методов, параметров и т.п. Но вам это все не нужно, поэтому вы делаете фасад с одним методом compress(filename, format) и уже внутри настраиваете сжатие или даже выполняете его в несколько проходов.
3. Flyweight. Здесь автор на верном пути, но пример не показывает самого главного - паттерн нужен для экономии памяти. Пример: нужно отобразить большой список автомобилей (объект Car) и рядом с каждой отобразить логотип. Логотип - это картинка, которая повторяется у разных объектов, но при этом занимает больше всего памяти. И вот картинку и нужно выделить из Car и хранить отдельно и уникально. Тогда отображая даже тысячу объектов нам возможно придется хранить только 1-2 картинки.
4. Chain of Responsibility. Тут автор дал маху и описал Method chaining, ничего общего с заявленным паттерном не имеющий.
5. Command. Похоже что автор вывернул шаблон на изнанку... :) т.к. обычно объект вызывает команду, а не команда объект. Смысл паттерна в том, чтобы унифицировать интерфейс команды и облегчить динамическое связывание объектов с разными командами. Например: ajax сохранение документа (как в Google Docs) можен происходить по нажатию на кнопку, по комбинации клавиш и по таймеру. Все эти элементы связываются с одной командой и вызывают ее метод execute. Таким образом алгоритм сохранения находится в одном месте - в команде. Но главное - нет никаких трудностей в присоединении этой же команды, например, к жесту мышью (gesture).
6. State. Здесь автор не решил проблему, а наоборот ее создал. Представим себе большое количество состояний, которые еще и меняются в зависимости от роли пользователя. Метод change сразу превращается в жестокий набор десятков if и даже хуже. Так вот паттерн State как-раз и предназначен решить создаваемую автором проблему. А решает он ее тем, что как-раз state определяет какое состояние будет следующим! Т.е. именно GreenLight должен решать какой свет будет после него и менять состояние светофора. Кстати, обратите внимание, что у автора после зеленого сигнала включается красный, хотя должен быть желтый.
7. Strategy. В целом автор все описал правильно, за исключение одного, однако же, принципиального момента: стратегия должна храниться внутри контекста (Commute). Здесь нужно понимать, что стратегия - это то, что выбирается и какое-то время используется в основном алгоритме. В нужно время стратегию можно изменить. Таким образом Commute как-раз и предназначен для того, чтобы вызвать стратегию, не упоминая ее саму (Commute.travel()). Тоесть в приложении будет всего несколько мест где стратегия будет выбираться или изменяться, во всех остальных (сотнях) мест мы вызываем ее опосредованно через контекст (Commute). И вот это как-раз и является целью данного паттерна.
8. Template. Такой поведенческий паттерн мне не известен, однако известен "Template Method". В данной части автор рассматривает простое наследование классов, не имеющее к поведенческим паттернам никакого отношения.
Автору спасибо за возможность вспомнить и повторно проанализировать цели использования паттернов! :)

Ответить
Dust! Fell sans
Dust! Fell sans - 04.08.2022 20:49

Владилен, спасибо огромное за данное видео, оно было очень полезно! Но у меня возник вопрос: является паттерн "модуль" в JS до сих пор актуальным? Ибо одни говорят о том, что ES6 решил эту проблему описанную в паттерне, другие говорят о том, что он до сих пор востребован. Хотелось услышать ваше мнение на этот счёт, заранее спасибо.

Ответить
Artjoms Fomenko
Artjoms Fomenko - 28.07.2022 20:46

господи, у меня флешбэки войны во Вьетнаме при виде отсувствующих ;

Ответить
Shilza
Shilza - 23.07.2022 19:04

Спасибо! Отличное видео

Ответить
John Baretty
John Baretty - 08.06.2022 12:39

Yo,Vladilen спасибо!

Ответить
pika4u
pika4u - 20.05.2022 15:12

Не очень понимаю разницу между factory и facad

Ответить
Dmitriy Zhuravlev
Dmitriy Zhuravlev - 10.05.2022 19:54

Шаблон итератор: хранить индекс в объекте нельзя. Надо хранить в замыкании, т.е. создавать переменную в функции [Symbol.iterator].
Иначе, если остановить перебор или вставить перебор в перебор, то объект будет перебираться не с начала. А каждый перебор должен быть одинаковым.

Ответить
Оксана Гаращенко
Оксана Гаращенко - 25.04.2022 14:39

попыталась в codesandbox воспроизвести пример с фабрикой, static list = {...} выдает ошибку - Support for the experimental syntax 'classProperties' isn't currently enabled.

Ответить
Abay Kinayat
Abay Kinayat - 20.03.2022 20:10

В шаблоне проектирования Адаптер не будет ли проще сделать NewCalc extends OldCalc, или это простой пример, и в реальности этого не применить?

Ответить
Каролина FORTUNA
Каролина FORTUNA - 15.03.2022 20:48

спасибо большое за уроки

Ответить
Игорь Харьков-Украина
Игорь Харьков-Украина - 10.02.2022 18:16

static list = {
simple: SimpleMembership,
standard: StandardMembership,
premium: PremiumMembership
} а почему у меня выдает ошибку Parsing error: Unexpected token =

Ответить
Максим Дикий
Максим Дикий - 02.02.2022 18:13

Спасибо за видео, полезноно! Но все же ; лучше ставить в конце команд, меньше ошибок будет! Это как книгу писать без разделительных знаков!

Ответить
Striker Orion
Striker Orion - 30.01.2022 11:49

Хорошее толкование.

Ответить
zi zi
zi zi - 11.01.2022 01:12

извините, но это 17 примеров, как простой код превратить в нарочито нечитаемое ООП :( при этом часть из них ещё нарушает принципы иммутабельности. Увы, большая часть этих паттернов устарела для JS

Ответить
TheLastOne
TheLastOne - 05.01.2022 12:52

есть функции высшего порядка, а есть декораторы, вопрос на засыпку: в чем разница?

Ответить
Pokruk
Pokruk - 03.01.2022 05:25

Лол, template это просто сам по себе смысл наследования, а не паттерн

Ответить
Pokruk
Pokruk - 03.01.2022 05:00

Много времени просто под диктовку пишешь код, видео раза в два как минимум можно было бы сократить

Ответить
An
An - 28.11.2021 23:15

Владилен, если не секрет где ты работаешь? Фрилансишь на апворке или в компании. B сколько ты зарабатываешь в месяц? Просто интересно))) И сколько лет ты уже в программировании? Хочу просто понять сколько нужно потратить лет чтобы иметь такой опыт и сколько можно зарабатывать в перспективе

Ответить
Jacob Adlerman
Jacob Adlerman - 27.11.2021 14:12

Владилен, а насколько часто на работе приходится ими пользоваться? Ты показал достаточно много паттернов, значит, ты ими пользовался в реальной разработке?

Ответить
Денис Широков
Денис Широков - 27.11.2021 01:38

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

Ответить
Stanislav Kadyrov
Stanislav Kadyrov - 03.11.2021 16:41

Огромное спасибо за видео! Как всегда все четко, понятно и доступно! Удачи и успехов!

Ответить
Adm
Adm - 02.11.2021 19:07

Круто. Спасибо

Ответить
hub
hub - 02.11.2021 07:04

Эта тема настолько редкая, что заслуживает ЛайкШер даже без просмотра!

Ответить
Maria Shamonova
Maria Shamonova - 21.10.2021 08:30

Спасибо за полезные видео!)

Ответить
APA WORK
APA WORK - 04.10.2021 11:34

Добрый день, отличный урок, может еще что-то вроде PRPL?

Ответить
Никита Казанцев
Никита Казанцев - 25.09.2021 16:00

А может кто-нибудь объяснить разницу между Facade и Factory? Т.е. если мы в первый просто занесём тот список ссылок на классы, то по сути получится именно фабрика, которая собственно проще воспринимается и поддерживается, разве нет?

Ответить
Alexander Zhalyuk
Alexander Zhalyuk - 20.09.2021 22:27

Владилен, сделайте на канале кнопку спонсора, думаю что вам приятно периодически получать донаты.

Ответить
Alexander Zhalyuk
Alexander Zhalyuk - 20.09.2021 22:24

Прекрасная работа! Спасибо огромное за проделанный труд!

Ответить
Тутэйшы
Тутэйшы - 18.08.2021 13:32

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

Ответить
Тутэйшы
Тутэйшы - 17.08.2021 15:55

уже год почти, или даже год, как знаком с js, работаю с ним, изучаю глубоко все. сегодня уже пишу и на python, мгновенно его освоил. знаком с php, было джело, на джуна задачи могу сделать. сегодня я понимаю какую боль испытывают те, кто работает с js, именно программисты а не разработчики которые только одну библиотеку или фреймворк знают, и то только поверхностно, как там все внутри не знают. в js столько лишних движений... библиотеки сделаны не продуманно, а лишь вот под задачу что была нужны на тот момент. много нагромождения, мусора... вроде у тебя есть несколько десятков вариантов решить одну задач, но все они через одно место... js, это очень сложный яп!!! учить его первым, я бы крайне не рекомендовал! python тоже не легок, когда ты перестаешь писать мусоро код, квак и php. но python и php, реально учат кодить. а js скорее учит говнокодить.))) столько подводных камней в js... чем дальше, чем страшнее.)))) теперь я понимаю, почему фронтов не считают программистами. потому что 99% фронтов, не разбираются в проблемах, а просто ищут готовые решения, вставляют и та сойдет. фронты учат js на примитивном уровне, сразу идут на фреймворк или библиотеку, ам уже за них подумали, все решили, только вставляй готовые решения и норм будет. инженеров, там почти нет. даже на юту, 99.9% мусоро интенсивов! только Владилен и еще пару человек пишут реально годное... тот же python, не позволит писать мусор, мы рууки сломаете просто на ровно месте.)) поэтому по ем только мелкие решения на 15 минут видео. мне на днях скинули задачку на собеседовании, суть в том, что нельзя использовать математические методы js, пишем все на примитивном уровне... я был готов написать это на hp и python, только не на js, ибо там столько головняка можно получить, что жесть. хахаха задача примитивная, решается пару строк если не ограничить тебя примитивностью. js лучше преподавать, чем на нем писать. хахаха

Ответить
Тутэйшы
Тутэйшы - 17.08.2021 02:53

Запуск срипта в консоле, для VScode Ctrl + Alt + N если кто не знал.))) это в винде. да, там еще выводит с какой скорость выполнился скрипт.

Ответить
Vana_ _F
Vana_ _F - 16.08.2021 18:36

получается, что HOC из реакта это декоратор

Ответить
George Kusto
George Kusto - 15.08.2021 16:58

Спасибо за видео, очень полезно

Ответить
Maxim Vladimirovich
Maxim Vladimirovich - 10.08.2021 13:33

Всё вроде бы ОК, но после паттерна "Mediator" мой мозг залип в "рекурсии"..

Ответить