Home Accessibility Courses Twitter The Mouth Facebook Resources Site Map About Us Contact
For 2021 - online Python 3 training - see ((here)).

Our plans were to retire in summer 2020 and see the world, but Coronavirus has lead us into a lot of lockdown programming in Python 3 and PHP 7.
We can now offer tailored online training - small groups, real tutors - works really well for groups of 4 to 14 delegates. Anywhere in the world; course language English.

Please ask about private 'maintenance' training for Python 2, Tcl, Perl, PHP, Lua, etc.
Getting the OO design write - with PHP a example

One of the great beauties of Object Oriented Design is that you can say "I want to handle a type of data that's based on an xxx", and if someone's already written (and made available) the code for an xxx, all you have do do is define the additions and differences, rather than starting from scratch. So this means that OO is great for applications where you have a whole lot of different types of thing with similar, but never the less different, behavior.

Let's say, for example, that I'm writing a whole lot of code to help Henry, who lives with his girlfriend Emma, a cat, and a whole lot of dogs, look after his dependents. Before you accuse me of being sexist, I'm sorry to have to tell you that whilst Henry is gainfully employed at the moment, Emma is between jobs as she used to work for Sun4U:

OK - glad we cleared that one up ;-) ...

So Henry has Emma, Gypsy (a lurcher), Wover, Spot (a dalmatian!), Rufus, "Oy - you", and Charlie the cat.

Now - design MATTERS - and Henry should start with a common base for shared code and build on that. In fact, he was on our recent Object Oriented Design in PHP course and went away with a class called "animal" that forms a good basis for his project. So:

• A cat is a type of animal
• A dog is a type of animal
• A girlfriend is similar to an animal
• A lurcher is a type of dog but has subtle differences
• A dalmatian is a type of dog (but behaves just like any other dog)

And from that, Henry can draw up a diagram that shows how his classes relate to each other. The black circles on this diagram show each of the classes, and the lines rising from each link to the classes that are extended from it (i.e. inherit from it). You'll note that we do not have a separate class for "dalmatian" as a dalmatian is just another dog, but we do have a separate class for a lurcher as they're vocally different to other dogs.

Having decided on the layout of the classes, Henry now needs to decide what actions he wants to be able to perform on each of his dependents. As he does so, he'll add the method names that correspond to each action into the tree, minimizing the number of times he needs to add each method. For things like "getname", he can simply refer to a piece of common code in the "animal" class. For his constructor (that's __construct in PHP), it's most efficient for him to put a common piece of code in the base class "animal", but then add in a method to override it for "girlfriend", as girlfriends are always assumed to weigh 53 kgs (the weight of a supermodel, according to Henry's on line research) and be aged 21, whereas you can be more honest with an animal. The expected lifespan of dogs (including lurchers), cats, and humans differs by species, so there's going to be a separate "geteage" or get-effective-age in the dog, cat and girlfriend classes ... and so, onwards, goes the design.

