
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)
1f59
Associated topics are indexed under
Q908 - Object Orientation and General technical topics - Object Orientation: Design Patterns [4096] Perl design patterns example - (2013-05-20)
[4021] Spike solution, refactored and reusable, Python - Example - (2013-02-28)
[3810] Reading files, and using factories to create vectors of objects from the data in C++ - (2012-07-21)
[3716] Learning C++ - a design pattern for your first class - (2012-05-02)
[3608] Design Patterns - what are they? Why use them? - (2012-02-12)
[2977] What is a factory method and why use one? - Example in Ruby - (2010-09-30)
[2741] What is a factory? - (2010-04-26)
[2322] Looking for a practical standards course - (2009-08-05)
[1224] Object Relation Mapping (ORM) - (2007-06-09)
[485] North, Norther and Northest - PHP 5 Objects - (2005-11-04)
H108 - Objects in PHP [4073] Learning about Object Orientation in PHP - a new set of examples - (2013-04-28)
[4057] stdClass in PHP - using an object rather than an associative array - (2013-04-02)
[3953] Objects in PHP - Revision - (2012-12-16)
[3841] Copying, duplicating, cloning an object in PHP - (2012-08-18)
[3840] Autoload in PHP - (2012-08-17)
[3609] How do classes relate to each other? Associated Classes - (2012-02-12)
[3607] Designing your application - using UML techniques - (2012-02-11)
[3211] Computer Graphics in PHP - World (incoming data) to Pixel (screen) conversion - (2011-03-24)
[3210] Catchable fatal error in PHP ... How to catch, and alternative solutions such as JSON - (2011-03-22)
[3142] Private and Public - and things between - (2011-01-22)
[2922] Getting the OO design write - with PHP a example - (2010-08-14)
[2921] Does copying a variable duplicate the contents? - (2010-08-14)
[2774] PHP - Object Oriented Design in use - (2010-05-21)
[2717] The Multiple Inheritance Conundrum, interfaces and mixins - (2010-04-11)
[2680] Static class members in PHP - a documented example - (2010-03-16)
[2641] Object Oriented Programming in PHP - (2010-02-19)
[2632] Shipping a test harness with your class in PHP - (2010-02-12)
[2435] Serialization - storing and reloading objects - (2009-10-04)
[2434] Abstract classes, Interfaces, PHP and Java - (2009-10-03)
[2380] Object Oriented programming - a practical design example - (2009-08-27)
[2172] PHP4 v PHP5 - Object Model Difference - (2009-05-11)
[2171] Cleaning up redundant objects - (2009-05-11)
[2169] When should I use OO techniques? - (2009-05-11)
[2160] PHP - getclass v instanceof - (2009-05-07)
[1925] Introduction to Object Oriented Programming - (2008-12-06)
[1820] Sorting objects in PHP - (2008-10-04)
[1819] Calling base class constructors - (2008-10-03)
[1682] Accounts in PHP - an OO demo - (2008-06-19)
[1535] OO PHP demonstration - comparing objects and more - (2008-02-08)
[1217] What are factory and singleton classes? - (2007-06-04)
[1153] Object Oriented Model - a summary of changes from PHP4 to PHP5 - (2007-04-18)
[1027] Cue the music, I'm happy. - (2007-01-09)
[836] Build on what you already have with OO - (2006-08-17)
[720] Planning a hotel refurb - an example of a Gant chart in PHP - (2006-05-14)
[656] Think about your design even if you don't use full UML - (2006-03-24)
[421] Don't repeat code - use loops or functions - (2005-08-21)
[343] Should I use structured or object oriented? - (2005-06-10)
[205] PHP5 lets you say no - (2005-02-07)
[124] PHP v Java - (2004-11-20)
[67] Object Oriented Programming in PHP - (2004-09-29)
3079
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