Home Accessibility Courses Twitter The Mouth Facebook Resources Site Map About Us Contact
 
Python and Tcl - public course schedule [here]
Private courses on your site - see [here]
Please ask about maintenance training for Perl, PHP, Lua, etc
 
Test driven development, and class design, from first principles (using C++)

I'm teaching OO / class design from first principles today ... in stages. The chosen source language is C++, but the principles are well applied across other OO languages too.

Stage 1 - write your test program to make sure it works for your customers want to do. Remember that the "customer is king" and that's why you're doing the job! Try to ensure that you have calls available to do everything your customer will want, and create multiple objects with different values in them to ensure you are really storing object and not class (static) variables correctly. [source]

Stage 2 - define the API (Application Progammer interface) to ensure the test compiles and your interface is clearly defined. [source]

Stage 3 - write the code of the class to implement the public members. This is the stage at which you'll be writing the detailed code that will be used by your customers later on - you'll be encapsulating the algorithms in object methods so the customer won't have to be concerned later with the internal detail. Also at stage 3, you'll probably find yourself adding extra (private and / or protected) members to your API. [source]

Stage 4 - get the code to report on whether the test program worked. The code at stage 1 probably (should have!) output results, but manual checking of those to make sure they're still right at a later date will be tedious, so you'll code tests into your test harness to give a clear "worked / failed" flag. [source]

Stage 5 - use functions to avoid stage 4 being very repetitive indeed! [source] and at this stage I also added a further accessor to demonstrate passing stings in and out - which meant an extra test routine too. [source]
Stage 6 - the test evaluation code will itself become a standard object. Stages 5 and 6 can be combined once you're familiar with OO principles, but an object that checks other objects (and a singleton pattern to boot) may be one step too many all at once if you're moving from a structured programming background. [source]

Stage 7 - separate the various pieces into different files so you can use the class without the tests in a real, live application! If you've done a good job of your test suite object, you'll want to package that up separately too so that you can reuse it for other classes and make steps 4 5 and 6 much easier in the future. In this final example of the series, I have also added command line options to allow the test program to be run to print results, to print test output, or to do both.

Source for the final example
[here] for the test program
[here] for the class being tested
[here] for its header file
[here] for the test pattern class
[here] for its header file

Here are the build instructions I used

  g++ -c Hotel007.cpp
  g++ -c HotelRoomBooking.cpp
  g++ -c TestPattern.cpp
  g++ -o Hotel Hotel007.o HotelRoomBooking.o TestPattern.o


And here are some sample outputs:

  munchkin:cpp_dec14 grahamellis$ ./Hotel
  Hotel Rooms Demo
  John Smith 360 60
  Tinka Belle 883.5 147.25
  ------------------------------
  Testing ++++++
  Tests passed 6; tests failed 0


  munchkin:cpp_dec14 grahamellis$ ./Hotel -v
  Hotel Rooms Demo
  John Smith 360 60
  Tinka Belle 883.5 147.25


  munchkin:cpp_dec14 grahamellis$ ./Hotel -t
  ------------------------------
  Testing ++++++
  Tests passed 6; tests failed 0


