Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

OOP: lazy dependent property

Asked by Drew on 16 May 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

0 Comments

Drew

Products

No products are associated with this question.

1 Answer

Answer by per isakson on 16 May 2013
Edited by per isakson on 16 May 2013
Accepted answer

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 Comments

Drew on 17 May 2013

Thanks. That seems to have done the trick.

per isakson on 17 May 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 on 17 May 2013

@Matt J, I would vote for that:

get.output
per isakson

Contact us