【问题标题】:Best alternative to MATLAB's global variablesMATLAB 全局变量的最佳替代方案
【发布时间】:2012-01-10 18:33:41
【问题描述】:

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

由于我的代码由许多相互调用的函数组成,我将我的 logger 结构声明为全局的,因此我不必将它传递给我的所有函数。但是,无论在哪里,我都发现全局变量在 MATLAB 中是邪恶的化身,会大大降低我的程序速度。

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

【问题讨论】:

  • 全局变量不是“邪恶的”。如果您不是经验丰富的程序员,它们只会产生许多错误,例如重载其他变量等。此外,我不相信 Matlab 中的全局变量会影响性能。如果使用全局变量让你的生活“非常”轻松,那就使用它们。尽量不要让它成为一种习惯。
  • @Jorge 任何程序员,不仅仅是没有经验的程序员。但除此之外,是的。
  • @Jorge - 您使用全局变量与将变量传递给方法的标准是什么?
  • 你可以看看使用application data。我只在制作 GUI 时使用过它,但它在其他情况下也可能有用。

标签: performance matlab global-variables


【解决方案1】:

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

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

它比全局更好,因为
1. 没有人可以在您不知情的情况下破坏您的记录器。
2. 甚至没有人知道这个对象,因为它仅限于函数范围

顺便说一句,我不同意 global 存在性能问题。就软件工程而言,这不是一个好的做法。

【讨论】:

  • 嗨@Andrey,在我看来,持久变量相当于C/C++ 中的“静态”变量,所以它们只存在于函数范围内,而不存在于函数之间,对吧?
  • 谢谢安德烈,你的回答很棒。为了良好的实践和表现,我决定尽可能远离全局变量。谢谢!!
【解决方案2】:

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

【讨论】:

  • 你是指新建一个继承MATLAB句柄类的类吗?
猜你喜欢
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 2018-01-07
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多