TL;DR;
Реализация шаблона проектирования - это то, что меняется от языка к языку, менее известно, что некоторые языки имеют встроенные функции, которые делают шаблон неактуальным, поэтому вам следует избегать их написания на этом языке.
Например, обратные вызовы в JS могут использоваться для имитации конечного автомата при реализации паттерна состояний без необходимости вспомогательного кода (контекст, запуск и остановка, если вы перешли по последней ссылке).
Если вам нравится контент, пожалуйста, помогите распространить информацию, хлопая в ладоши и делясь, и, как всегда, приветствуются критические замечания.
Паттерны проектирования на динамических языках
Когда GoF предложила 23 шаблона дизайна, никто не мог предвидеть, что их книга будет одной из самых влиятельных в этой теме до сегодняшнего дня, с технологической точки зрения это было чертовски давно. С тех пор были созданы, стали популярными или заново изобрели некоторые парадигмы и языки, превратив некоторые исходные шаблоны в устаревшие или чрезмерно усложненные фрагменты кода, которые вам следует избегать.
На это указал Питер Нориг всего через год после выхода книги, он сказал, что динамические языки уже поставляются с 16 паттернами. Даже в этом случае обычно начинают изучать шаблоны с их реализации C, переведенной на язык, который нам удобен, игнорируя, что иногда в этом переводе нет необходимости.
Ниже приведен список функций, которые обычно имеют динамические языки, а также краткое объяснение, язык, в котором они есть, и шаблоны, которые вам следует как-то избегать, чтобы реализовать себя. Имейте в виду, что эта статья основана на статье Норига, но я позволил себе использовать нединамические языки в качестве примеров.
И мне очень жаль, потому что я не являюсь экспертом по большинству языков, о которых я писал, поэтому:
- Ожидайте от меня какой-то бессмыслицы
- Это может сбивать с толку, потому что у меня нет условий для предоставления конкретных примеров на языках, на которых я не говорю (и я подумал, что было бы нечестно, если бы я предоставил примеры только для JS и C #)
- Представьте, что это можно сделать как-нибудь, и после того, как я объяснил, что НЕКОТОРЫЕ делает , я оставил вам задачу: узнать, КАК это написать.
Начнем перечислять особенности?
Типы как первоклассный гражданин
Тип может использоваться и работать во время выполнения, поскольку он был объектом или значением в таких языках, как Javascript, где вы можете избежать написания:
- Абстракт-Фабрика
- Наилегчайший вес
- Завод-метод
- Состояние
- Прокси
- Цепочка ответственности
Выполняет функции первоклассного гражданина
Прочтите первую характеристику прямо выше, заменив «тип» на «функцию». Функциональные языки, такие как Haskell, по определению имеют эту функцию, поэтому вам не нужно реализовывать:
- Командование
- Стратегия
- Шаблон-метод
- Посетитель
Макросы
Макросы - это функции, которые могут генерировать код во время компиляции, динамически расширяя вашу программу.
Заявление об ограничении ответственности: я понятия не имею, как это работает или даже возможно.
Clojure - хороший пример языка, в котором есть эта функция. Бежать от:
- Устный переводчик
- Итератор
Комбинация методов
Примером комбинации методов является наличие события after для определенного метода, если в языке есть эта функция, вместо того, чтобы вызывать событие вручную после вызова метода, вы привязываете метод к его событию after и позволяете языку вызывать его автоматически. , поэтому вам не нужно беспокоиться о том, что кто-то забудет вызвать событие.
Я думаю, что хуки Ruby являются примером этой функции. В язык встроены:
- Посредник
- Наблюдатель
Мультиметоды
Эта функция позволяет C #, например, «видеть» одноименные методы и вызывать правильный на основе переданных вами параметров. И есть способ избежать строительства:
- Строитель
Модули
Когда в языке есть модули, он может быть разбит на более мелкие части, к которым мы можем ограничить доступ. Я не горжусь этим определением, но я не мог придумать ничего лучше, потому что «модули» - это слово со слишком многими значениями на разных языках. #извиняюсь
Я предполагаю, что пространство имен C # - это своего рода модуль, в котором становится неактуальным писать:
- Фасад
Заключение
Реализация шаблона - отличное упражнение для понимания его цели, но в некоторых случаях оно избыточно, если только вы не пытаетесь узнать немного больше о том, как работает язык, чтобы лучше его использовать.
PS: проблема GoF
Спустя почти 10 лет после написания книги Ральф Джонсон (№3 GoF) приехал в USP, один из крупнейших университетов Бразилии, чтобы прочитать лекцию о… паттернах! Он сказал, что в их книге есть два недостатка:
- Слишком большой упор на шаблоны, вместо того, чтобы сосредоточиться на шагах, которые приводят нас к ним в наших творческих процессах.
- Чтение книг заставляет нас поверить в то, что шаблоны улучшают качество кода, а не
использованная литература
- Хакерский клуб Гароа на португальском
- Паттерны проектирования в динамическом программировании
- Уникальные особенности различных языков программирования
- Визуальное руководство по свойствам языка программирования
- MultiMethods также известен как Multiple Dispatch.
Обновления
20 июля 2019 г.: добавлена ссылка на публикацию; изменил некоторые тексты.
27 июля 2019 г.: изменен язык, на который делается ссылка в разделе «Макросы», поскольку я знаю, что имею опыт работы с этой темой, и поэтому отказ от ответственности больше не действует; изменена визуальная согласованность с другими сообщениями.
Давайте обсудим, что вы думаете об этой истории, хорошее или плохое, критика всегда приветствуется.
Я хотел бы прочитать несколько комментариев и, если возможно, попросить вас, люди, хлопнуть несколько раз и поделиться с друзьями (или врагами, если вы это ненавидите), чтобы распространить информацию.