Копирование слушателей / наблюдателей в конструктор копирования - PullRequest
4 голосов
/ 20 ноября 2008

Я программирую класс, который реализует наблюдаемый шаблон (не интерфейс), и я думаю о том, должен ли конструктор копирования также копировать слушателей.

С одной стороны, конструктор копирования должен создать экземпляр, максимально приближенный к исходному экземпляру, чтобы его можно было заменить в контексте отображения.

С другой стороны, это предполагает, что слушатели могут справиться с подобными вещами.

Есть мысли? Есть ли лучшие практики?

Ответы [ 4 ]

5 голосов
/ 20 ноября 2008

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

3 голосов
/ 21 ноября 2008

Ответ , это зависит от того, что вы хотите, чтобы произошло .

Технически вы можете сделать три вещи:

  1. Ничего не копировать. Любые наблюдатели ничего не будут знать о новом объекте.
  2. Пусть новый объект добавит себя в список того, что наблюдают старые наблюдатели. Существующие наблюдатели будут реагировать на новый объект так же, как и на старый.
  3. Создайте новых наблюдателей, которые будут наблюдать новый объект, так же, как старые сделали старый объект. Новые наблюдатели будут реагировать на изменения в новом объекте так же, как старые реагировали на старый объект.

Другие авторы, безусловно, правы, что 1), вероятно, будет предпочтительным вариантом, хотя бы потому, что выполнение 2 или 3 в конструкторе копирования означает, что наблюдатели всегда создаются / копируются. Бездействие позволяет добавлять наблюдателей позже, если это необходимо.

Однако можно представить случаи, когда другие варианты верны. Если вы хотите, чтобы наблюдатель отвечал на любой экземпляр данного класса, независимо от того, как он был создан, то 2) является правильным. Если ваш наблюдатель выполняет определенную задачу для объекта и не заботится об остальной части системы, тогда 3) может быть правильным.

Часто лучше подумать о том, как работает ваша система, чем просто следовать правилу. Если это не ваш код, который вы изменяете, спросите владельца. А если вы просто не знаете, чего хотите, выберите 1) и добавьте наблюдателей позже.

1 голос
/ 20 ноября 2008

Я бы предпочел не копировать слушателей .

Слушатели были зарегистрированы на исходном объекте, а не на копии - если вы решите использовать конструкторы копирования в качестве основы для шаблона прототипа, то в итоге вы получите тех же слушателей, которые прослушивают практически каждый объект в системе.

Однако : как и во всех этих типах проблем, начните с минимума (то есть не копируйте), а затем посмотрите, как вы справляетесь. Если вы обнаружите, что повторяете один и тот же фрагмент кода сразу после создания объекта, каждый раз, когда вы используете этот конструктор (скажем, более 3-4 раз), то пересмотр этого решения может быть плодотворным.

0 голосов
/ 20 ноября 2008

Не копировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...