OOP: lazy dependent property

3 vues (au cours des 30 derniers jours)
Drew
Drew le 16 Mai 2013
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

Réponse acceptée

per isakson
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
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.
Sean de Wolski
Sean de Wolski le 17 Mai 2013
@Matt J, I would vote for that:
get.output

Connectez-vous pour commenter.

Plus de réponses (0)

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!

Translated by