如何在项目深处使用多个常量?

How to use several constants deep down a project?

我的问题很容易通过创建一个结构并将其用作全局变量来解决,但正如我听说应该避免使用全局变量一样,我想知道优雅的替代方法。所以问题是:

想象一长串始终保持不变的数组,这些常量仅在项目中很深的函数中使用,就像想象以下序列:
main -> 调用 a -> 调用 b -> ... -> 调用需要常量的 n..

所以我想:

  1. 在 main 中创建一个结构并将其设置为全局(我正在寻找替代方案)。
  2. 创建一个结构并将其作为参数传递给不同的子例程,但它们在 a,b,...,n-1 中什么都不做。这增加了我不喜欢的 99% 函数中的无用参数列表。
  3. 直接在第 n 个函数中创建常量,但这意味着创建这些变量 1000 次,假设我的函数 n 在 运行 中被调用 1000 次,这听起来很愚蠢,因为它们是常量。

我遇到的另一个问题与此类似。
我想知道如何从 FORTRAN 中执行类似 common// 的操作,因为我可能想在有限数量的子例程 (~10%) 之间共享通用(可变)值,但它们在 90% 的子例程中是无用的。

PS: 全局变量还有一个问题,当项目变大时,我可能会在不知情的情况下重复一些变量名。

您应该在内部函数中计算值并将它们存储在 persistent variables 中。

要在一小组相关函数之间共享值,您可以将这些函数定义为子函数(在同一个 m 文件中)。父函数中定义的变量在子函数中可见。

--

编辑:

查看链接页面中的示例:

function arrayToXLS(A, xlsfile, x1, x2)
persistent dblArray;

if isempty(dblArray) 
    disp 'Writing spreadsheet file ...'
    xlswrite(xlsfile, A);
end

disp 'Reading array from spreadsheet ...'
dblArray = xlsread(xlsfile, 'Sheet1', [x1 ':' x2])
fprintf('\n');

您声明了持久变量。第一次调用该函数时,它是一个空数组。因此,您的函数必须检查变量是否使用 isempty 设置,如果尚未设置,它可以计算存储在变量中的值。

您可以使用三种方法:

1) 传递常量结构作为参数。这更健壮。为结构使用短名称,如 'C',这样它不会在代码中占用太多 space。

2) struct C 是在带有持久变量的函数内部创建的:

function [ C ] = GetConstants()
    persistent Consts
    if isempty(Consts)
        C = struct;
        %System
        C.MAX_USERS=160;
        Etc;
        C=orderfields(C);
        Consts=C;
    else
        C=Consts;
    end
end

3) 两种方法都使用,在主程序中使用 C 作为参数(当然,使用 C = GetConstant() 加载它)。在非常深入或非常罕见的访问函数中直接使用 GetConstants()。

4) 不要为此使用全局变量。常量应该是访问速度最快的内存,而不是最慢的。