Как избежать безумия наследования

Итак, у меня есть API, который мне нужно внедрить в существующую структуру. Этот API управляет взаимодействием с внешним сервером. Мне было поручено придумать способ создания легко повторяемого «шаблона», чтобы, если люди работают над новыми проектами в данной структуре, у них было простое решение для интеграции API.

Моя первая идея состояла в том, чтобы создать класс для вашего «основного» класса фреймворка, чтобы расширить его, предоставить все виртуальные функции, необходимые для взаимодействия с API. Однако мой босс наложил вето на это, так как существующая структура является «тяжелой по наследству», и он не хочет добавлять безумие. Я, очевидно, не могу инкапсулировать свой API, потому что это то, что должен делать сам API, и это может скрыть функциональность.

Если не просить разработчиков фьючерсов скопировать и вставить мой пример, что мне делать?

Можете ли вы опубликовать какой-нибудь псевдокод, чтобы прояснить ваш вопрос?

Michael Kristofik 19.12.2008 00:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
332
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Если ваш босс враждебно настроен по отношению к наследованию, попробуйте агрегирование. (Отношения Имеет, а не отношения наследования это.) Предполагая, что вы взаимодействуете с рассматриваемым API через объект, возможно, вы можете просто сохранить этот объект в свойстве своего «основного» класса фреймворка, чтобы взаимодействовать с ним как с main->whateverapi->doWhatever(). Если API не является объектно-реализованным или вам нужно загрузить в него множество функций, специфичных для вашей среды, это указывает на создание вашего собственного класса, который входит в эту роль и относится к стороннему API, как бы это ни было необходимо. Да, это в основном означает, что вы создаете API для API. Однако агрегирование позволяет избежать проблемы с функциональностью маскирования; даже если вам нужно создать промежуточный уровень, вы можете предоставить исходный API как main->yourobject->originalapi и не беспокоиться о том, что наследование все испортит.

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

Alex 19.12.2008 01:01

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

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

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

Также по связанной теме см. Мой ответ на «Чем отличаются шаблоны прокси, декоратора, адаптера и моста?» для уточнения других шаблонов проектирования «оболочки».

Другие вопросы по теме