2011-02-10 16 views
9

私は依存するいくつかのプロパティを持つクラスを持っていますが、実際には一度だけ計算したいと思っています。依存プロパティのMATLABレイジー評価

私は、MATLABの依存クラスプロパティで遅延評価を使用することは不可能か、悪い考えであると結論付けました。元の計画は、更新が必要な各(パブリック)プロパティに対してプライベート論理フラグを設定し、コンストラクタにそれをtrueに設定させることでした。次に、プロパティアクセサが呼び出されたときには、そのフラグをチェックして値を計算し、必要に応じて(別のプライベートプロパティに)格納します。フラグがfalseの場合、単にキャッシュされた値のコピーを返します。

私は難しいのは、プロパティアクセサーの制約にあると考えています。つまり、他の無関係のプロパティだけを残していると思います。つまり、get.property(self)メソッドは自己オブジェクトの状態を変更できません。興味深いことに、これは現在のクラスでは黙って失敗します。 (つまり、更新フラグもキャッシュされた計算結果もgetメソッドで設定されないので、毎回高価な計算が実行されます)。

私の疑念は、レイジープロパティをパブリック依存プロパティからパブリックGetAccessを持つメソッドに変更するが、プライベートSetAccessを変更すると疑わしいです。しかし、私はこのように財産条約を偽装する必要はありません。私は、このすべてを私のために行うことができるただの "怠惰な"属性属性があったらいいと思う。

明らかなものがありませんか? MATLABの従属クラスプロパティのアクセサメソッドは、クラスインスタンスの状態を変更することを禁じられていますか?もしそうなら、プライベートな副作用を持つアクセサーには、私が望む振る舞いを得るための最も悪い方法が何であるかを定義していますか?

編集:handleから継承した後

close all; clear classes; clc 

t = LazyTest(3) 
t.factorial 

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

とここ

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 

...テストクラスの実行には時間が大幅に低下します。

答えて

11

あなたは値クラスを使用していると仮定します。参照渡しのhandle classclassdef myClass < handle)を使用すると、getメソッド内からクラスを簡単に変更できます。たとえば、ファイル(まだロードされていない場合)または非公開の隠しプロパティからデータをロードするために提案したものを使用します。

lazy依存プロパティを使用すると、従属プロパティを使用する目的をいくぶん捨てることができます。つまり、データが常に最新の状態であることを保証します。他のプロパティを変更するたびに、遅延プロパティが古くなります。

プライベートプロパティを空に設定する他のすべてのプロパティにsetメソッドを追加できます(計算する必要があるかどうかを知る必要がある「論理フラグ」です)。しかし、そうするならば、set-methodsがすべての "依存する"プロパティをすぐに更新/再計算する更新メソッドを呼び出さないようにするのはなぜですか?

+0

これはやっているようです。 –

+1

私は、余分なプライベートプロパティと比べて、私が気にしているものに対して、isemptyを使用することの混乱を軽減することも好きです。ありがとう。 –

+1

1.明示的なフラグを値に基づく暗黙的なフラグで置き換えることはできません(ここでは、空の値はここでは無効です)。 2. setメソッドが "依存する"プロパティespを更新することは常に適切であるとは限りません。後で計算するのに費用がかかり、2つ以上の他の特性に依存する場合。したがって、一般的なケースでは私はまだ余分なフラグを持っています。 – user1735003

関連する問題