При наличии сигналов в классе считается ли хорошей практикой выставлять сам сигнал в классе «интерфейс»?
class MyClass
{
public:
boost::signals2::signal<void()>& SomethingHappened()
{
return m_Signal;
}
private:
boost::signals2::signal<void()> m_Signal;
};
Я видел людей, которые пишут функции «register» (и, возможно, «unregister»):
class MyClass2
{
public:
boost::signals2::connection RegisterHandler(std::function<void()>& handler)
{
return m_Signal.connect(handler);
}
private:
boost::signals2::signal<void()> m_Signal;
};
Я бы предпочел первый подход, потому что я не хочу ограничивать пользователей моего класса функциями, которые я предлагаю. Однако есть ли веская причина предпочесть второй подход?
Второй вариант не очень хорош: вы не позволяете звонящему использовать механизм отслеживания сигнала.
Но если вы замените function
с your_signal::slot_type
(или событие лучше, your_signal::extended_slot_type
), это обеспечит лучшую инкапсуляцию, чем 1-й вариант. В частности, это предотвратит злоупотребление вызывающими абонентами (или злоупотребление) m_Signal
, как это:
SomethingHappened().disconnect_all();
Других решений пока нет …