
We run a hotel, and sometimes we have a quandry when it comes to room changeover.
Scenario: John Smith checks out of room 4 at 8 a.m. on Thursday, and looking at our booking system, we see that the room's not been booked out again until Saturday evening, as a twin room, for Deborah Williams and Nancy Walker who are coming to Melksham to attend a WRAF reunion that evening at Melksham Assembly hall.
Quandry: Do we remake bedroom 4 into a lettable double room as soon as John checks out (a double is its most common configuration), or do we leave it unmade and prepare it just-in-time for use on Saturday? By making it up straight away, we run the risk of generating needless work for ourselves. But by leaving it, we run the risk of turning away "walk in" business if people show up at the door looking for a room that's immediately available for them.
The same quandry applies when you're programming using objects. When you
construct an object, you'll typically store a number of data values (commonly known as properties or attributes) concerning the object, and later on you'll want to extract information / results based on that data. The quandry -
Do you calculate the various results / extra information as you store the data, or do you wait until it's required later on?
The initial answer to this quandry is to take a look at the
metrics of the likely use of the objects. If you're going to be creating thousands of objects, but only calling back for a few results from a small number of them, you'll want to
wait until the answers are required. But on the other hand, if you're likely to create just a few objects, and then keep calling up the same results many times over, you should
calculate as the objects are set up if you want to be efficient.
This initial answer is, however, simplistic. In reallity you won't know which way the balance will tip - especially if your class is going to be used by multiple applications - and the initial attribute values may get changed during the lifetime of an object, rendering the results of the calculations out-of-date (i.e. wrong) if you did them early. A good solution to this is a
caching deign pattern.
A caching design pattern works like this:
1. As you create (construct) your object, you set a property that we'll call "cached" to 0 or false, and you do NOT do any result calculations.
2. When you call up a result later on through an accessor, you check if the cached value is 0 / false
• if it IS zero, you do the calculations, store the results into further variables in the object and set cached to 1 / true
• if it is 1, you simply return the values that were previously stored.
The caching design pattern has the further advantage that you can simply set the cached value to 0 / false if you change an attribute value during the life of the object, thus forcing a recalculation next time a result is called for. It've very neat and efficient.
Here's an example in PHP ... the constructor:
function __construct($name,$age,$factor,$breed) {
$this->name = $name;
$this->years = $age;
this->factor = $factor;
$this->breed = $breed;
$this->cached = 0;
}
and an accessor:
function geteffage() {
if (! $this->cached) {
$this->effing = $age * $factor;
$this->cached = 1;
}
return $this->effing;
}
Full source code of this example:
[here]. Picture illustration this article - bedroom 4 at
Well House Manor, which is open for public bookings if you fance a weekend away in Wiltshire
(written 2012-08-20, updated 2012-08-25)
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
Q908 - Object Orientation and General technical topics - Object Orientation: Design Patterns [485] North, Norther and Northest - PHP 5 Objects - (2005-11-04)
[1224] Object Relation Mapping (ORM) - (2007-06-09)
[2322] Looking for a practical standards course - (2009-08-05)
[2741] What is a factory? - (2010-04-26)
[2977] What is a factory method and why use one? - Example in Ruby - (2010-09-30)
[3608] Design Patterns - what are they? Why use them? - (2012-02-12)
[3716] Learning C++ - a design pattern for your first class - (2012-05-02)
[3810] Reading files, and using factories to create vectors of objects from the data in C++ - (2012-07-21)
[4021] Spike solution, refactored and reusable, Python - Example - (2013-02-28)
[4096] Perl design patterns example - (2013-05-20)
[4098] Using object orientation for non-physical objects - (2013-05-22)
[4325] Learning to program - what are algorithms and design patterns? - (2014-11-22)
[4330] Java - factory method, encapsulation, hashmap example - (2014-11-27)
[4356] Object factories in C++, Python, PHP and Perl - (2014-12-19)
[4359] How to avoid too many recalculations within an object - (2014-12-21)
[4377] Designing a base class and subclasses, and their extension, in C++ - (2015-01-01)
[4396] Java Utility class - flexible replacement for array. Also cacheing in objects and multiple catch clauses example. - (2015-01-16)
[4421] How healthy are the stars of stage and screen? - (2015-02-09)
[4581] Thin application, thick objects - keep you main code simple. Example in Ruby - (2015-11-21)
[4626] Singleton design pattern - examples and uses - (2016-01-20)
[4663] Easy data to object mapping (csv and Python) - (2016-03-24)
[4673] Separating detailed data code from the main application - Ruby example - (2016-05-16)
H108 - Objects in PHP [67] Object Oriented Programming in PHP - (2004-09-29)
[124] PHP v Java - (2004-11-20)
[205] PHP5 lets you say no - (2005-02-07)
[343] Should I use structured or object oriented? - (2005-06-10)
[421] Don't repeat code - use loops or functions - (2005-08-21)
[656] Think about your design even if you don't use full UML - (2006-03-24)
[720] Planning a hotel refurb - an example of a Gant chart in PHP - (2006-05-14)
[836] Build on what you already have with OO - (2006-08-17)
[1027] Cue the music, I'm happy. - (2007-01-09)
[1153] Object Oriented Model - a summary of changes from PHP4 to PHP5 - (2007-04-18)
[1217] What are factory and singleton classes? - (2007-06-04)
[1535] OO PHP demonstration - comparing objects and more - (2008-02-08)
[1682] Accounts in PHP - an OO demo - (2008-06-19)
[1819] Calling base class constructors - (2008-10-03)
[1820] Sorting objects in PHP - (2008-10-04)
[1925] Introduction to Object Oriented Programming - (2008-12-06)
[2160] PHP - getclass v instanceof - (2009-05-07)
[2169] When should I use OO techniques? - (2009-05-11)
[2171] Cleaning up redundant objects - (2009-05-11)
[2172] PHP4 v PHP5 - Object Model Difference - (2009-05-11)
[2380] Object Oriented programming - a practical design example - (2009-08-27)
[2434] Abstract classes, Interfaces, PHP and Java - (2009-10-03)
[2435] Serialization - storing and reloading objects - (2009-10-04)
[2632] Shipping a test harness with your class in PHP - (2010-02-12)
[2641] Object Oriented Programming in PHP - (2010-02-19)
[2680] Static class members in PHP - a documented example - (2010-03-16)
[2717] The Multiple Inheritance Conundrum, interfaces and mixins - (2010-04-11)
[2774] PHP - Object Oriented Design in use - (2010-05-21)
[2921] Does copying a variable duplicate the contents? - (2010-08-14)
[2922] Getting the OO design write - with PHP a example - (2010-08-14)
[3142] Private and Public - and things between - (2011-01-22)
[3210] Catchable fatal error in PHP ... How to catch, and alternative solutions such as JSON - (2011-03-22)
[3211] Computer Graphics in PHP - World (incoming data) to Pixel (screen) conversion - (2011-03-24)
[3607] Designing your application - using UML techniques - (2012-02-11)
[3609] How do classes relate to each other? Associated Classes - (2012-02-12)
[3840] Autoload in PHP - (2012-08-17)
[3841] Copying, duplicating, cloning an object in PHP - (2012-08-18)
[3953] Objects in PHP - Revision - (2012-12-16)
[4057] stdClass in PHP - using an object rather than an associative array - (2013-04-02)
[4073] Learning about Object Orientation in PHP - a new set of examples - (2013-04-28)
[4366] Changing what operators do on objects - a comparison across different programming languages - (2014-12-26)
[4627] Caching results in an object for efficiency - avoiding re-calculation - (2016-01-20)
[4628] Associative objects - one object within another. - (2016-01-20)
Some other Articles
The Accidental HotelierSigns of AutumnGood cause giving - getting the charity beggars off the streetRooms ready for guests - each time, every time, thanks to good system designCaching Design PatternsRelax at Well House Manor - gardens, fountain, hotelSpraying data from one incoming to series of outgoing files in PerlGuest review - Well House Manor, Melksham