В классе получается много подсистем с парой функций на каждую. Соответсвенно, беспокоит подобный рост в плане красивости дизайна.
Как возможные варианты:
1) Оставить все как есть — пусть растет себе
2) Разнести по интерфейсам и сделать наследование
3) Разнести по интерфейсам и агрегировать
4) Развернуть зависимость и вынести подсистемы на уровень выше
Свой вариант?
Здравствуйте, pva, Вы писали:
pva>1) Оставить все как есть — пусть растет себе pva>2) Разнести по интерфейсам и сделать наследование pva>3) Разнести по интерфейсам и агрегировать pva>4) Развернуть зависимость и вынести подсистемы на уровень выше pva>Свой вариант?
Думаю, ни один из вариантов не поможет, т.к. такой дизайн является следствием неправильной группировки и неправильного определения обязанностей классов. В качестве выхода, на мой взгляд, можно сначала четко описать обязанности этих классов, а затем по-новому их сгруппировать.
Здравствуйте, Кирилл Лебедев, Вы писали:
КЛ>Думаю, ни один из вариантов не поможет, т.к. такой дизайн является следствием неправильной группировки и неправильного определения обязанностей классов. В качестве выхода, на мой взгляд, можно сначала четко описать обязанности этих классов, а затем по-новому их сгруппировать.
В данном случае обязанности таковы.
User Profile — персональная информация пользователя
— Statistics — статистическая информация по действиям данного конкретного пользователя
— Shopping — корзина пользователя
...
Может я чего-то не вижу, но думал, что предложенными вериантами охватываются все возможные изменения. Покажете луч света в этом царстве?
Здравствуйте, Aviator, Вы писали:
A>А в чём всё-таки собственно суть проблемы?
При первом варианте получаем перенасыщенные интерфейсы и реализации, во втором — реализации, в третьем — рост в глубину и конструкции вида moduleManager().Module1().Module12().Function1(), в четвертом — расширение родительских интерфейсов за счет публикации в них интерфейсов подсистем + дополнительные параметры для утраченной связи.
Проблема в том, что мне кажется четвертый вариант был бы наиболее предпочтителен, но не нравится множество мелких автономных подсистем.
Здравствуйте, pva, Вы писали:
pva>В данном случае обязанности таковы. pva>User Profile — персональная информация пользователя pva> — Statistics — статистическая информация по действиям данного конкретного пользователя pva> — Shopping — корзина пользователя
Так это не обязанности. Это просто данные. А обязанности — это все-таки действия. Например:
Регистрация нового пользователя.
Аутентификация зарегестрированного пользователя.
Отображение перечня доступных товаров.
Выбор товара.
Оценка стоимости отобранных товаров.
Проверка наличия товара на складе.
Помещение списка заказа на обработку.
Идентификация предпочтений пользователя.
Автоматический подбор товаров в соответствии с предпочтениями пользователя.
И т.д.
Вот это все — обязанности. Вот их можно разносить по модулям. А вот распределять по разным модулям просто данные, которые, к тому же, могут быть использованы для реализации разных обязанностей, смысла не имеет. Хотя бы потому, что потом для реализации этих обязанностей Вам потом придется обращаться к разным модулям. И возникнет путаница.
Здравствуйте, pva, Вы писали:
pva>Проблема в том, что мне кажется четвертый вариант был бы наиболее предпочтителен, но не нравится множество мелких автономных подсистем.
Не очень понял .
а). Какой смысл в данной конструкции?
class IModule1 {
virtual IModule11& Module11() = 0;
...
};
б). При чём тут class IUserProfile?
в). Правильно ли я понимаю, что имеется в наличие несколько точек расширения системы, характеризующихся своими интиерфейсами? Таким образом, для того что бы добавить свобю реализацию подсистемы, достаточно написать реализацию соответсвующего интерфейса и каким-то образом объяснить системе, какой конкретный экземпляр класса, реализующего интерфейс, надо подгружать?