При разработке мероприятия, стоит ли предотвращать добавление слушателей дважды? - PullRequest
3 голосов
/ 14 июня 2010

Я создаю API на основе событий, где пользователь может подписаться на событие, добавляя объекты слушателя (как это обычно бывает в Java или C #). Когда событие инициируется, все подписанные слушатели вызываются с информацией о событии.

Сначала я решил не добавлять прослушиватель событий более одного раза. Если добавляется прослушиватель, который уже существует в коллекции прослушивателей, он не добавляется снова. Однако, подумав об этом еще раз, кажется, что большинство структур, основанных на событиях, на самом деле этого не предотвращают. Был ли мой первоначальный инстинкт неправильным? Я не уверен, куда идти. Я думаю, я думал, что предотвращение добавления существующего слушателя поможет избежать распространенной ошибки программирования. С другой стороны, он также может скрывать ошибку, которая приводит к многократному запуску кода, а это не так.

Ответы [ 3 ]

2 голосов

Я согласен с Хенком, но опять же, проще отменить регистрацию обратного вызова, если есть только один из них. В противном случае вы либо должны указать, что последний или первый будет удален, либо он произвольный. Класс Observable в Java работает следующим образом, если Observer уже есть в списке, addObserver с этим Observer не используется. С другой стороны, в своем коде Python я просто удаляю последнюю копию наблюдателя из списка и разрешаю дубликаты. Я просто никогда не нашел хорошего варианта использования, который зависит от любой стратегии.

2 голосов
/ 14 июня 2010

Я бы предположил , что большинство систем событий просто не беспокоятся. Это требует определенных усилий для обнаружения и блокировки дубликатов, и только очень (очень) редко кто-то случайно попытается объявить событие более одного раза. Делать это нарочно также редко, но это может быть допустимо.

Так зачем блокировать редкое, но допустимое использование, чтобы предотвратить еще более редкую ошибку?

Короче говоря, я думаю, что ваша "общая ошибка программирования" не очень распространена.

1 голос
/ 22 июня 2010

Я ценю ответы, которые были даны, но я думаю, что просто сделаю так, чтобы один и тот же слушатель не был добавлен более одного раза.Java Observable ведет себя таким образом, и я использую CopyOnWriteArrayList в качестве резервной коллекции для слушателей, у которых уже есть это (addIfAbsent()).Просто кажется менее вероятным, что кто-то действительно захочет добавить одного и того же слушателя несколько раз, и легко добиться того же поведения, создавая другого слушателя или используя итерацию в том же слушателе.Я могу понять аргументы в пользу разрешения дубликатов (отсюда и мои сомнения), но недостаточно сильно, чтобы их заменить.

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