TL;DR;

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

Например, обратные вызовы в JS могут использоваться для имитации конечного автомата при реализации паттерна состояний без необходимости вспомогательного кода (контекст, запуск и остановка, если вы перешли по последней ссылке).

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



Паттерны проектирования на динамических языках

Когда GoF предложила 23 шаблона дизайна, никто не мог предвидеть, что их книга будет одной из самых влиятельных в этой теме до сегодняшнего дня, с технологической точки зрения это было чертовски давно. С тех пор были созданы, стали популярными или заново изобрели некоторые парадигмы и языки, превратив некоторые исходные шаблоны в устаревшие или чрезмерно усложненные фрагменты кода, которые вам следует избегать.

На это указал Питер Нориг всего через год после выхода книги, он сказал, что динамические языки уже поставляются с 16 паттернами. Даже в этом случае обычно начинают изучать шаблоны с их реализации C, переведенной на язык, который нам удобен, игнорируя, что иногда в этом переводе нет необходимости.

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

И мне очень жаль, потому что я не являюсь экспертом по большинству языков, о которых я писал, поэтому:

  1. Ожидайте от меня какой-то бессмыслицы
  2. Это может сбивать с толку, потому что у меня нет условий для предоставления конкретных примеров на языках, на которых я не говорю (и я подумал, что было бы нечестно, если бы я предоставил примеры только для JS и C #)
  3. Представьте, что это можно сделать как-нибудь, и после того, как я объяснил, что НЕКОТОРЫЕ делает , я оставил вам задачу: узнать, КАК это написать.

Начнем перечислять особенности?

Типы как первоклассный гражданин

Тип может использоваться и работать во время выполнения, поскольку он был объектом или значением в таких языках, как Javascript, где вы можете избежать написания:

  • Абстракт-Фабрика
  • Наилегчайший вес
  • Завод-метод
  • Состояние
  • Прокси
  • Цепочка ответственности

Выполняет функции первоклассного гражданина

Прочтите первую характеристику прямо выше, заменив «тип» на «функцию». Функциональные языки, такие как Haskell, по определению имеют эту функцию, поэтому вам не нужно реализовывать:

  • Командование
  • Стратегия
  • Шаблон-метод
  • Посетитель

Макросы

Макросы - это функции, которые могут генерировать код во время компиляции, динамически расширяя вашу программу.

Заявление об ограничении ответственности: я понятия не имею, как это работает или даже возможно.

Clojure - хороший пример языка, в котором есть эта функция. Бежать от:

  • Устный переводчик
  • Итератор

Комбинация методов

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

Я думаю, что хуки Ruby являются примером этой функции. В язык встроены:

  • Посредник
  • Наблюдатель

Мультиметоды

Эта функция позволяет C #, например, «видеть» одноименные методы и вызывать правильный на основе переданных вами параметров. И есть способ избежать строительства:

  • Строитель

Модули

Когда в языке есть модули, он может быть разбит на более мелкие части, к которым мы можем ограничить доступ. Я не горжусь этим определением, но я не мог придумать ничего лучше, потому что «модули» - это слово со слишком многими значениями на разных языках. #извиняюсь

Я предполагаю, что пространство имен C # - это своего рода модуль, в котором становится неактуальным писать:

  • Фасад

Заключение

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

PS: проблема GoF

Спустя почти 10 лет после написания книги Ральф Джонсон (№3 GoF) приехал в USP, один из крупнейших университетов Бразилии, чтобы прочитать лекцию о… паттернах! Он сказал, что в их книге есть два недостатка:

  1. Слишком большой упор на шаблоны, вместо того, чтобы сосредоточиться на шагах, которые приводят нас к ним в наших творческих процессах.
  2. Чтение книг заставляет нас поверить в то, что шаблоны улучшают качество кода, а не

использованная литература

  1. Хакерский клуб Гароа на португальском
  2. Паттерны проектирования в динамическом программировании
  3. Уникальные особенности различных языков программирования
  4. Визуальное руководство по свойствам языка программирования
  5. MultiMethods также известен как Multiple Dispatch.

Обновления

20 июля 2019 г.: добавлена ​​ссылка на публикацию; изменил некоторые тексты.

27 июля 2019 г.: изменен язык, на который делается ссылка в разделе «Макросы», поскольку я знаю, что имею опыт работы с этой темой, и поэтому отказ от ответственности больше не действует; изменена визуальная согласованность с другими сообщениями.

Давайте обсудим, что вы думаете об этой истории, хорошее или плохое, критика всегда приветствуется.

Я хотел бы прочитать несколько комментариев и, если возможно, попросить вас, люди, хлопнуть несколько раз и поделиться с друзьями (или врагами, если вы это ненавидите), чтобы распространить информацию.