Введение

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

Проблема

Это из книги, написанной в 1994 году.

«Предпочитайте композицию объектов наследованию классов»

- Шаблоны проектирования: элементы повторно используемого объектно-ориентированного программного обеспечения (стр. 20)

Большинство источников о «композиции против наследования» имеют огромное неправильное представление о самой композиции. Но они используют приведенное выше утверждение как сигнальный пост, говоря: эй, мы должны предпочесть композицию наследованию. На самом деле это одно из самых неправильно понятых утверждений в сообществе JS. И проблема не в приведенном выше утверждении, само утверждение правильное, автор привел очень сильный аргумент, почему мы должны отдавать предпочтение одному перед другим. Проблема в том, что у нас есть множество новичков в сообществе JS, у которых неправильное представление о композиции, и множество инженеров, которые пишут странный код, думая, что эти авторы говорят одно, хотя на самом деле они имеют в виду совсем другое.

Цель

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

Хорошо, приступим

— О чем говорят авторы книги?

Делегирование — это способ создания мощных композиций. И это то, о чем говорит автор. Что такое «Делегирование»? Что ж. Приведу слова автора. Но прежде давайте представим, что у нас есть окно, которое имеет форму прямоугольника и имеет ширину, высоту и площадь.

«Вместо того, чтобы делать класс Window подклассом Rectangle (поскольку окна бывают прямоугольными), Window может повторно использовать поведение переменной экземпляра Rectangle и делегировать поведение, специфичное для Rectangle. Другими словами, вместо того, чтобы быть прямоугольником, у него будет прямоугольник. Теперь Window должен явно пересылать запрос своему экземпляру Rectangle, тогда как раньше он унаследовал бы эти операции».

— Те же авторы, та же книга и та же страница☝️

Реальный состав

Давайте создадим два разных примера JavaScript для этого Window. В первом примере Window использует наследование, а во втором примере Window повторно использует поведение Rectangle переменная экземпляра.

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

Window в первом примере меньше подходит для повторного использования, так как представляет собой Rectangle. Представим, что у вас есть классRoundedдлякруглыхокон. . Ну, вы не можете расширять оба класса: Rounded и Rectangleклассы для одного и того жеокнакласса,и вы не можете создатьэкземпляр Окно для закругленных оконлибо. Но во втором примере Window может иметь переменную экземпляра со значением Rounded класс. Это делает класс Window гораздо более пригодным для повторного использования. Вот как

— Что делают люди, когда обсуждают композицию

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

Так что это множественное наследование или фейковая композиция, а не та композиция из книги «Шаблоны проектирования (1994)».

Вывод

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

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

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

Шаблоны проектирования: элементы повторно используемого объектно-ориентированного программного обеспечения.

Машинопись С. Гридера.

И много Google и YouTube.