Look at the completed design, and you'll see that I have added yellow lines to show you how the various methods work when you call them up on an object of type lurcher:
• The constructor is inherited from the base animal class
• getweight, getname and olderthan also come from the base animal class
• geteage comes from the dog class ... and ...
• says is actually defined in the lurcher class (overriding the one that's in the base animal class!)

I can now write a test piece of code to see how my design stacks up - this is a sort of specification check to ensure that I've not missed anything out:
  $hounds = array(new lurcher("Gypsy",30,4),
    new dog("Wover",60,20),
    new dog("Spot",15,9),
    new girlfriend("Emma"),
    new cat("Charlie",4,12),
    new dog("Rufus",10,10),
    new dog("Oy - you",6,8));
  foreach ($hounds as $hound) {
    $called = $hound->getname();
    $heavy = $hound->getweight();
    $old = $hound->geteage();
    $sound = $hound->says();
    print ("$called weighs ${heavy}kgs, is aged $old and says $sound\n");

Having got the design worked out carefully, I can then write the class code secure in the knowledge that I won't have too many nasty surprises and changes of direction also on the way. The example code that I wrote during the course, basically translating the diagram above may be seen [here].

The output from the code above ... and, yes, I have checked it, looks as follows:
  Gypsy weighs 30kgs, is aged 28 and says [nothing]
  Wover weighs 60kgs, is aged 140 and says "moo"
  Spot weighs 15kgs, is aged 63 and says "moo"
  Emma weighs 53kgs, is aged 21 and says "Will you come shopping with me"
  Charlie weighs 4kgs, is aged 72 and says "miaow"
  Rufus weighs 10kgs, is aged 70 and says "moo"
  Oy - you weighs 6kgs, is aged 56 and says "moo"

My example code also contains the logic to find the older (of two) and the oldest (of a whole array) of animals (or objects which are subtypes of animals). There's a little more about that on a previous article [here].
(written 2010-08-14, updated 2010-08-20)

Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
Q909 - Object Orientation and General technical topics - Object Orientation: Composite Objects
  [477] Class, static and unbound variables - (2005-10-25)
  [592] NOT Gone phishing - (2006-02-05)
  [1345] Perl and Shell coding standards / costs of an IT project - (2007-09-11)
  [1348] Screw it or Glue it? Access to Object variables - a warning - (2007-09-12)
  [2170] Designing a heirarcy of classes - getting inheritance right - (2009-05-11)
  [2641] Object Oriented Programming in PHP - (2010-02-19)
  [2865] Relationships between Java classes - inheritance, packaging and others - (2010-07-10)
  [3142] Private and Public - and things between - (2011-01-22)
  [3152] Jargon busting - (2011-01-30)
  [3251] C++ - objects that are based on other objects, saving coding and adding robustness - (2011-04-17)
  [3609] How do classes relate to each other? Associated Classes - (2012-02-12)
  [3979] Extended and Associated objects - what is the difference - C++ example - (2013-01-18)
  [4377] Designing a base class and subclasses, and their extension, in C++ - (2015-01-01)
  [4394] Philosophy behind object design - and how I applied in to a Java example - (2015-01-14)
  [4450] Deciding whether to use parameters, conditional statements or subclasses - (2015-03-05)

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)
  [485] North, Norther and Northest - PHP 5 Objects - (2005-11-04)
  [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)
  [2680] Static class members in PHP - a documented example - (2010-03-16)
  [2717] The Multiple Inheritance Conundrum, interfaces and mixins - (2010-04-11)
  [2741] What is a factory? - (2010-04-26)
  [2774] PHP - Object Oriented Design in use - (2010-05-21)
  [2921] Does copying a variable duplicate the contents? - (2010-08-14)
  [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)
  [3608] Design Patterns - what are they? Why use them? - (2012-02-12)
  [3840] Autoload in PHP - (2012-08-17)
  [3841] Copying, duplicating, cloning an object in PHP - (2012-08-18)
  [3843] Caching Design Patterns - (2012-08-20)
  [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)
  [4356] Object factories in C++, Python, PHP and Perl - (2014-12-19)
  [4366] Changing what operators do on objects - a comparison across different programming languages - (2014-12-26)
  [4626] Singleton design pattern - examples and uses - (2016-01-20)
  [4627] Caching results in an object for efficiency - avoiding re-calculation - (2016-01-20)
  [4628] Associative objects - one object within another. - (2016-01-20)

Back to
Does copying a variable duplicate the contents?
Previous and next
Horse's mouth home
Forward to
Fresh air and beautiful places in Wiltshire
Some other Articles
Journey times to Melksham, Wiltshire
Well House - the pictures
Job applicants - wondering why they apply
Fresh air and beautiful places in Wiltshire
Getting the OO design write - with PHP a example
Sorting - naturally, or into a different order
London to Calne, Corsham, Melksham, Bradford-on-Avon, Chippenham by public Transport
Downloading a report from the web for further local analysis
Upload Image, Store in database, redisplay in browser. PHP and MySQL
4759 posts, page by page
Link to page ... 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96 at 50 posts per page

This is a page archived from The Horse's Mouth at http://www.wellho.net/horse/ - the diary and writings of Graham Ellis. Every attempt was made to provide current information at the time the page was written, but things do move forward in our business - new software releases, price changes, new techniques. Please check back via our main site for current courses, prices, versions, etc - any mention of a price in "The Horse's Mouth" cannot be taken as an offer to supply at that price.

Link to Ezine home page (for reading).
Link to Blogging home page (to add comments).

You can Add a comment or ranking to this page

© WELL HOUSE CONSULTANTS LTD., 2022: 48 Spa Road • Melksham, Wiltshire • United Kingdom • SN12 7NY
PH: 01144 1225 708225 • EMAIL: info@wellho.net • WEB: http://www.wellho.net • SKYPE: wellho

PAGE: http://www.wellho.net/mouth/2922_Get ... ample.html • PAGE BUILT: Sun Oct 11 16:07:41 2020 • BUILD SYSTEM: JelliaJamb