Oop 相依性的MATLAB惰性评价

Oop 相依性的MATLAB惰性评价,oop,matlab,properties,lazy-evaluation,accessor,Oop,Matlab,Properties,Lazy Evaluation,Accessor,我有一个类,它有一些依赖的属性,但我只想计算一次 我刚刚得出结论,在MATLAB中对依赖类属性使用惰性求值要么是不可能的,要么是个坏主意。最初的计划是为每个需要更新的(公共)属性设置一个私有逻辑标志,并让构造函数将其设置为true。然后,当调用属性访问器时,它将检查该标志并计算值,只有在需要时才将其存储(在另一个私有属性中)。如果该标志为false,它将只返回缓存值的副本 我认为困难在于对属性访问器的限制,也就是说,它们不处理其他不相关的属性。换句话说,get.property(self)方法不

我有一个类,它有一些依赖的属性,但我只想计算一次

我刚刚得出结论,在MATLAB中对依赖类属性使用惰性求值要么是不可能的,要么是个坏主意。最初的计划是为每个需要更新的(公共)属性设置一个私有逻辑标志,并让构造函数将其设置为true。然后,当调用属性访问器时,它将检查该标志并计算值,只有在需要时才将其存储(在另一个私有属性中)。如果该标志为false,它将只返回缓存值的副本

我认为困难在于对属性访问器的限制,也就是说,它们不处理其他不相关的属性。换句话说,get.property(self)方法不能更改self对象的状态。有趣的是,在我目前的课堂上,这种方法失败了。(即,在get.方法中既没有设置更新标志也没有设置缓存的计算结果,因此每次都会运行昂贵的计算)

我怀疑将lazy属性从公共依赖属性更改为具有公共GetAccess但具有私有SetAccess的方法是可行的。然而,我不喜欢以这种方式欺骗属性约定。我希望只有一个“lazy”属性可以为我完成所有这些

我错过了什么明显的东西吗?MATLAB中依赖类属性的访问器方法是否禁止更改类实例的状态?如果是这样的话,那么定义具有私人副作用的访问器是获得我想要的行为的最不邪恶的方式吗

编辑:这里有一个测试类

classdef LazyTest
  properties(Access = public)
    % num to take factorial of
    factoriand
  end

  properties(Access = public, Dependent)
    factorial
  end

  properties(Access = private)
    % logical flag
    do_update_factorial
    % old result
    cached_factorial
  end

  methods
    function self = LazyTest(factoriand)
      self.factoriand = factoriand;
      self.do_update_factorial = true;
    end
  end

  methods
    function result = get.factorial(self)
      if self.do_update_factorial
        self.cached_factorial = factorial(self.factoriand);
        % pretend this is expensive
        pause(0.5)
        self.do_update_factorial = false
      end
      result = self.cached_factorial;
    end
  end
end
用它运行

close all; clear classes; clc

t = LazyTest(3)
t.factorial

for num = 1:10
  tic
  t.factoriand = num
  t.factorial
  toc
end

handle继承后,时间大大减少。

我假设您使用的是一个值类。使用通过引用传递的(
classdef myClass
),您可以从get方法中轻松修改该类。例如,我使用您建议的方法从文件(如果尚未加载)或私有的隐藏属性加载数据

请注意,您建议的使用
lazy
从属属性的方式在某种程度上违背了使用从属属性的目的,即保证您的数据始终与派生属性的状态保持最新。每次更改其他属性时,懒惰属性都会过时


您可以(应该)向所有其他属性添加一个set方法,将私有属性设置为空(
isempty(obj.myPrivateProperty)
是您需要知道是否必须计算的“逻辑标志”)。但是,如果您这样做,为什么不让set方法调用一些更新方法来立即更新/重新计算所有“相关”属性呢?

我还喜欢在我关心的属性上使用isempty而不是额外的私有属性,这样可以减少混乱。谢谢。如果不做一些假设(此处,空值在此处无效),则无法将显式标志替换为基于该值的隐式标志。2.让set方法更新“dependent”属性可能并不总是合适的,尤其是如果后者的计算成本很高并且依赖于两个或多个其他属性。因此,在一般情况下,我仍然会使用额外的标志。