Как организовать множество абстрактных классов в переносимом фреймворке (библиотеке)? Задача:
Требуется реализовывать несколько различных проектов, которые используют схожий функционал (логика, данные), за исключением некоторых расширений со стороны каждого проекта.
Одно из решений: вынести общий абстрактный функционал в библиотеку, и подключать её к каждому проекту.
Но по мере совмещения всё более новых проектов с этой библиотекой, становится ясно, что вынесенный ранее абстрактный функционал недостаточен и требует тонкой настройки.
Пример:
Есть 3 компании, у которых по разному организованы связи групп сотрудников, но есть общий функционал: увольнение, повышение. Выносим в абстрактный класс библиотеки основные функции. Но оказывается, что у компании №1 группы сотрудников должны быть выстроены по иерархии (один отдел вложен в другой), но компании №2 не нужна вложенность. Если вложенность сотрудников реализовывать в общем функционале, она в некоторых проектах вообще не будет использована. Можно сделать другой класс в библиотеке, который наследуется от основного функционала и расширяет его функционалом вложенности для групп сотрудников. Но а вдруг потребуется множество подобных расширений одного абстрактного класса? А если одно расширение исключает другое?
К тому же, если фреймворком (библиотекой) захотят воспользоваться люди из другой компании, у которых есть вложенность групп сотрудников, но нет функционала увольнения, то как быть тогда? Ведь в библиотеке уже реализованы абстрактные классы с функционалом увольнения.
Одна из сторон вопроса: Как можно реализовать удобную и широкую библиотеку, не зная деталей проектов, которые будут с ней работать, но зная их общую концепцию?

21 Авг 2019 в 07:02
195 +1
0
Ответы
1

Для организации множества абстрактных классов в переносимом фреймворке (библиотеке) можно использовать принципы SOLID, а также паттерны проектирования, такие как стратегия, компоновщик, декоратор и т.д.

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

Другой подход - использование паттерна "Фасад", который позволяет скрыть сложность библиотеки и предоставить простой интерфейс для взаимодействия с ней. В этом случае каждый проект может использовать только необходимые методы и функционал через фасад, не вдаваясь в детали реализации библиотеки.

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

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

20 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 436 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир