Преимущество использования прослушивателей событий по сравнению с обратными вызовами функций в Matlab - PullRequest
1 голос
/ 09 июля 2020

Примечание : вопрос здесь специально для случая Matlab!

Контекст этого вопроса - класс дескриптора Matlab, который получает некоторые данные через веб-сокет, выполняет некоторую обработку к этим данным, а затем пересылает данные некоторым другим классам, которые зарегистрировались с помощью обратных вызовов.

Упрощенная версия этого класса приведена ниже:

classdef ReceiverWebsocket < WebSocketClient

  properties (Access = private)
    dataReceivers_ % Stores the callback functions and their desired rate
  end

  methods

    function obj = ROSReceiverWebsocket(TOPIC, URI, varargin)
      obj = obj@WebSocketClient(URI, varargin{:});

      obj.dataReceivers_ = containers.Map;
    end

    function registerReceiver(obj, name, rate, callback)
      cb.name = name;
      cb.callback = callback;
      
      obj.dataReceivers_(name) = cb;
    end
    
    % Implement the abstract callback functions
    function onTextMessage(obj,message)
      data = jsondecode(message);

      for key = keys(obj.dataReceivers_)

        cb = obj.dataReceivers_(cell2mat(key));
        cb.callback(data);

      end
    end
    
  end
end

При исследовании того, как реализовать такие функциональность в Matlab, я также столкнулся с концепцией слушателей событий и уведомителей в Matlab .

Из этого я понимаю, что можно повторно реализовать функциональность, представленную выше, используя дескриптор - class, а затем вызовите notify(...) в функции onTextMessage(...) вместо прямого вызова функций обратного вызова.

У меня вопрос, есть ли:

  • какие-либо преимущества использования функции прослушивателя событий по сравнению с прямыми обратными вызовами?
  • какие-либо недостатки использования прямых обратных вызовов?

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

1 Ответ

0 голосов
/ 10 июля 2020

Как всегда, это зависит от вашего варианта использования.

Лично я думаю, что главное преимущество использования событий состоит в том, что вы можете иметь несколько слушателей, запускаемых одним событием (без дополнительного кодирования для вас, см. здесь для примера: https://mathworks.com/matlabcentral/answers/13305-can-timers-trigger-a-single-event-that-many-objects-listen-to).

Это также позволяет вам иметь обратные вызовы с потенциально разными списками аргументов, тогда как в вашем примере функция обратного вызова должна принимать только один аргумент, данные .

Что касается порядка выполнения (https://de.mathworks.com/help/matlab/matlab_oop/callback-execution.html#bu0b2f4):

Порядок, в котором функции обратного вызова слушателей выполняются после срабатывания события, не определен. Однако все обратные вызовы слушателя выполняются синхронно с запуском события.

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