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
Q456 - Object Orientation and General technical topics - Test Driven Development and Behaviour Driven Development [4326] Learning to program - comments, documentation and test code - (2014-11-22)
[4336] Test Driven Development - a first example of principle in C - (2014-12-01)
[4346] A behaviour driven example of writing a Java program - (2014-12-09)
[4380] Behaviour Driven Development / Ruby and Cucumber - (2015-01-02)
[4387] Regression Testing my website - Cucumber and Watir - (2015-01-07)
[4457] Test framework for TCL - Tcltest - some examples - (2015-03-11)
[4542] The principle of mocking - and the Python Mock package - (2015-10-17)
[4634] Regression testing - via a very short C testing framework - (2016-01-29)
[4652] Testing new algorithms in PHP - (2016-02-20)
C239 - C and C based languages - Putting it all together [836] Build on what you already have with OO - (2006-08-17)
[925] C++ - just beyond the basics. More you can do - (2006-11-14)
[945] Code quality counts - (2006-11-26)
[1181] Good Programming practise - where to initialise variables - (2007-05-09)
[2646] Compile but do not run PHP - syntax check only - (2010-02-22)
[2673] Multiple Inheritance in C++ - a complete example - (2010-03-12)
[2674] Make and makefiles - a commented example to help you learn - (2010-03-12)
[2851] Further C++ material - view new or old - (2010-07-04)
[3067] Using C and C++ functions in the same program - how to do it - (2010-11-24)
[3069] Strings, Garbage Collection and Variable Scope in C++ - (2010-11-25)
[3252] C++ - unknown array size, unknown object type. Help! - (2011-04-17)
[3810] Reading files, and using factories to create vectors of objects from the data in C++ - (2012-07-21)
[4559] When do I use the this keyword in C++? - (2015-10-29)
Q907 - Object Orientation and General technical topics - Object Orientation: Design Techniques [80] OO - real benefits - (2004-10-09)
[236] Tapping in on resources - (2005-03-05)
[507] Introduction to Object Oriented Programming - (2005-11-27)
[534] Design - one name, one action - (2005-12-19)
[656] Think about your design even if you don't use full UML - (2006-03-24)
[747] The Fag Packet Design Methodology - (2006-06-06)
[831] Comparison of Object Oriented Philosophy - Python, Java, C++, Perl - (2006-08-13)
[1047] Maintainable code - some positive advice - (2007-01-21)
[1217] What are factory and singleton classes? - (2007-06-04)
[1224] Object Relation Mapping (ORM) - (2007-06-09)
[1435] Object Oriented Programming in Perl - Course - (2007-11-18)
[1528] Object Oriented Tcl - (2008-02-02)
[1538] Teaching Object Oriented Java with Students and Ice Cream - (2008-02-12)
[2169] When should I use OO techniques? - (2009-05-11)
[2170] Designing a heirarcy of classes - getting inheritance right - (2009-05-11)
[2327] Planning! - (2009-08-08)
[2380] Object Oriented programming - a practical design example - (2009-08-27)
[2501] Simples - (2009-11-12)
[2523] Plan your application before you start - (2009-12-02)
[2717] The Multiple Inheritance Conundrum, interfaces and mixins - (2010-04-11)
[2741] What is a factory? - (2010-04-26)
[2747] Containment, Associative Objects, Inheritance, packages and modules - (2010-04-30)
[2785] The Light bulb moment when people see how Object Orientation works in real use - (2010-05-28)
[2865] Relationships between Java classes - inheritance, packaging and others - (2010-07-10)
[2878] Program for reliability and efficiency - do not duplicate, but rather share and re-use - (2010-07-19)
[2889] Should Python classes each be in their own file? - (2010-07-27)
[2953] Turning an exercise into the real thing with extreme programming - (2010-09-11)
[2977] What is a factory method and why use one? - Example in Ruby - (2010-09-30)
[3063] Comments in and on Perl - a case for extreme OO programming - (2010-11-21)
[3085] Object Oriented Programming for Structured Programmers - conversion training - (2010-12-14)
[3260] Ruby - a training example that puts many language elements together to demonstrate the whole - (2011-04-23)
[3454] Your PHP website - how to factor and refactor to reduce growing pains - (2011-09-24)
[3607] Designing your application - using UML techniques - (2012-02-11)
[3760] Why you should use objects even for short data manipulation programs in Ruby - (2012-06-10)
[3763] Spike solutions and refactoring - a Python example - (2012-06-13)
[3798] When you should use Object Orientation even in a short program - Python example - (2012-07-06)
[3844] Rooms ready for guests - each time, every time, thanks to good system design - (2012-08-20)
[3878] From Structured to Object Oriented Programming. - (2012-10-02)
[3887] Inheritance, Composition and Associated objects - when to use which - Python example - (2012-10-10)
[3928] Storing your intermediate data - what format should you you choose? - (2012-11-20)
[3978] Teaching OO - how to avoid lots of window switching early on - (2013-01-17)
[4098] Using object orientation for non-physical objects - (2013-05-22)
[4430] The spirit of Java - delegating to classes - (2015-02-18)
[4449] Spike solution, refactoring into encapsulated object methods - good design practise - (2015-03-05)
[4628] Associative objects - one object within another. - (2016-01-20)
Some other Articles
What FGW passengers want to talk about / and PHP programming to find outDesigning 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 reportsFinal examples for 2014 - and a look at our 2015 training course optionsTest driven development, and class design, from first principles (using C++)A long and disappointing eveningTemplate / design pattern for C++ constructor and accessorsWhy are people using the TransWilts?Conditionals, loops and methods in Ruby - a primer with simple examplesRuby - the second rung of learning the language