The fundamentals shown above will work for just about any language, and be a starting point for just about any classes - indeed you are welcome (with the proviso that it's at your risk) to make use of my test harness and to extend it. In practise, what I'm showing you is all the complex setup stuff and I'm not making particularly full use of it by supporting and testing a lot of methods - but such is a training example that my code has made the points needed already.
(written 2014-12-30)

 
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
Q907 - Object Orientation and General technical topics - Object Orientation: Design Techniques
  [4628] Associative objects - one object within another. - (2016-01-20)
  [4449] Spike solution, refactoring into encapsulated object methods - good design practise - (2015-03-05)
  [4430] The spirit of Java - delegating to classes - (2015-02-18)
  [4098] Using object orientation for non-physical objects - (2013-05-22)
  [3978] Teaching OO - how to avoid lots of window switching early on - (2013-01-17)
  [3928] Storing your intermediate data - what format should you you choose? - (2012-11-20)
  [3887] Inheritance, Composition and Associated objects - when to use which - Python example - (2012-10-10)
  [3878] From Structured to Object Oriented Programming. - (2012-10-02)
  [3844] Rooms ready for guests - each time, every time, thanks to good system design - (2012-08-20)
  [3798] When you should use Object Orientation even in a short program - Python example - (2012-07-06)
  [3763] Spike solutions and refactoring - a Python example - (2012-06-13)
  [3760] Why you should use objects even for short data manipulation programs in Ruby - (2012-06-10)
  [3607] Designing your application - using UML techniques - (2012-02-11)
  [3454] Your PHP website - how to factor and refactor to reduce growing pains - (2011-09-24)
  [3260] Ruby - a training example that puts many language elements together to demonstrate the whole - (2011-04-23)
  [3085] Object Oriented Programming for Structured Programmers - conversion training - (2010-12-14)
  [3063] Comments in and on Perl - a case for extreme OO programming - (2010-11-21)
  [2977] What is a factory method and why use one? - Example in Ruby - (2010-09-30)
  [2953] Turning an exercise into the real thing with extreme programming - (2010-09-11)
  [2889] Should Python classes each be in their own file? - (2010-07-27)
  [2878] Program for reliability and efficiency - do not duplicate, but rather share and re-use - (2010-07-19)
  [2865] Relationships between Java classes - inheritance, packaging and others - (2010-07-10)
  [2785] The Light bulb moment when people see how Object Orientation works in real use - (2010-05-28)
  [2747] Containment, Associative Objects, Inheritance, packages and modules - (2010-04-30)
  [2741] What is a factory? - (2010-04-26)
  [2717] The Multiple Inheritance Conundrum, interfaces and mixins - (2010-04-11)
  [2523] Plan your application before you start - (2009-12-02)
  [2501] Simples - (2009-11-12)
  [2380] Object Oriented programming - a practical design example - (2009-08-27)
  [2327] Planning! - (2009-08-08)
  [2170] Designing a heirarcy of classes - getting inheritance right - (2009-05-11)
  [2169] When should I use OO techniques? - (2009-05-11)
  [1538] Teaching Object Oriented Java with Students and Ice Cream - (2008-02-12)
  [1528] Object Oriented Tcl - (2008-02-02)
  [1435] Object Oriented Programming in Perl - Course - (2007-11-18)
  [1224] Object Relation Mapping (ORM) - (2007-06-09)
  [1217] What are factory and singleton classes? - (2007-06-04)
  [1047] Maintainable code - some positive advice - (2007-01-21)
  [836] Build on what you already have with OO - (2006-08-17)
  [831] Comparison of Object Oriented Philosophy - Python, Java, C++, Perl - (2006-08-13)
  [747] The Fag Packet Design Methodology - (2006-06-06)
  [656] Think about your design even if you don't use full UML - (2006-03-24)
  [534] Design - one name, one action - (2005-12-19)
  [507] Introduction to Object Oriented Programming - (2005-11-27)
  [236] Tapping in on resources - (2005-03-05)
  [80] OO - real benefits - (2004-10-09)

C239 - C and C based languages - Putting it all together
  [4559] When do I use the this keyword in C++? - (2015-10-29)
  [4326] Learning to program - comments, documentation and test code - (2014-11-22)
  [3810] Reading files, and using factories to create vectors of objects from the data in C++ - (2012-07-21)
  [3252] C++ - unknown array size, unknown object type. Help! - (2011-04-17)
  [3069] Strings, Garbage Collection and Variable Scope in C++ - (2010-11-25)
  [3067] Using C and C++ functions in the same program - how to do it - (2010-11-24)
  [2851] Further C++ material - view new or old - (2010-07-04)
  [2674] Make and makefiles - a commented example to help you learn - (2010-03-12)
  [2673] Multiple Inheritance in C++ - a complete example - (2010-03-12)
  [2646] Compile but do not run PHP - syntax check only - (2010-02-22)
  [1181] Good Programming practise - where to initialise variables - (2007-05-09)
  [945] Code quality counts - (2006-11-26)
  [925] C++ - just beyond the basics. More you can do - (2006-11-14)

Q456 - Object Orientation and General technical topics - Test Driven Development and Behaviour Driven Development
  [4652] Testing new algorithms in PHP - (2016-02-20)
  [4634] Regression testing - via a very short C testing framework - (2016-01-29)
  [4542] The principle of mocking - and the Python Mock package - (2015-10-17)
  [4457] Test framework for TCL - Tcltest - some examples - (2015-03-11)
  [4387] Regression Testing my website - Cucumber and Watir - (2015-01-07)
  [4380] Behaviour Driven Development / Ruby and Cucumber - (2015-01-02)
  [4346] A behaviour driven example of writing a Java program - (2014-12-09)
  [4336] Test Driven Development - a first example of principle in C - (2014-12-01)


Back to
A long and disappointing evening
Previous and next
or
Horse's mouth home
Forward to
Final examples for 2014 - and a look at our 2015 training course options
Some other Articles
What FGW passengers want to talk about / and PHP programming to find out
Designing a base class and subclasses, and their extension, in C++
Well House Consultants, Well House Manor, First Great Western Coffee shop, TransWilts / 2014 web site reports
Final examples for 2014 - and a look at our 2015 training course options
Test driven development, and class design, from first principles (using C++)
A long and disappointing evening
Template / design pattern for C++ constructor and accessors
Why are people using the TransWilts?
Conditionals, loops and methods in Ruby - a primer with simple examples
Ruby - the second rung of learning the language
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., 2019: 404 The Spa • Melksham, Wiltshire • United Kingdom • SN12 6QL
PH: 01225 708225 • EMAIL: info@wellho.net • WEB: http://www.wellho.net • SKYPE: wellho

PAGE: http://www.wellho.net/mouth/4374_Tes ... ng-C-.html • PAGE BUILT: Sat May 27 16:49:10 2017 • BUILD SYSTEM: WomanWithCat