OOP: lazy dependent property
3 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
In a class, I have a dependent property that's expensive to calculate. It only depends on one other property, call it "value" in the class, so I'm trying to prevent it from re-calculating unless value changes.
The snippet below works, but it shows a warning about setting the property value for lazy in the set method for value. Is there a better way to do this?
classdef MyClass < handle
properties
value;
end
properties (Dependent)
output;
end
properties (Access = private)
lazy = false;
cachedOutput;
end
methods
function obj = MyClass(value)
obj.value = value;
end
function set.value(obj, value)
obj.lazy = false; % warning here
obj.value = value;
end
function res = get.output(obj)
if obj.lazy
res = obj.cachedOutput;
else
res = expensive_function(obj.value);
obj.cachedOutput = res;
obj.lazy = true;
end
end
end
end
function res = expensive_function(value)
res = value + 1;
end
0 commentaires
Réponse acceptée
per isakson
le 16 Mai 2013
Modifié(e) : per isakson
le 16 Mai 2013
I've seen a recommendation to use persistent variables in expensive_function
function res = expensive_function(value)
persistent old_value old_res
if not( isempty( old_value ) ) && value == old_value
res = old_res;
else
res = value + 1;
old_res = res;
old_value = value;
end
end
whether it is better I don't know.
4 commentaires
per isakson
le 17 Mai 2013
I seldom use dependent properties. They used to cause me problems when coding and debugging. That was because the get-method was called by display and tooltip functions. An error in the get-method tended to produce mess.
I prefer not to include expensive_function in the get-method. A few reasons:
- I want to keep the get-method as simple as possible
- A separate expensive_function is easier to test.
- Given that expensive_function is expensive the time to call an extra function is negligible
- I don't understand the oop-argument not to use ordinary functions together with classes.
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Handle Classes dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!