Principles of Object-Oriented Design