Principles of Software Construction in Object-Oriented Programming