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

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

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

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

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

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

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

20 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир