Сигналы и слоты могут увеличить сцепление
Итак, сигналы и слоты допускают слабую связь между объектом и методом с другим объектом и его методом. Это хорошо, но эти объекты сигнальных слотов существуют как открытые члены родительского класса, и поэтому их экспонирование подрывает слабую связь для создания тесно связанного кода. Это скорее негативная вещь. Разве сигналы не должны быть частными, чтобы родительский класс обрабатывал подключение / отключение сигнала?
1 ответ
Ну, что-то нужно знать, что когда eventFoo
случается на ObjectA
, handlerBar
на ObjectB
должен быть вызван.
В простейшей реализации без делегатов эта ответственность лежит на ObjectA
, который вызывает ObjectB->handlerBar
в его eventFoo
тело. Это требует, чтобы знать о ObjectB
и знать, что ObjectB->handlerBar
это правильная вещь, чтобы позвонить. ObjectB
напротив, не нужно знать о ObjectA
,
В одном методе использования сигналов и слотов ответственность лежит на ObjectB
, Он несет ответственность за регистрацию его handlerBar
в качестве обработчика для eventFoo
сигнал. Так что нужно знать о ObjectA
, но ObjectA
не нужно знать о ObjectB
,
В другом методе ObjectB
разоблачений handlerBar
как слот, и какой-то другой код соединяет eventFoo
в handlerBar
, Этот "другой код" должен знать об обоих ObjectA
а также ObjectB
, но ни один не должен знать о другом.
Поэтому, когда кто-то говорит о сигналах и слотах, уменьшающих связь, они имеют в виду, что объекты, генерирующие события, и объекты, обрабатывающие события, больше не связаны явно друг с другом, в том смысле, что одной из их обязанностей является поддержание этой связи. Вместо этого связывание выполняется отдельным фрагментом кода, который отвечает за связывание и который не зависит от остального интерфейса объектов.
Итак, вы упомянули "родительский класс", что заставляет меня думать, что вы думаете с точки зрения ситуации, когда один из классов уже связан с другим. В этой ситуации общедоступные сигналы и слоты являются менее выигрышными с точки зрения уменьшения связи.