Size: a a a

Software Design/Architecture/Zen

2021 January 28

I

Ioann_V in Software Design/Architecture/Zen
На примере выше.
источник

SP

Sergey Protko in Software Design/Architecture/Zen
Ioann_V
А типа не в ED - все держится в одном процессе? А можешь показать как?
ну не обязательно. просто тут сложный вопрос - без ивентов мы говорим о том что надо знать кого уведомлять. ООП или не ооп тут не причем.
источник

I

Ioann_V in Software Design/Architecture/Zen
ну то есть, без ивентов мы работаем напрямую с объектами?
источник

SP

Sergey Protko in Software Design/Architecture/Zen
да, мы должны знать кто. с ивентами мы можем не знать кто.
источник

I

Ioann_V in Software Design/Architecture/Zen
а с - с их интерфейсами
источник

SP

Sergey Protko in Software Design/Architecture/Zen
нет, ивенты про "я не знаю есть ли там вообще кто-нибудь кому этот ивент нужен"
источник

I

Ioann_V in Software Design/Architecture/Zen
Sergey Protko
да, мы должны знать кто. с ивентами мы можем не знать кто.
воотт, спасибо. А вообще, это ведь плохая практика знать кто - потому что тогда зависимостей больше получаем?
источник

SP

Sergey Protko in Software Design/Architecture/Zen
то есть вообще не имеем доступа к обрботчикам
источник

SP

Sergey Protko in Software Design/Architecture/Zen
Ioann_V
воотт, спасибо. А вообще, это ведь плохая практика знать кто - потому что тогда зависимостей больше получаем?
да
источник

HH

Human Human in Software Design/Architecture/Zen
Ioann_V
воотт, спасибо. А вообще, это ведь плохая практика знать кто - потому что тогда зависимостей больше получаем?
имхо тут палка о двух концах, как и почти везде.
Например усложняется поиск и разрывается связь. Иногда связи это полезно, а иногда вредно. Тут нужен баланс
источник

I

Ioann_V in Software Design/Architecture/Zen
Human Human
имхо тут палка о двух концах, как и почти везде.
Например усложняется поиск и разрывается связь. Иногда связи это полезно, а иногда вредно. Тут нужен баланс
Да. Я согласен и вот тут как раз у меня есть главный вопрос, который заставил меня во все это вмешаться.
источник

I

Ioann_V in Software Design/Architecture/Zen
Сейчас будет код, секундочку.
источник

I

Ioann_V in Software Design/Architecture/Zen
class base_main
{
public:
   virtual ~base_main()
   {
   }
   // some methods
};

class base_1 : virtual public base_main
{
   // some methods
};

class base_2 : virtual public base_main
{
   // some methods
};

class base_3 : virtual public base_main
{
   // some methods
};

class object : public base_1, public base_2, public base_3
{
   // some methods
};
Выше - эти классы пусть разбросаны по разным файлам.

Затем, в каком-то месте мы создаем объект object:

class objects_controller
{
   void create()
   {
       std::unique_ptr<object> obj;

       // ...
       
       for( auto listener : m_listeners )
           listener->object_created( obj.get()  );
   }

   std::list<object_controller_listener*> m_listeners;
};

И оповещаем подписчиков о том, что объект создан. Вопрос тут в том, что скажем у меня один из подписчиков хочет работать только с base_1 и base_2 методами, а вот другой подписчки с base_3. Скажем base_1 - это что то про рендер, base_2 - про физическое тело, base_3 - что то связанное с положением и матричными преобразованиями.

Когда я делаю:
    listener->object_created( obj.get()  );

Я не хотел бы, что бы метод object_created имел сигнатуру object_created( object* ) - такая сигнатура, заставляет подписчиков знать о объекте все, даже если подписчку нужна только какая то часть
источник

I

Ioann_V in Software Design/Architecture/Zen
Вопрос тут в том, как мне ограничить это знание?
источник

I

Ioann_V in Software Design/Architecture/Zen
Если я буду иметь такую сигнатуру:

object_created( base_main* ), то я должен буду делать dynamic_cast - run time преобразование к нужным базовым классам
источник

I

Ioann_V in Software Design/Architecture/Zen
Возможно, решением бы являлось передача внутрь objects_controller - всех заинтересованных систем, и заместо отправки сообщения, делать каак раз добавление объекта внутрь? Типа:

class objects_controller
{
   void create()
   {
       std::unique_ptr<object> obj;

       // ...
       
       m_system_render.add( obj );
       m_physic_system.add( obj );
   }

   std::list<object_controller_listener*> m_listeners;
   // Храним всех заинтересованных
};
источник

I

Ioann_V in Software Design/Architecture/Zen
Но тогда, objects_controller знает все про этих заинтересованных
источник

I

Ioann_V in Software Design/Architecture/Zen
В общем, надеюсь не сильно грузанул и все понятно описал - буду рад любым комментариям, помощи, замечаниям
источник

HH

Human Human in Software Design/Architecture/Zen
Ioann_V
Сейчас будет код, секундочку.
У тебя вопрос про типы, это лучше в соотвествующую ЯП конфу.

Похоже, что тебе нужны разные сообщения и типы соотвественно.
источник

I

Ioann_V in Software Design/Architecture/Zen
Human Human
У тебя вопрос про типы, это лучше в соотвествующую ЯП конфу.

Похоже, что тебе нужны разные сообщения и типы соотвественно.
Не, тут не про ЯП. Тут именно про дизайн, как работать с типами в С++ я знаю.  Вот последнее твое сообщение, в тему.
источник