Исходная задача - проекты исполнителей и заказчиков. Представьте ситуацию. У вас есть 3 роли - Заказчик, Исполнитель, Администратор, Все 3 роли имеют свой профиль, а также работают с некой сущностью проект.
Вам нужно выводить для каждой роли Список доступных ему проектов, страницу проекта, а также дать возможность редактирования своих данных.
Как вы сделаете разбиение по компонентам.Самое простое, что напрашивается - реализовать для всех ролей:
Всего 3 компонента, которые все обслуживают. Красота.
Если думать с точки зрения того, кто создает это и пытается уменьшить свои трудозатраты, то возможно.
С точки зрения того, кто это будет потом поддерживать и развивать - это ужасное решение.
Почему это решение плохое:
Важно сразу учитывать, как будет развиваться компонент. Например, попробовать предсказать развитие формы проекта для Заказчика - что там может добавиться, что измениться.
Что очевидно - формы для Заказчика, Исполнителя и Администратора будут развиваться совершенно по-разному.Если бы у нас была еще роль Модератор, то скорее всего можно предположить, что форма будет примерно одинаково развиваться с Администратором.
Предлагаю сделать такое разбиение:
Изначально это кажется избыточным и сложным. Но именно это рождает простоту дальнейшей поддержки и развития проекта.Даже если какие-то формы на начальном этапе очень похожи (например, профиль Заказчика и Исполнителя), в будущем они "разойдутся" в разные стороны.Какие минусы этого решения: надо создать больше компонентов.
А теперь про плюсы (по аналогии со списком выше):
В данном примере да, но в общем случае нужно рассуждать исходя именно из будущих изменений и функций блока для конкретной роли.
В каких случаях делать компонент X отдельно для ролей A и B:
В каких случаях можно делать один компонент на двоих:
В целом, вопрос только в будущих причинах изменения компонента. Например, в системе бух захотел изменить что-то в своем интерфейсе. А это затрагивает почему-то формы в кабинете Клиента - это не очень хорошо. В идеале это должно влиять только на формы буха и не трогать "чужие" компоненты.
Важно. Не стоит думать, что, если вы создали 2 очень похожих формы для разных ролей, которые будут развиваться по-разному - это дублирование кода. Это не разные объекты в системе, и у каждой свой путь развития. В целом, и человек на ранней стадии не сильно отличается от других животных, но это не значит, что это одно и то же. Стол и стул - дублирование? Нет. Они чем-то похожи, но у них разное назначение, и развились они исторически по-разному. Вполне возможно в допотопные времена они изначально были очень похожи, а потом постепенно стали изменяться под возникающие потребности.
Разделение на компоненты не должно вызывать дублирование кода в плане типовых действий. Их можно вынести в отдельные функции или хранимые процедуры (если мы говорим про SQL).
Читайте подробнее про качество кода программы.
Также некие дополнительные возможности для отдельных ролей можно просто добавлять как доп компонент. К примеру, форма проекта для Модератора и Администратора может быть одна. Но у Админа есть на форме еще дополнительные формы и таблицы для более плотного управления (и эти таблицы, формы уже доступны только Админу).
Подобный подход значительно упростит поддержку системы.
Универсальный подход только в теории выглядит красиво, на практике поддерживать такой проект с кучей универсальных монстр-компонентом - это хождение по минному полю.
Данное решение критически важно для проекта, т.к. именно оно определяет в дальнейшем насколько сложно будет поддерживать проект, насколько хрупким оно будет.В некоторых случаях сверх универсальные компоненты после ряда правок в рамках сопровождения в итоге приходят к тому, что их надо переписывать - компонент стал очень сложным и трудно поддерживаемым.
Принимайте правильные решения, и это упростит ваш продукт, а значит уменьшит расходы на сопровождение в перспективе.
Источник: https://falconspace.ru/blog/naskolko-dolzhen-byt-universalnym-komponent-v-programmnom-produkte