Чистая композиция в JavaScript

Сегодня композиция - это нормальный бумер JavaScript: она устраняет фундаментальные недостатки ООП, основанного на наследовании, которое мы получили от старшего поколения, но ею часто злоупотребляют и неправильно используют, потому что каждый хочет запрыгнуть в новые тенденции. Давай приберемся.

Что такое композиция?

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

Но есть другой способ сделать это: манипулировать более мелкими объектами или классами вместо наследования от них. Это композиция. Пример:

Хотя это нормально для простых случаев, здесь есть проблемы. Поведение ожидает определенной структуры состояния (например, здесь .move() ожидает, что .position существует). Кроме того, мы вынуждены принимать все ключи поведения, делая объекты потенциально больше, чем нам нужно, и мы не можем контролировать имена ключей. Мы можем лучше!

Используйте состояние в поведении

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

По сути, ради слабой связи старайтесь составлять независимые объекты, а не функции, которые работают только в определенном контексте.

Однако при слиянии поведения у нас все еще могут быть проблемы, например, когда несколько вариантов поведения работают с одним и тем же свойством. Мы можем обойти такие случаи с помощью инструментов.

Инструменты для слияния

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

Вот пример ключевой фильтрации:

Переименование требует немного больше усилий, потому что подфункции могут не работать из-за изменения ключа:

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

Короче

Композиция на самом деле не сложна, но поскольку сообщество JS очень сильно ориентировано на тенденции, и первые результаты Google для «Композиция в JS» немного ошибаются, так что это может объяснить, почему композиция часто не используется так правильно, как могла бы. .

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