Почему Alibaba советует разработчикам использовать наследование с осторожностью?

Java

Как многие знают, блогер недавно обновил тему - "Интерпретация руководства по Java-разработке Alibaba", эта статья - очередная статья в тему.

С первого дня изучения Java мы знаем, что Java — это объектно-ориентированный язык, а на второй день изучения Java мы знаем, что тремя основными характеристиками объектно-ориентированного языка являются: инкапсуляция, наследование и полиморфизм.

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

Почему в «Руководстве по разработке Java для Alibaba» есть оговорка: будьте осторожны при использовании наследования для расширения и отдавайте приоритет комбинированию.

В данной статье мы кратко проанализируем эти проблемы.

Объектно-ориентированная технология повторного использования

Когда все просто узнают о наследовании, у меня будет более или менее впечатление, что наследование может помочь мне добиться повторного использования классов. Поэтому многие разработчики, естественно, будут использовать наследование классов, когда им нужно повторно использовать какой-то код, потому что это написано в книге (этому учит учитель). Однако на самом деле это неправильно. Длительное интенсивное использование наследования приведет к высоким затратам на обслуживание кода.

Повторное использование упоминалось ранее, вот краткое введение в объектно-ориентированную технологию повторного использования.

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

Являясь объектно-ориентированным языком разработки, повторное использование кода является одной из привлекательных особенностей Java.Повторное использование кода Java имеет три конкретных проявления: наследование, композиция и прокси.

наследовать

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

Наследование есть отношение. Например, яблоки — это фрукты, собаки — животные, а хаски — собаки.

комбинация

Композиция отражает отношения между целым и частями и владениями.

Композиция — это отношение «имеет-отношение». Например, у автомобиля есть двигатель, у школы есть учитель и т. д.

Разница между композицией и наследованием

Во-первых, есть разница между композицией и наследованием с момента определения отношения между классами:

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

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

Кроме того, есть некоторые отличия в способе повторного использования кода:

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

Если изменится реализация базового класса, изменится и реализация производного класса. Это приводит к непредсказуемому поведению подклассов.

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

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

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

Сравнение преимуществ и недостатков

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

Почему композиция лучше наследования

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

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

Обратите внимание, что это не означает, что наследование вообще бесполезно, предыдущее утверждение [в той же допустимой ситуации]. В некоторых сценариях по-прежнему необходимо использовать наследование, или оно более подходит для использования наследования.

Кроме того, в дополнение к «Руководству по разработке Java для Alibaba» во многих других материалах также есть введения и ограничения использования по композиции и наследованию:

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

Наследование уместно только тогда, когда подкласс действительно является подтипом суперкласса. Другими словами, для двух классов А и В класс В должен продолжать класс А только в том случае, если между ними действительно существует отношение «есть». «Эффективная Java»