Здравствуйте, Кодёнок, Вы писали:
Кё>Если говорить о системах с GC, должна ли операция добавления обработчика к событию
Кё>Кё>b.signal += a.slot
Кё>
Кё>создавать сильную или слабую ссылку на a? (сильная — значит b держит a, пока не сделают -= или их не подберет GC; слабая — при сборке `a` соединение само собой разорвется).
Мне кажется, что здесь общего принципа быть не может. Основной вопрос — если слот завершается или должен быть отключен, кто именно это контролирует? Если предусмотрен явный контроль этого (и он надёжен), можно использовать сильную ссылку. Если нужно явно вводить логику "не отключать до красного свистка" — то же самое. Но если контроля нет или есть настроение поставить вопрос "на самотёк" — можно использовать слабые, только не забывать их удалять (если автоудаления нет).
Достаточно чёткий случай для слабой ссылки был у меня в B2BUA. К менеджеру транзакций подписываются получатели запросов с конкретным call-id. Получатели — объекты диалогов. "Сигналы" соответствуют call-id'ам. Если диалог завершается, кто-то должен вынести его из списка подписчиков call-id. Структура этого всего — словарь с элементами — списками ссылок. Если ссылка сильная и что-то в удалении диалога происходит не так — диалог не доходит до кода выноса себя из подписки, и остаётся постоянная ссылка на него. Слабые ссылки тут пока не сделал, но планирую: что бы ни происходило при завершении диалога, он не останется висеть в памяти.
(К слову, "что бы ни происходило" тут — ключевой элемент: программа строится так, чтобы всевозможные ошибки, которые таки будут, ломали максимум тот звонок, в котором они сработали. На одновременные с этим звонки и последующие не должно быть влияния. Поэтому, накопление "мусора" тут недопустимо.)
Кё>Какие есть большие системы, реализованные обоими способами?
Какой критерий большой системы?;))