У кода больше целей, чем просто работа.

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

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

Шаблоны проектирования подразделяются на creational, structural и behavioral. Эта статья посвящена 4 creational шаблонам проектирования, а также плюсам и минусам их использования.

Синглтон — уже реализован в JavaScript

Первый шаблон очень прост для понимания.

Это тип объекта, экземпляр которого можно создать только один раз. В TypeScript вы можете реализовать один класс с именем Config. Он представляет глобальные данные конфигурации приложения. Таким образом, вы даете ему статическое свойство экземпляра, а затем добавляете private перед конструктором. Его больше нельзя создавать с помощью ключевого слова new.

Затем вы создаете статический метод getInstance(), чтобы проверить, был ли экземпляр уже создан. Если нет, он создаст новый, гарантируя, что может существовать только один объект.

Звучит здорово! Но дьявол кроется в деталях.

JavaScript позволяет создавать литералы объектов. Кроме того, он поддерживает концепцию глобальных данных. Объедините их с объектами, которые передаются по ссылке. 💣!

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

Работа с JavaScript означает, что этот паттерн вам не пригодится. Он преобразуется в шаблон, который вам не нужен.

🔥: Совсем другая история с объектно-ориентированными языками. Положитесь на встроенные функции вашего языка, прежде чем повсеместно распространять шаблоны проектирования.

Прототип — совместное использование функций в плоской иерархии

«Прототип» — это просто расшифрованное слово для клонирования.

Знаете ли вы объектно-ориентированное программирование? Вы должны быть знакомы с наследованием. Если нет — класс может быть расширен подклассом.

Просто. Но основная проблема наследования заключается в том, что оно может привести к сложной иерархии кода:

Шаблон прототипа решает упомянутую основную проблему. Он делает это, используя 2 аспекта:

  • Исходя из объекта, который уже есть
  • Создание плоской цепочки прототипов

Оба облегчают совместное использование функций между объектами.

Прежде всего на динамическом языке, который поддерживает прототипное наследование.
🤫:JavaScript поддерживает прототипы.

Стандартно представьте, что у нас есть объект с именем hero.

Это наш прототип.

Теперь вы хотите создать на его основе новый объект, который также имеет расширение name. Вы можете сделать это с помощью Object.create(), передав hero в качестве прототипа. Наконец, укажите дополнительные свойства. Мы придерживаемся name для нового объекта → Mario.

Если вы зарегистрируете этот объект, вы увидите только имя, а не метод findPrincess().

Тем не менее, он будет работать, даже если вы попытаетесь вызвать этот метод.

Почему? Потому что JavaScript идет вверх по цепочке прототипов, пока не достигнет корня. Вы всегда можете получить прототип из объекта, используя это свойство __proto__.

Но и это не лучшая современная практика. Линтер уже помечает его желтым цветом. Вы должны использовать Object.getPrototypeOf().

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

Builder — используйте, когда строить шаг за шагом

Обратите внимание на шаблон строителя.

Представьте, что у вас бургер-ресторан, и каждый клиент должен сделать заказ. Изюминка: они должны рассказать вам о каждом ингредиенте бургера.

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

С помощью шаблона построителя вы просто создаете объекты на ходу — шаг за шагом. Используйте несколько методов, а не один большой конструктор.

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

Ссылка на экземпляр объекта является вашим желаемым результатом. В JavaScript this. Это позволяет реализовать цепочку методов. Просто создайте экземпляр объекта, свяжите вызовы методов, но всегда получайте вещь в качестве возвращаемого значения.

Этот шаблон настолько хорош, что вам не нужно вызывать все шаги. Вы можете вызывать только те, которые необходимы для создания той или иной конфигурации объекта.

Фабрика — избегайте ненужной проверки среды

Еще один шаблон, который может оказаться очень полезным.

Обычно вы используете ключевое слово new для создания экземпляров объектов. Но теперь для этого вы будете использовать функцию или метод.

Это звучит тривиально, но вот практический пример: представьте, что вы создаете кроссплатформенное приложение, которое работает как на iPad, так и на iPhone.

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

Это невозможно 😔

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

Шаблоны — это прекрасно, но для их применения нужно использовать мозг. Копировать-вставить из переполнения стека не получится. Вот 8 правил, чтобы стать умственно квалифицированным разработчиком.

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Присоединяйтесь к нашему сообществу Discord.