Что такое удобный способ обмена коллекциями переменных между функциями? - PullRequest
0 голосов
/ 22 февраля 2020

Я хочу написать скрипт experiment.m, который будет вызывать сложную функцию с именем encoder(...). encoder будет включать множество настроек, которые experiment.m будет выбирать во время выполнения. В какой-то момент в experiment.m настройки, которые будет использовать encoder, будут созданы как переменные (в этом примере их две, в реальной жизни могут быть десятки):

blocklength = [some derivation];
bitdepth = [some derivation];

Я создаю структуру который хранит эти значения под своими именами:

encoder_settings = struct();
    encoder_settings.blocklength = blocklength;
    encoder_settings.bitdepth = bitdepth;

И я пишу свою функцию кодера следующим образом:

function encoder_out = encoder(data, encoder_settings)
    blocklength = encoder_settings.blocklength;
    bitdepth = encoder_settings.bitdepth;

    [...]
end

Это прекрасно работает для кода средней сложности, но через некоторое время становится трудно поддерживать блоки create-struct / load-struct.

Альтернативы, которые я могу придумать, тоже не кажутся хорошими:

  • encoder обычно очень сложен, и вызов переменных непосредственно из структуры в его теле делает код трудным для понимания. прочитайте.
  • Сделайте это динамически, используя eval, как это:
for s = fieldnames(my_struct)' eval([s{:},' = my_struct.', s{:}, ';']); end

1 Ответ

1 голос
/ 22 февраля 2020

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

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

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

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