Лучшая альтернатива глобальным переменным MATLAB - PullRequest
10 голосов
/ 10 января 2012

Я пишу MATLAB приложение, которое имеет множество функций, распределенных по разным файлам.У меня есть регистратор, который представляет собой структуру с указателем на функцию, и я использую его для регистрации информации, которую должен увидеть пользователь (то есть какая функция выполняется в данный момент, результаты вычислений и т. Д.).Причина, по которой я использую структуру для своего регистратора, а не просто fprintf(), заключается в том, что в будущем я мог бы легко заменить его на регистратор XML, регистратор HTML и т. Д.

Поскольку мой код состоит из множества функцийвызывая друг друга, я объявил свою структуру логгера как глобальную, поэтому мне не нужно передавать ее всем моим многочисленным функциям.Однако везде, куда бы я ни посмотрел, я вижу, что глобальные переменные являются воплощением зла в MATLAB и значительно замедляют мою программу.

Есть ли способ сделать переменные доступными для файлов, не обязательно передавая их в качестве входных параметров и не причиняя вреда?от сурового штрафа за производительность?

Ответы [ 2 ]

10 голосов
/ 10 января 2012

Вы также можете использовать ключевое слово persistent внутри файла и разместить там регистратор.
В некотором смысле это похоже на ключевое слово static в C ++. Это также реализация шаблона Singleton .

function CallLogger(st)
    persistent logger;
    if isempty(logger)
        %Allocate new logger
    end
    logger.disp(st);
end

Это лучше, чем глобальный, потому что
1. Никто не может уничтожить ваш логгер без вашего ведома.
2. Никто даже не знает об этом объекте, потому что он ограничен областью действия

Кстати, я не согласен с тем, что во всем мире есть проблемы с производительностью. Это просто не очень хорошая практика с точки зрения разработки программного обеспечения.

2 голосов
/ 13 января 2012

Лучше, чем вызывать постоянные переменные в функции (которая, например, не будет сохранена, если вы сохраните, а затем перезагрузите свое рабочее пространство), было бы перейти от функции + структура к объекту: то есть вы должны посмотреть в MATLABобъектно-ориентированное программирование.

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