Principles of Object Oriented Design