MATLAB全局变量的最佳替代方案

10
我正在编写一个 MATLAB 应用程序,它有许多函数分布在不同的文件中。我有一个记录器,它是一个带有函数指针的结构体,我使用它来记录用户可以看到的信息(即当前执行的函数、计算结果等)。我使用结构体作为我的记录器,而不是简单的 fprintf(),是因为将来我可以轻松地将其替换为 XML 记录器、HTML 记录器等。

由于我的代码由许多相互调用的函数组成,所以我将我的记录器结构声明为全局变量,这样我就不必将它传递给所有的函数。然而,无论我看哪里,我都会看到全局变量在 MATLAB 中是邪恶的化身,并且会严重减慢我的程序速度。

有没有一种方法可以在文件之间共享变量,而不必将它们作为输入参数传递,并且不会遭受严重的性能损失?


全局变量并不是“邪恶”的。如果你不是一位经验丰富的程序员,它们可能会创建许多错误,例如过载其他变量等。此外,我不认为在Matlab中使用全局变量会影响性能。如果使用全局变量可以使您的生活变得“极其”轻松,请使用它们。只是尽量不要养成习惯。 - Jorge
1
@Jorge 任何程序员,不仅仅是那些缺乏经验的人。但除此之外,没错。 - George Mauer
@Jorge - 你在使用全局变量和将变量传递给方法时的标准是什么? - dzisner
你可以看看使用应用程序数据。我只在制作 GUI 时使用过它,但在其他情境下也可能有用。 - Chris
2个回答

10

你还可以在文件内使用 persistent 关键字,然后在那里分配日志记录器。
它在某些方面类似于 C++ 中的 static 关键字。 它也是实现了 Singleton 模式。

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

与全局变量相比,它更好的地方在于:
1. 没有人能在您不知情的情况下销毁您的日志记录器。
2. 没有人甚至知道这个对象的存在,因为它仅限于函数作用域。

顺便说一下,我不同意全局变量存在性能问题。从软件工程的角度来看,这只是不良实践。


嗨@Andrey,我认为持久变量相当于C/C++中的“静态”变量,所以它们只存在于函数作用域内而不跨越函数,是吗? - dzisner
谢谢Andrey,你的回答很棒。我决定尽可能远离全局变量,既符合良好的编程习惯,也有助于提高性能。谢谢! - dzisner

2
比在函数中调用持久变量(例如,如果您保存然后重新加载工作区,则不会保存)更好的方法是从函数+结构移动到对象:也就是说,您应该研究MATLAB的面向对象编程。

你是指创建一个继承MATLAB句柄类的新类吗? - wherestheforce

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接